@@ -982,7 +982,7 @@ F: doc/guides/nics/sfc_efx.rst
F: doc/guides/nics/features/sfc.ini
Linkdata sxe
-M: Jie Liu <liujie5@linkdatatechnology.com>
+M: Jie Li <lijie@linkdatatechnology.com>
F: drivers/net/sxe/
F: doc/guides/nics/sxe.rst
F: doc/guides/nics/features/sxe*.ini
@@ -35,6 +35,7 @@ VLAN offload = P
QinQ offload = P
L3 checksum offload = P
L4 checksum offload = P
+MACsec offload = P
Inner L3 checksum = P
Inner L4 checksum = P
Packet type parsing = Y
new file mode 100644
GIT binary patch
literal 196888
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ℑc$l+%~lhy}>lTY>hf$
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%0D2DmQV07XtxhKqm_5JO`x>Mxz<YX<b
zADP9(qjmAf_BzkmP`QB-hO_>4ek6o{U;H;?`(M+YTC^g+nXZQD*Fb3<&^!c#?{(YB
zcq$_p>RTs%eGci!ye~zgbi@llu37_rB)(D1b?wyXAyGUfmd~OG+f{_HNG$QAYaP;(
z-4~@Ckyc}9<rSFa#AC=kFq8Wk*fBM1V}Qo>*(T`$)#xIr0u)Ot*0<gO|DUr{Bn5vv
ztDlMU$aquPbir^*N=4^NmFq!qRMf9uOq3A&Sgz*`UDRbU6;?$pyoE}t(mPp!0@wg-
zMzO(k49Du4jG7~@gCxH$XF=yf!`YKzXy9WOlL2U!JWUN-6Kny4Y{>>Bm;zusG!peg
z?Ma%3^C@2FAwfhVEQsY&ctmY2Gu>qO&<h!+m}<f|85u^lD<jVZfHPskOjCqWzYs?K
z=+NNk5nL7PdXzEiv*s!^KPRVXt?F*OicL4e>r<;n&Vr;XwdTp#5D-<etECd|;mA;W
zlR32vVM4D#%TQJ&(3Oh`Jw9N;$b1Cin3hKjQ3n7)VNl~2bm7DoVZJnj$lrrdQIyyN
z=>&iwoTxW0W!aD#Ch>4SNct042j)1C_l<r?C)klNu7ZGgC3zE%gaT8wN*%zr>Gg-`
z2Nm{`K}*XvE}>za5EiERHcah==qmGn6VdPlrlfkXwYt}BAlrlfu%DP)Es~Q|4YZBB
zD;=cMmzK_=w_?XBj+*2z*;631p61C?Baxsko0uRIfEaujyV2{hnPQ9X-wS{G;PNn`
z(GM;Sq_Mb9A=IB}<{xD7Q(l(OC1e?E9<4|peXv}SmvjJFx|1!sT?;M0#i}xKRAIRg
zGQr?P5B@QK84bI`@suO2tLZBYrHdqo^~3NSd-z3D^p=E%amRe+Jy#@Fpeef8W0d<e
zjV5X`7+03Lvct^Jqhy>2Zo_yWOESv?G2`Xcd7)j;Wi4FvRyQZusl;N0{Sfl;K~EVG
z6)as)M&7q?h;V;vCLTrDS^J(nbQwkp%3PFzn*ls1mP(%cqx4mH3GEksWz%;}cAAQm
z+H5{jiZfGbCXg;yX?CO0rD>K{b(>+G)m_C;D-lLziTb$NBV~3O^=Ewd-%(d7#m{6q
z!^5(I?;_7!h(_}*9i7&-y><NEQ0<gM^&BF{)(<d!h6O~B{`mTHi3WI9^rl^lY<TuH
zQV#Da^@DjzL2Ya;b&hWOk5Q<)nTnuq-mHAv<jmD<g~>;T65HB~K@GNg?Otiidp?sj
zQ(}ii&QfZ@En^dF>N)nnw>|R|7dx4L@&x`<8{M4+@|#o&!@?A@AbEsVUjV)N^UsL0
zCjq}yKjPG0G6}s5tsKcpKS06lSKIqX0d9{)Z1YB0gNl4zH5#GE*qCNzSw>C8*+4@E
z!IqWRYBf?*vJWPf{qaX3REt+argqITD(b#OTV%9bqjq;t&Nja=?^_HRQ!+pn1<g(+
zVrbO9=xx^h+o|61)wYcO3`k{Yxz?UqiBG&Y*Z%X5?CRCz8#gqI+;tkLZa^i(3JTmv
zVNzY)$?RhvJPBpWT9T3^(-Vfvt#7DnvcY+}u?RS89&mJPk0L2E<v_J&K$T+;=u_Ux
z4pAghwvm!ch!uyx5}(q#1uP~lGZF80EpQ}<_v^p&UO`peH@aCe0Q)Mt<zIKTT?*_7
znNa2~w#2Rc|1AGc_RYI%7tn0~&!-!YpKQ4PpHDZ|zWaaP$LAjWKfjXiCLy!eZ_;=z
ztKQDFGrOyf>+hQC+j0ZV^!N<-6ngG<=5r7YI^|M==HiaIfnZF2mr{1>oD5n?Z#*3q
zbp|aM2a<<WG%nQiI{hs1JRA3VgK?`<*rBz5+jvtdC~ImYAkh0GI8Bm?XSxS{`(bB_
zxi%LJab*<@`Qv8z>mvRL<_ONx-e|^1boU{q?66LI+h+&O_^^2fnu@h2jw3J#Wv>tF
zM<B|sZKPi9?VQH+HuAh|Y#-L?H8>DI5%p7LAS;R}5k+Md0qYHbg~eJZar~y<fB>Bp
zW#b|k##!PfOXzfG?Rd~1N*-AK-U7B~b#yLxgllQEAv(qU#k=*>ohrZWkCaKrQR;1L
z(7%xH8*lLqmDxVne|1#lfI<bKOTHv@O%HTfXx6<jIuXU7pVRs)*+VkVC}NCH1?Lo`
zGaP%|P$hWk6|_rICOWq_6I#e2V*hBr8SkAP?ZnN-_D;QwoTcCg8rRWqEcO)XyQNOs
zr_Y{VL&4SIhZrk7R0@v6zXAR<PEX^#gY8#7M<VE)ZVH*8LKGZGVtYyYp^Wah!VDAv
zvcm>CxE~yE?_#g7w@+Vd#r+{%vGXOIGcr(d$pGv$3J$(*n<*Lh=cfLP2O(-l!w+WD
zp!S+YLP)rb9(3frrV~kBkf}|>>oC_!T?}Nm+iQujKu-Ax0~$qmnHu3x)H?g49f?tb
zmB)>Zg)!=p*@qGNNVP3#FODuhtx<9<+OZ-GWm)ds%6zUAxMGu%-8C9xuv|ADNh@J~
z4Pna=SS2L;{h;s`ZlP_@I%3nYP&`5tDOLzzMgR;oF#D3GgoI!umPUi|cmi5yL@b^I
z`HUw?n{ug%n)N0?^#`q4S7}hW57Kbk(4`#nwoKPbAVgp#Fz!X;^Q6@Wk8VJGoyMhw
z8%FM8+QfRYj0h6O3<gaPjqNP6s!~jeZjy+emjgRjG^J)yhLBr@d4Q|fRkZCPXnOr~
zF$+s(z8m8$)NpVIK{p`RlP#}ZbxZ#0+7vNku;iOX1_nU2Ajd6sxFs*}#K)OHopSNm
zH!InjUu_kMPSV}9oPpZ<t^-OVnI=+RjYwy99rvcKVb?uSxk9^l5ziw2_NBCUOC|1L
z6%T?fgm2S$n#|#-QLt{Bc$<m=4!aA8?+%3S6zu2e?kOJF9Bza!+8%P_RcRE%zd4`@
z++niTt?xMZ8bl^5eTWb|A_Rz$115Isfxr;~>2vA-i&?FMryFP(#5h4(0Ypotn7^hC
zDG~)^HB%&}*G4i6k5RE^QVu)W2TUv`G?7zD5hfJTl5nBLj81${_@Z%Tb5Tr95q2M{
zIw)wNC$pS}G-5~qyAYlqI2af(g;!4zRjKYZ=SIx$z8Gv@(5!!SqnY4~TB8omff(?7
z(49FXGQIKSCgZ!MQ*;H0*J`i896J8B5&w2<&s!$SK+gaLu7D&dF!zWzgg<gk$YUVX
zWia*3;)B7^z$dSN7wrCe<L&*7#_cmWocV0f?M~t;ILN|1XsrgywHjWCrc&OE5#xoh
zk<E<rNIClfGT)fP^jd0p&>fEE0zBCrN-a4w_$zyC6eRy&D3<Gr5zN)<*&F25*cnzn
z27{aZ*y<-hU+0Qt7)~J37cm^QN}id59=eJxs?QP=0APpA9chYFTZZ}V>E2#^bljA_
zM)lpWoYk9vwH4ZD^(H@7O-rq=wHwu5lbp&)y>Xa6oh(y_V7Fo*_V%ZKmd$kZb{=w4
z7-;`8E04IR2Z8*V9i$Icd4Y%f)L32X1SRg**n#rx>|O2st=&cmf=Mr)&XO2T+IXhD
zD}RF90!g1ZigN!Snqx=hVUprk?=F}yOuG!|u3|}JFJc;iKl_2m$KLLKgUI#K@loCM
z*~3i)5ruUyVhdI`@uX*6p}NUjb8r-UImtX(?O;}&r8#*G)inJ&m(QP*fnG93Ok-xD
z@iw|_O*<c3)2=PxK=QQ|V%uIA1^WepnVtbpKZp?!M?5gyRD$kBDa!Ux2<&2~C1a<I
zp;b^)P@4N?Wk^uBHJF_LL29k7t#tMQ$M7~aEe2^R-Z-Z&FxpOYo(3^B4Qf+v5?&OL
zE_I4iW=>jas4_tf6CyKA57Hd17BIGwyseO$0Y}4@MIYI^ltc*8L?jR=6OlOFx{W}$
zI-xNQsy=cby<jb*7>x>^Mz8hos%9kiJEd;=BFotUSqiu%o~P$azBvYt3O5Z*Zu$rc
z8)@o2M-BuW+ylp-qm!&C8JKkmCVG8VIUuatUss1n?CN+D=2q!`)yw5(SHr1Hsp{Yt
z`*z(lj@hl$bV1d<rHs<tnIqPem$}Tl2b1@}PI0kiwOW}RM<BdRAxX6``+5Jo)M9*-
z+6{7)spID+TftJ0&f2Xcfp|OOv}eTYI9|KtQ7F@}!fc{}6l;Po@*Hlkbd0)LI=HR|
z&q+pLGWQPNBDv^x7(BmVAdgvcIlPIvu5nI~D`HI&++b|TPNBGvj$lm$a6D0InU_gu
zMndYNL~aAE1R|t?!df<kO%VC9D6tOdQIx{92jf}BeL|4L<<?U)?#oH>wg+q``I7j-
z3yJ0=<%;ChPa4NN5byYKyYagxZ~zkk5DEo=!`AeZ8JIAj!DlLiDH^9&v9Uow1B*_E
zK5phd2-BC6&YTQOHcne-qvR<h0!wAJ{a(oc{&A~)h5WxxG|l6-1Ro}w$Y7W>)kB_5
zMTnVFXjP0!l{YyT_8qwmGiXe%5MHeY@0hnU<W8#_=KQYU03CF_MQ)$)=bAG8h{^P~
zd}Er3)F_`QdgvHjr%`Ox04-w$Z2B$dXP4jZIE+0y|E@@335cIZhT@}BrbusH8}7^`
z{=NP!ZoX}>K@2;<Z@QI|VwGSwrh^A`bl?DxIb|>al1~vzAt2l497Y8D!@q%@3~ET0
zNKVXy3k#EC1zq}?+!{6eBbbKsc@G#CQFX1hzL6TUC^7jX8Faz!XYI+epVw0*6mQ18
zpX~@a8d3&_rV(sRQnkQf1geHAUG<=(3X0E<(!eBhQ7j6L;Ze%mYtx+)YQeA)+dqPP
zqBKCm&WCt19uH;)x<1{APmYfdPOZ{dlJq9TgauI1#!}^9A?4h5YtqvCr}R5{-(J~t
znsFK^a|@Vy!P@|Zk}8#=9BAyGk_>>o@B9EKDS)|wFueA}b;w3X43Q~<OR?w$?Y~vX
z0(dDniAyq(6Hg}Uw|P}4w)si(wV>Lsk<hJPhDyCQOMMKL`c0SmTxB@m(2YYC_8Rqi
ztSdqJ&U8G9absfKV{Mj24?g>+B?(PSVopm^a9Wy$rlnbETAH3|NwTJ;nVuF=emV=5
zZk)ape6LYFd&+F{PRHQWMOvq1VwN<EBK7;D`zdCsi^T8O`tN82xqq}<e``nBuy-@a
zg<Mft-kqL8j`nR#a2KzwKeK9})(^P&801Q0yl7%7s!FT9ZSb}>Ym#9M??Ee*%IQhH
zz8kN-ivILIue}OwNZ7)t(>$L8SIh%>Y@aC_Q5Pz1v_3l5=iypj+xdl!meFRK;aGq2
zG_UPcaev5V$!C#mY?#AB2Rc#c4s7yL{F(g1787`9EkTDPF>NUAZwx(AR@65G5-o|^
zlAO(5D%B4$i-u^IX#py#B7=)#F^oU+l~1Tw76bexvMs~^{L`F-7ixl5Esi1xkZ5x2
z0kkUq8&8d<;OUFVYD7FD{lBPGwZW(wHLD>Q%zM`Tqc__J!GX$kvDHTq-AKQ&6kiw}
zqijsXkI}lIPk;+=4z`ct=JqS3JJAc<WLPtoRP7Pz4}NVPzC7ED0eu?B$A^{hO*6==
zcvaHti@mRt8e|W0VOJ)c6>FUxj{$<vcQ2DRhK3~shTpJ-{y%4jFOSJX!M-pm(&9sG
z@n6|ZrnQ2WWw=6=n0R<SR-G+XOY+G3VrEpeC`ZT5{hc~{Q9=PoJi!{eYLvA8=tkXM
zuPewvs|U0P7VQz-iL^L+OOBCOe?&w~>|jiBmnC0DroTf69Rn^{yo9PAvtFQOD@=)?
zh$cl}G$O8;>x<-4tExb058cNX)A4))VgM35rFJ6-t#By_tZIk8Y^oO@`yFbZ83i$m
zkft_F;>vb|NK3`0NIj-+m6Wfu0X-&u0_7ZL0-#XNZkMV1P~-XoXf-tVoT9cxm}Tra
zK8lGNR*kjVdN8R{Ag*OBA$G?Mh`K05Rd6a)CF${`XsS6tvt8pQH7Q?Wd&XOCFdvhZ
zxgwCxpvOulZNG)zW)mB|pcTAoh5vF9)@u-1aj(7^k1K@`d8vf1ZEQ=6J`uY@u;1VN
zUC_l{!E&C~o10vyBaOjX$6U~^7TN)wn`2W8O{!}Y_)&2Rz-*}k@S~DvMVM(uOTWc}
zdF+<(R@9)|t}&pjDoLW7TO$KUU}Tv#*O5%{EU@pEC{t*S%Wzi&M1Z>FJU!N`A0I`}
zJx}-c{(Ue3y78K@5h?_iRvu)q3V{SXa_>V?=7Vo`4p|ns5|tF%s9>@M0PXd@CZyKQ
zP6nvGkCLuus-Pjqjets*mi`lfAhF;jKO*O2kE~?)(E{C`#52#{x-XhraKG&R77H;f
zepPQ;js~~h9dI`DTsZe+;Vlt5{bwUF_EFL+8|xvLKpg3i6c#6XRloOM<>iYuP~t}v
z-<hHR$lN?E5-xp(ugCN~X!coddDlwWc08Fy=CwEcCdXRIcB8pdsiXy4^{~pNkS{h%
z-~;`3Jh5MnC-NQM-B@kI1NjyYA@eOhsEP?$Rk~ZNZ~JN0E~lZe9@?eg3M^d=o?7Lm
z-9fh{Aa@G#V=DTAB4=K7)8NS$a-d38U=CJ2!~rMX0Vk;eC%yqE?tl~TfRogK6aRqS
z$6OR|guyyxB-+#}L*pqGOwUY`o*7YcG93^5v-W&EpRoZP7f-*aI>p(B##5f(Km{QK
zpu1eVHB0OcJa1AJ>@Iw-Y)mymz@_m)y{e|F*!_6lVMnZKlT*q+u{~{hqfpT{$Wf(4
z+tW{}LiiNRh$pD*<<@jL<Ed2;z5HOMoucwNfi7?2#eWKZ<5|@#Gwlw?S6#OhJ+%s&
zlVLo=9_MWWBf$_zGX-Djd6f!-xEQLCeurI%zwwZ}9rS0ig8P`tqV2J<A%GmKhgDU=
zqKL*LY~(uC%C*(RwWp11s}Zw}`217c@1z={$4=2vYuKIHMe&i-vnuLqTUF3KICj|+
z)I2L*BJdWc0-7O5HKZuqlk>D{7wmR{Or(p_b8J?d8yk~sJ*--#X1-E9(}Ir}Py5Ly
z`;ByS@xG*kpfBd>)2MBe66a~vENBxD_pw!!GF@L&p`<mGsb#|j($$l^>Pe`2tMm7{
zpq}vC1=e`w>Csa`y|9W?qCj7H{RU^*bQ*wFl<^##=T%uWne;p6a$65oDS6Y2EgA)l
z=c+6Ovzh4g*eve6QW!t&UX%>{1yv8eL#|6aV3T^27t>FxZb8WK>nn<xf4MNpg|bun
zWxeb5te3qWyfsYw)m!~YgDjn};t588f<c+aVxHG(D!^7BcfK(n@|mK}%)>ycWXvQ{
zG6{=*ESJR=*wn_ho>r9woV1iV+(${IaduF@m3`Riun%_j@pR7Tk38D!$5p2!QF|4R
z#C=nh3iCTNHFJi4d~#}AqOB^ky6Hg8p?*}AR$N3zg*cL;wfyXEKnL5j)nw>)q@Pq>
z(?)Y-hsQ_z&EtkTNJjl+j2z2Uu8#4@20Go?>+MsHKU6>1Zq`jkusxoSU=>|k8GOzx
zBV5f3x&XbY&=<!2zV%8n?13u2S5+5e8Ov$+_^6(O0GNIgT<4X$cAgkXmmgzDd~}~F
zKLa|ETgPnGH^i48DeDuC3~&NeF09$mc3|BhY|im~+U~xqy<dfLn@e7^WCrcsgZcaD
zVvJW1y6vq86S^*N27pFK5Ct>^4a@~R)MMvwtScL|C!e%82ykpwZN5g6zDiG7KVy}x
zM32_Y_%~VR(WbiZFW~yiZuhrx{Wbe3;{1DSn{W$g<7&+C|8)RSVic}}v4QeHlA$>?
zV7XvvJn6L!N<gkbU)qXYMl~>u&<h}KQ1h$2E@oXJ_jX#-Pw0%0OWUd(!^!X6!*?kw
zcGxVWhjAS0O$DwFwdu5GMRU-3)G7QY-~&)AH={-tjlKbqUGn8WQO34TDvn?=K(Wxv
z$V|=Q>&>?B&F<1E>*+UTE$nn2bVHc){zFZJ14Y3~08X)@k&~~ah+C1^Re52T5E-O{
znSulb8-T%dH%q@oWq+!2Y8Xk&(8%x|g4<?xC4Wcg0t|&o2kwQ{DO0&Iy|UQm6etGh
zUNDUJ6@#+rpa7E5;=P<pi)fKo(6S+lV<<Bp&1Xz;9Cy~Q#gE;Ar;P4f2MwU8Df}Ca
zb4)JJm}<lINQ0@aRUSGwErc1PTtPrJRZJk*v}-IP7?@QT6c9GE1%v=ZIfBBbE96=2
zfC(7d(Uwrc#pxB#K%d#Za)zSHS_Q8`z6YyHse|#<noPR_>AR|)_=%No=3jV=K$)f7
zLp{eIn66SEnx*Wso@H;vb=cuJVQ1eJ44$sZaL*H%3qpe@<6*!3c%7Y}^$<{T1h(;@
zmz<9vprh%Z+#XLpAqj#_t6?-UT6rDLJS3(!XkA#*VFAT=4vtUjVw)Zwzp3-ByF3B4
zlp;rFG4z_FU4V@ioINH3R$O%2^D)3iYx^xXJ0)qw`t}QmlSvjppk5~nWEo+{xG_jI
z=82?Ymy*+cT5rbNXU$_ldJi~F>)X@jcJs9O+<U8Q`g<47n9jTeY)dWUX48@1oz^?!
z0*r&mJo|%37cw)=?frwlp_g>|q0s;wU()jv?xS@03~a~n8O_AjkW^si43qQ1{-3v<
z8D1;Lb2hzP?vA)qUsivger=7Y2h0l_^~+F_Y)|Y>c<S(I1vAxs0jKwf+li`$oZpox
zM~XsZ<A`g);&mxemLT~er`EiAWV+e3KfY3VuT86*%!o%=Ey8LoR1+CmBet8I^w4A+
z)N)xGIRE_V&1bLr0_TM695Icmvo`1sz_Cwz4t%i~NDBaz5&9PvSEm!fC^0IUv_KAU
zEP{rr(fnB?txf$#cG)7w=8_w3LLNhJwh#7qW6&~+KgSJJKQ`*kGIa}hBn~R+$_f0V
z(XkMSX78ZjdzDrbVw}JMD>abl2wDU)$&mpnK?GY99}^>jt(X)D-wDtCi~;~L9z`#r
zwSbXYxKA10+KQ#!jl{#b84IjLGebskX#k3tUNZkA2tGI}rviwZx_9nqDFbfUt;QVT
zBN?fs8X3?A1D$^DTua~L$Cv->@{aq+&i_?g+gMvm<^Nj$`FsAa`}o{X{x4FT#4&rf
zflTl^j#ZkR)Qfb&Co84S;o)!OZp_ZrrBdyB!(YO1R}+Pt+&<uBXB5C1qSX4+TJ4rO
ze9X#@d-Ym6^^mM+HvM|Hf!+OR2rWB}9drszHK1aLQ_xeZ&49}!CK_@N(#<<mHE!O7
zC*Hj08yFC1NDlbg8}TcBEcy>3<egLhT>Ag`$<OO9{eQf+@tywP$LAjCzfJxz7;~EV
ztH*a>*5pw5y@R*$>G4@(rw*QCQS@|uDP0D-=SGgs4ojsngd-ATe!OlIO1R_(MGGd4
z6`VJSE@VO2?#Gn77hP~?Q$evNR~zQD&MdK?iMm|wsrih{J$1{WtmTw*pY;Y^LH|A_
z-5Eb6dmXK9(pn+_pEOMvFsbaku0#S8rhNzuR1%b1NE@oaRNCdLM?6CKiW)%UH(b=o
zNg4M*ScG5CC?6NWM^M0N<pM!=*DmB0&zJzF=%0?2kFi#AjtYzfPl|KQj;w!i{Vv2%
z!i(Hae@bz(IM0i3{JsIhS7VjP``5ot@;a-)u%4BCjh6f?kF$!v;<sSAXk~@(zYTXZ
z7(6_U=pDuBl=B4Oz`b<0!y{r2z#m9G<of4U#8$IBngczNr$IS1tt<2ku4O^wje@wb
z@<;cR59j18Ev4pnJpN-oxx<b<gA<2QcbXLLBLus%t>$J=lkOBkD@Zqx;bfk4%VA)r
zhPi%8?-W=m+$}<GN0tl}oDu&>^*QTbj9Nl&?|$iC6`yHi3`Nsk5Yakah+zy|WmZl5
ze)Maf{PeN-KMGfV&-uTF_+NXHlK*S#-}%4$_}mZwcjLJGPTJrh?%q%`@AUIwci5hM
zvYvm59OOCqzs;QCMe>X<)SQ(%Jfo&3tGJsAJe;aKo#2^Ch4tLZ7`|*!SUWR9W(3z_
znUL-*Eog4yDJQT$v31FHEOY#sDIvO}_Vm*PyihrI#eqQK=35X-;0pY;;Inrczn?Ut
z=XfIfiZI_eRUODO4JvcmZ0zqeWsW8%toubetUL3I_5y&q-A%q(m4hN~K|)Y<fjl{C
zzHXd?Hth6QOJQ%`MpEWXY!}q@$+b*0BAQiSF{qB{X*rsVz$|2TNoo8D)`(!`OD9n*
z1u(%Wp;iEUr`CnqV<*c~BqREN>3p<{Bi>CGTxV%WuXxeb<MrUCI?=MfsqmC4em|bI
zu5P~l;l7F=-q9-DDAn3hDUb$6R53s_-)uT{3_9V|(Qn*3)9z%@`ZSr26JW^GHQo0G
zSEN9osBdqYYnc<8dh40G8c&aNFKv@a>sGou!avgqCj2RSKkW?NSg~*arrNLuaIdQQ
z@Xx%VHpaSYtsZ3rvEEzjhq!OP^{gK*gOMD-LuQCBnnYvMDsHA}a*Ab{_;}Do5?P5a
zdFb(Pz3drOMp}%gXHHoZEi&!N^~~tQ-mO4m?#_w?G<MPj<Q-{@cjE0`bwRiO{@-vR
zwfIz)W5;}E)ySOzs9)qnus9Q3J=;wJowHWT7&Eh?GI$uz9;!vycwb4gFJvwvn9W&R
zE!Xp9fOPM$xonuafGr>AgqGt_V}y1W!^3F~9#Y)oN&h=Oe#`hcy)8agVTl7cISt|D
zqz_Y35Hq=lg{fpKgq`9|zjKXWTO6w{f{{&#*8%18?0=>$9wVe-vQMxD4fg>MnofxN
zhSKN$(XT=P#oNWx?Re+-?5Mf0tsXULSnU}gnO1soC4=zYfIi0-;@I0l_9xH=v7$Yh
z$H_Q8@5YbU%ac)sylll5K@<w?iu52`Blv$ZB1HhyrEjPzAkyCQ?-qL+04zY_6$gri
z3H$f0^Y6QLzSPc{euFz_`h|ARH+7Zu{d0p4-T$Fces`7#3V7$Yf4TR6Yfqm%cJKc-
zzT5xa&*y&b|CHP2`Z`>8JzgqwXSHnFq-R|;>Bic_&Y(XMZ(GwD*6mJ#ceby>>_VgY
zFzYo$a2s7f2?GGRSD<qpD|+dw7boo)l8>B!<m%!JnAl*7glBOQt?&cECdenEihw~z
zj~4wQ;~;Y?M3gL}L?MBx%tR3ANez5`65ti^;q2Y|lc(?HuNCqNQccFaLFe5XzK4d_
zo{EP1n^u7B3ANY0oR%lGYV;rF|B%i?6FWCVkK-!Ok`AT{Uv6G@qx06NgQ*K1p>5IZ
zay%b&qVuk3=ltVZH9G$&aAkFMwelbTJyO|J;3#>th6inF^5c)<iyRd~A%Li8AZqsk
z1*aSmojr;s+_Q}3EL}G%82}KrV9}_1-R^cfvq&HzU`Ka4Y7L_Ed9Nq92`CT(LB_3~
zX>ZXA1gu_NfsoY{zIvj4KVdV7ZfBDL*hgD+c;Tzj+EX!?RW+9w-&*A}N)2R>BGU^-
z2*UU!=DbEQud4yb8Iv*B39wJS@iZ#;k%f)=(J%Nk>i_s7#OUE|@UH(J;%f0;s0e@)
zv1Db5vHkbe=%GMmBQv=6HI(L95TcxR-Z@5Jnh(%oPHy8~|GL}ZZ4BE9K?}T0+8OVz
z!|!Oz1O5tbs^1Y$*e@<zg(qOs45(&Po@D$-ccd#=!^AL?OQq)Vuk|Cm6h3-|{=)l0
zKKQ@&Mman+7+(d_jVwdP2{Ee+_nowF(RI=W9bNlo9bez3<7-q7-l$_*-dl7|4M23Q
z{^*g~OgXSXnjWV`#wra7<SQ)>h6*PK;^f)>QFHC-O{RlU_ZIV^4ndiW-MFY+!juE{
zG1@6BH<KBKN1%pGhm%Nm3FC-X+Jma)k;1Mjm^R1|&3)u!Wr_*;tnTdVd6acm;D0_+
zpCS2xMKd0pf8;}#&sj^N=5vkKBo?AL3#yPR!3h0VKiYl?`AL4;ZX8uAit6H#4L}GX
zAO6nXnbqEJ>el%oM}?7Y<;RVtShwSo6B%_cbqt(f!1ze#LVM7mbZ8v@Zf3h9ORx-A
z<P3fYcEdx-`Cwc8#`I9O2CGjy<wh(?p)+H$+4GNN5`pff+UL0qqpE=o&iS<40_$mf
z!divrzNwHtvuf+g6VPb^)i0SX$Q`VL2s*QvY7lV6+hT7%YGbM!(7yDClR<YVSodzn
z1&tF!dfS*x#~0Jqa0on07vjx6kID~b6$DKnJ3cBuf{7ys@6UmwN(e>?Qwg=;oSOo2
zz4~@E#vZ23XqY`j{JiWACO~q;qh<8=ZKLUsNiw5fc(PtZzgQgIi)9Ry3RH`;Vi;+B
zoRhN}d?`++@Vo2qJErf!_YyUO1tdXS;#?|Akbo9A1Igsb<Td#WjzN=<&ClgT2HlL8
zEyOY6QgTlS1tbxs{NuqHmDClYf(x)X`&hKPD{?G)yGtL4#m5P3@=b<`!9F2-S7?y_
z?r1S?)FV|DosLKUd)(_SJBO|_pIK*aDfiS(mGK|EE=v0kT{;a=_yf6cI3Z$hjAyx`
z!z-eJ9A&_ANvjb()hgNRrHd+20|gB~v9qSkA$HD8=FmFaEt;?aQjJG{!YXCcGz<Sz
zw8h;W;R1th#!H^)6k(E)UT7^@A)>NIjfX=)vMFDYXig?7QqO5L@UQgHIvo&sg4ADf
zOO?ox=f#PI6-%e0W@|8rnme=qfXe#FE<bosi9jTU*C%_Ccpkmkn}IM3onpdo4Uil^
z!4q5|t6zEy`F6z{yIop${6G4vCb3yRZGw7#dv`b9ZR|rzt)1h;!|kKp)3Tho%9qu$
zlm7Rr_tO_?oj#!D{rTr7A^%_aIQrl9$B)<kSM=ly!lXX`!}Y&v{ly=_jr6A<?%n}B
zFaC#EbXWiXWWDxX|9>B!dyoI|W-s1v{4MPPZalwlXPsOp8kq;egbExJTS+__v=VWs
z4EZWRUg^_TG97r~K9y`vO_y-vNjw&F+aI+C#B58OZD`5JA67JahOCz1a}%f~qao&0
zVK+!U&<vm6a8J46$kSEkqiOd-$V%O5aS*+!*ur@{!PJAxcd{DFacIhD$4H_Rt`170
zkF9<J1_FR?;A3j|k=_YI;L!i%`rhw<1r>Sxb1MGF#`pW*d->cG{l96*(4e1Z5wFFo
zp63yuxaTQu)3lpoa*eVK9Xuu_!WTtop6x>;YTi6;ji?-S9FstCSl?(Rx&E+8Awl|l
z)(psH!o8JqIv<^@W@dC-hoYKjE)A$E_^uBM=hA>2Jgz@HdV%VTPIn@NwiR_HDS?FA
z7(P6n%V@LwqHEbwquUyI-e8j|_YMDsd^r8iHR^cX34k!uvrCop!z_;y9X^;)DSmxv
z{rX71q&C3GyDkJ%>?az{hwR~K8&|D*gJqg?D}CnFk>Cr|&LX+2L?;Rb_dvwr`_NcM
z)l4^_t8z8eXkbJc?A0GyJ=L#);luNJFIrili0d=9ZiiOHT%>^tw69xM?Wi`sTbAA9
z$2tEgp2Z!DfH~*?#^c&k=lmDq-;?j>|9yPEhWy8IwtOO>@hW}v`^>|>72(i~C?>{n
z*xaV5T6h(4xc#<NT3dhS6gm@yUT>eij$iIKsZ6v{`_HGU6vk^jir?(-Ixk-S-mGIK
z(RdU^&vftHGS=MRjZa_i?=?lU<tLR;kw*O$y2Y2Gs9d}Lc`sOyfRqK-_KYZ(?9UP{
zKd7x=KM(!4Y?Vjfmg`DXE`z;%MSQKitG%yUzt_a?|0X{NF--H#x>NFTu;hkQ^2vL5
zt#E*Fm2v`OJlsCP_?XySnM%C=EpEPTyp8d;g%>pXi7dkeUjqrn#P%>(rBZRU0hAWW
zRtHerI1nM<F(iA<xcTw``+v_|+YB?vp7)bsYw|7&U|B)88k6au9a&7kVy06{MHo|i
zjglUUnNsPm$nz{3s@f1ziF=*5Q+*oTvYCr_G3A1t$F8`h!0hoR%89F<U{N96aCY=l
z40=XUr!~x;9QMTrY*sF&ywP=ineA^_d(p0)Y|GiR7OAL-aQ6z0&=k7sH?y-R7f`gA
ztvSFMnVZ86K^;)W+4b3k!pcpb9mgW_@1_;y%x8~QHEc($^9)qL)E9^8bzql>|855u
zm$I&JF(OTCN**GqHxS$1h6WNg4;dgd_Q`@M3PNPGz$KwOAwv!I9DWxQZuxQef8Hc_
zD*)v1|Fx%UuKw@I<HwJ`^Z)np`5OHH@!lT9D)$Ni=DVf&(+yYe&In4ek1}E{T2=Al
ze({>g%{xsN?DQ^G`U`!W{r^QWK;-TJCr{n{4^P&9e)@g?-^b@`?Eg>(2>X@6P!vo?
zU~?f0B^{XS8@}#^*sas?e1evSuy27;a~L+G6y!53dzAFVtdZ5**WBURAHV+ZZtnoI
z_y6PC#$(t1<H>q$?fd?}kI!G{{!cq%<|ziVL&B;MvbmRqp<BgxIJ-y}?oOwpv9Gk$
zsi)se7rBaLgA+s7>1yg!5S;qkW@CGY)ODz>+uKX)^;GE$C7~*lt0hz=Gt`7s(pFs6
zo8`-D^q~Ukw$3>EC#v00%I#c(XP|ha6>a6q%A*&SLag>arFq*_O^7nw#DkkOkuEA=
zdJnlx*P>s3fz~(w8_bG7UiJrFG1%;p?i|#&8}?Yg`Jq1CivCrWgRLww+E=`;)oA)H
z4p#srs{051;srMUFj`9u*a@czJGeFKjE7qPa?u@ir)i^}wEhQOyoI<x4RE|meD&xB
zwuFfs#1P=3{<^!d87Qzu1<s#_3anFs$B(o6_|r^{dvLt7eIPdT;r<bBX>`6qFxmeK
zew5*6oa1pl^fn7B`G-`m8a+;3cNbUe-jfAIj)r_iKXap&##UB&H*}8!njH6xC-Wb4
zAeDi}b7UI56e_6ON~CTg&UWmZCGw5-Wlc4@GCk)xUe0lYY#BtU2$2)v5Hl7%m`5)u
zXSIyJyck5%9gw{p59^1)z&|hp{aO5v?sRPI6T&E(Rai`oEftl*IBWBTt82&{ER>ca
zp_;22v#}8?iK;uLSG{PC@!n`+!J8qJ0$ffD7(&AD&%8ho?S~qZqheB#4kL$aWQB{%
z8-Vh0v8WSfU=Pn7c;W}}3n;B5FS4q2Aw+@9{n!#p*hzEpoS-z552w0^;biPG!2Hcr
z=%Sn7^?U_-WZfRF&@VT9vU<ula%}Fzzr>Md{DKklSHl>YZ)B8_7`H&CV)Dl?QTnb@
zy_MEt&_4M8N{|>jy6fb!@8vdv!n}_#rIFyTaAzP43^&0bfBX_XURS?lpQ2ZSAC7hf
z?Jv=jO7x>K{F3feobh<qL-)qUO!qsA9;jO?PK3)a{_=~2@-uDP&%Suu_B|Fc83ix0
z=(1%Ilq-gAi(-<aew{%E#ShXePeBUdQH&GuT2=6#IMNrIOz1d*8AVGG3vx{{%OEiT
z6#yf<b0Lqa+{EIYF-QJ>Qy%G*F&Wl6Acm+>S9R-1S-=3qTZ>rwKt0b4*_MD)WeJ!&
zN7z8WV@%UjhIZ4_ls!wKzSExjXy|DaS7qO+=2QSdF`?v82_}<t1q|8GB4Q^GU!Lv7
zdvW6}S}a6=dLGh*p44|YWh+u+Zt$c~Sl$chN{&ls0SMB4fPj<R37dcF6WPLB=#z{z
z#6}f|JD&Em)zQU}`!cOU&2^!x>O9gxAq+B8pxqsb2%SjMmN-BXN=&R|%tG)=j`z-v
zc4AOQ)XNp0@o@kx4a4IMeC#705-VmeYc}Q}!5<s3=;a=#hrO2gWf&Dh3UfNWF0AFi
z^P#UYmzS~#KKXOVQzY}Skah~WY4Qwf1z3ET20WYe=nX?5%zWYl(m*ZNg@3-KA<dF$
z-bCz$L>kR$DXt2Z0OwB?kG4VsU=pI<u(cq)TGEmey{*4(){l1atpS05iWN8tij=^*
zpkdBEafu{r>i8&B98Gv29ggB-==j>%K5fQ_$Gi3Tq;Y(>f4XBvTk#!3&=6(p!EmA;
zNrnW(Q2R>I(Ju8?*xj2MOx@qy>MTsw=#Gw$>h|n=#BU)_$I74z_FkZ|?Sq5EvxDaT
zX5JdY4<|g1vs^rR(XbsEa~cpnGZth~Q?PqQcBxqLOt~@WilcH^bc4uM$)4~V?+@9$
zT8xa?)HgKl`!`&a0xPoE7Ra6T+uJq%1=IzKj)8rzp*MJ@<z{=Oa-`&}6NQWNeo<M*
z!aK)kJ0ncD)>V|H8sNnXpEZ0%@JD_Ncwk|bwn4SxmX`Nh6+;GEV%<Yf)d9kcx=3*Z
z%bc3l9gLDKZGj|XPG|FWyE~gfZVh{pLa2X-Hn?A0Br#;{=*0pG2r0lB(cumK0|?iq
zcb~#U9$i6&LjmDIdghS;kt;vg#XT~ql1D{vhD<u=c<*)tc{1ls<q#z%+NG!0$o{PG
zU$K<V(nCM1^fpiLlq2Tgl9N;jtt}uJk|J?&AvIS_<syrzH(0r-l^pj2SrMg(srU3{
zD1a3ra>N-wr5*$xE`yQBNn`)*(+yOIEMrI}+H$5kg*7Lj(DCOkfL<W;r@hK4$?XQ_
z|46#>cLY|F(qguRX&3cO8ID|zS<fF3an>E_>Q)@&FY2d&6QS6HFHFsIZ|2-f<~(LY
zAV$CUDdKt2H*$h`&`Fs5Y)2~plGU#z*V>f0P@no(UMkRAwy^fqoj>joM~Yq3`%;VA
zm-Kv&bcYa7P*w?EnEH_qXN!$b^oFUxWqU1<t|oo;?q&q*wm!^T13(r)put=t5a&x4
zxbue~j{4TVlgeyU6nA}GwBCSo1FK;Ft>179rpG9L-fq*S0e7~bzfXJ9mGbvoK8t(<
z$E`1~sK28<67UFBs7?}MU!Qy~#?*9tZ-aBuXk-smUD*?Bqc^4FS}O2Fa5uUY$>{(R
zLJwO!&*1SLFfUP?Rg?j9usfgwK|;W67|eZtG*>nr3-7Tsmg6uvLpM<fh3$lmsZ$1P
zRP`?N+Hzo__l~)U78Z2qkjvKWQf~l^bXw+|mxhg-C@yer+G;0VyqQ;%|84_q?KUc;
zx-XX@!<x#o`0mO33JAR$bol8e9&Tk>yPCWe#%odhXgc>I031=6S!A^`5-+Om&68L?
zbk5`Za(}dsT{8Kw1JyGHXycU&SS?55-xoikk<_6%(ClJW{6jZ!rT0FRR>!{|?QC)x
zvF%2Qyt3UtD(gW~I<$(a>e`v5ZxnTdh7`mPaYA|7DDy}dlg;^e_hQL>iFs?>!*kXh
zb>f!zH*H_R#N+N(X+vihQnh(_iU9?r4Xb!lsZeSc42dlEi!niBJBS?;{TZ1PD|s2{
zT~NGonX5kZ%y%Vv_z?G+Tjumt^Y@c_e6+puYsJd{2mk*U{{K9B#4b9G27>*1`)K!|
z4nMsovUe9U%p}<ix})b0{xOeebZ~VJ7z%7o6fGP3auvn~YywBrjjZu!&7@Hp`=~}T
z9Co()_kWOAvE%<kz6W<40x&QC+ml+#|EKo&d;Fh!`TTYKf8c-w3Ot^6eEvQVmP~NC
z({7e4P;T&`BK|p^0D^_%53)K_#}srMzx<f4qnz?nE=Qi+cv(I~+I0!p6_V!L<AL&K
zkm^>L%vnr^>0V8&&3wqSk3znATk$kgfp!9#jWB3}yP8k3St`ef5`JP}K}ZTi1xB;}
z1z;OQSe=dAe{^Ml{8B`D_EO4gP~^eLQKLsC&6s%IA!tGb*EYFR`L2{H;6bKYm<|19
zEBfbW+b$t!i6!f-%BexHW-^13daVr*xAdf%1=Rcj^CQ2T1%?3EaI$Ijc}25eK7=bT
z72{F7zWhir8`U$bFs%fzDD=&FdENr6Cd57b|07BtdLI2nf~ZVb_fYnr%$71PqSY-D
zEzJTp7%AjWiX%S?T&g@HH9pi4Ir$j~EEevUyttn*?sLS`EN!2X2+9x3W&a+il>NA0
zsQ_+Qbc>0^Y54^vEAb&v;=yD+ShIkM%f=j;MMBt|EP|z~aH6m@kyvUYn6t7ElPm;F
zC%e8Gjx8J`4;5Zvl05BVrZ5f~Do+Pz2cZWCQGBUF3*))nVq&$JSS=>9MGDmCw7V35
zv{=OM&?qvEqu+Z6xD*)RqJShJK#~9;GVFlqv#4X3_r_U)No**po-5rC*haMS0si>r
zOLd_yu+ap8Dx{1}lN*EP!j@>*Vh6Z%CoXWY0i7M7cRUj7DVA;|Hft(2uP6!20+Oc7
z9|<<QDfcSZ2iDl71y=jIWz}jPJ%BjG-1@>cf797apk>m^3rml;9u6YNszP>{etNnA
zshq?w#VX<P15ZFWH>W1D^C1SA6;KSF)|>I!X??e>+J@;!zrjAFR^$igv;koc)Oe`k
zaOZDHrTPI~gb)lNb1>HsUwcBhh{RBFC=tyP>kLh6H#;RF-TxeCsz?laZnqxwXPDh@
zHlIMVlwL?k6*sVBQ%fXJYWgXge_n8PqpanvrIwGZ%)?8nP@LL>gq5M|wDbgC_4Eos
z?dP?sIfD_7-s6XvX`T!dfGR?OFq10LO+b43SbE@Z=_$Igz+h_~EkOGh2r9Qxja2VB
z7j`gz&<LAcU=HXWW`tJr#;Gg)cX5SK5uv;pp~;*}lbYmXot}}<X2gkDbTek$7tXq(
z!%l1Z32ffm_u%`EPC4Q@zUrEC5bjDkb$k#hgVr2z2^{>brn8wl#Vp|w=TG0#QJ%K`
zF0FIiZ4fI5>bWby6@v+A<m^*lW@+sv^KYOh4#a=FQw?xl{;$VR9;f0zu5WzT|K7*v
z9`wK8YQT0o(aWbvH?6@n?D#?oTSGZ}<9L;+tQl_gxZRqxq^QCvJZ=`?($|$)JF}<7
z0%Af}o-^37Uc6z<OkehsoN;{Zt@cfRJoz8*JONlX{a=5wzUIdN+<+^=@AUs3K7XzI
zzfe%WNxPqZ*c!ATFQfaoKN1}6bUsODS-}Cn=%IB!pZP)VwgxVI-9f6aHSDWMo8I=U
z<B_YG=VNAV&)Hcxa$-0{qW_{5lhGE7zIdasi8|}(!T!;&@y_wl-u^3yTL>mc<a6~n
z73K~+A}|sb)T2O$<#Z|VeU9JMcjEnB@=D)7YBun}|E)KU!KXr;ik_yS#LMl|I@qmP
z)f#V`Zv)lp`=X2}SZ}=9K8Vjie|B_QTCZ)m`DUmf6_!ySAA4p4ir~mf6vPq9^xodH
zN_NMm<@pSQ{edap3_|a%iF(mbSzy8(hkyf5z5iB`S4_ZC)BU%z`dK};I@qo6ZJ!-9
zqbPb(tK}9K#U9@*=jvB*?=&;ZuHX;XmRCN^RI2L6<T&vHZmA?|KYC%Lr)90d=NqM%
z{dbro9;S9nPEmr)$qUr69PzY{3{uYnp^Mv>-S!{fz}&*+h6HNUWBTEM4Q7vE{z!Tm
z)A&&qAzi80c25=|Q%Fl!>G7L_(r7s-`b0%#)R}j|fkK?*f7sU`KE0(l(KdC2DA~0#
zjXc?lcbbg@1hG*E6j2cf<x&VyV=y>xwf{g3T6Z?n`ZMW9SASC%R1Jx_;CJd2vJc2B
z+sAtc2IHA_K_Q1Gi~{(I)UXPmJsMUQi7?4<AtYjz+X|;8{*F`khEqrNCIr0SJ^t;8
zppk2!0}%z0LqbXBv?Fj|hRRWA{Bg93aH&yms$f~U5FsygcCx$OtfwH7@sbJwG`ajV
z>x;cXK+Pu}kn(WZ^t3s@MlyUUP+-uV^6e`|*Eg`$humO~;(J|z$_9-$PkbXaK*>vy
z(*?}4(0KcK@$Bl(c#u8sUI_s$TH)_Th$O(C=5c(ovv2fjR!6vK*61MQ?|39ZJ)%ow
z&RymX+;RElMK!MIpGwTGyOEw<{#C3--UfLVbwM0b&Mc?M-*DE?OVWIs+0L2ig0uXk
zUBNuYoAiB?d~*yNC=6cGZ71WYcGl2h3>N@1r_gKg`#}5_{a>{Po2h$Xf~I@b9VLhb
z!`6hthhVSz(q2twX9Dh9-BFp*z`6&9i3MkblkLX#q5nD<8i~;3;K3YRXSzL#`7r$e
zHlXq%&!XjwuhikA7vy3fe^C<|euyfjF+h)3Pw^O>dS+?_5b;A!vNf58^r!q<<m!-n
zi~1FI{1>guQaXShz08a1h_L`9HpOT_XRZ+*M$EU!%63j|IWU|VIb%2x;<@fdz(M7_
z2MIQ01?b=|Ft!EOgKxY}wv}T5ECVWx{7SR`3(fwI&e}$gqBV>UNX3+MkBQi7$x;Gv
zNW9eaOU<inO!>Fhs@Co)WYxh!&SGik@A^zBO6f2#hya)jj6HFqj00stk<%t1aM8vg
z*Cij<iGf3?9)%G3VAzashY^SCwYm|@t)x0StR#HWYtx}Lq#=TKytYH=xMWTZQJxOc
z8;m8>k>O^RRRx>S$o{bpi@L~Q8`cP1`UslTAKa}+V{xBGPWXBGTtendv`J;6mB`3^
z%kk$CuyiM8;Q1^AR+u8*naeyi%Q_(aKjtr^VRty5ezM}yr_dn`CC#Wd65*iq{yDbd
zP}p3Au^+rb#8*6fG*(D;j^v%vtd;R9ldtj<=m47Aag#bSLh-U*VG5`u1gS(&QR9Iu
z$tFieh!=Y@=uyU^JC%6O?1vDx3BWJr;SW19Xe9FOP}l6`_w7yQ4rFls)N9`<9;s;h
zpM8?ee553RzszhY;l%)6o(B0ci*4AZ4U4nYqJ9hSFCc`NKfbmka#Q6j#S+etOB^c$
zHK!@I!s5q`sj-=IFE{Sj>Z+)Ih5*BMev@vy-|M$s&9S!~8zBWQTEJz*d$JKO>$c)M
z#{GL>oQ?*07bs_8RZ8O~^>?I44(pIR6#5iYu~<?70;Zv9jWQI$--6Iq%@~1S1_72z
zvNOfZ5qx5#T{I0Mhci?;lvP>OiN<gCKo5EvpPf{~dfAk^*9}JT#E3yL?{o*PPvx~5
zvCG9^D+rtyIvYI6+fw++DAeTXNxi;{jkZBNPQ8lPYOkKF>A<B{7>t@@RqAEDN325W
zeA;b6j+s!4g&JI-y;`jhgtb(I9J8%J?X#m_kB)yk;$=^1$dy{#qbO%>xQf%-A-%ZT
zDS_RHuk+oaz@zzNtDnTl7)>7r-9+nP3+&O`$8nSN$VWa9L=yl#XxfKm7j}-OCgj?(
z+T6N9GsF^9w^l8@Y?aWKk$E6IR~}YuSKXI@-Ox#T@7?sEaiDJQu(afux_ts~&`)sv
zG=k&n<9PZ98N2Y6paGnbipahO%<;AG;te7Mq6jx(pZm}NA~XEAX^{8)UE^#FxK`CW
z1D!3<?P_&(bs14Z$o`-vdk7^^Q^t}#{6^6pzN{(=I-eQ53--TDo7E_WFdD@OLWnHH
z!2!%WGsOLM+0I-{$F<w!>+OTRc=zn&p#Ih>-I^ytd<DAxgX`;z`YGN0EPBZIz*fTq
z$=?23L5TDA1=^csX~PDyHeh?Yx~Y-3X$#^*iiSiF&3*gO-MDJQ@NNoeMUWSw8^Pof
zQfGr(&2&B*^+y-cX#DX9TJZGInzzE>^OL(~K=AdNSw|rb%sTk|2hejqyH_n#Ph-*A
zE8}DdHd<S>)!M7TfmNiob!z1wQMeIBAt5<TwjNxIT?Z|1sYq#(ESMynf>)6;#h?+i
zW;&EL;!ov&TCk;W@Z;Ej!#d4YFYmUGT>qc-S}Ok2#?RmFzwhI7Pxjv<L8+oRmPz!s
zo2T*XI96tv={JGENJ|!1ir5+pU<Vx_+_Ps<G-?gI?<D1WOYI$PAJ#EX<$LB*#=YJQ
zHNBhO1~G2HKT|>`y^Z7-uCCZDAaztf#Gp%KE1#DzwY`FWDw}pt?<;P1+Re#8VpqJr
zIW$-`TA>znxS08D%3%o7-N3|CXI7Btuye1kOKe5<OHH~#r_In!20YR-{cG>1zuL#4
z|7cr(*L~!~|EsNSxb%Nx<LB@6|6V@#;{R!re+(Y#A^!6Dl27xnnewoZ;eR0+`BV3;
zn`Am#bA15ZV6xHUTB?heZ>1S&skHXg^R`ik7L*e~+S5Q6+BrTuYL?ao!l&FmPMh)0
z>-x^G)KMfRHdThb8PteDo3oJ~5hp~%V6ML%H+D;pQ=NhNF=>Np*R{1&H*fUBLP1ex
zJ>888C|iO8t_ukz3c+5)TNlcMlRCcy0G@aj&Tc)mwA&~9@lpNNadUsWS?6&)OAT}X
zh(l$+5`9sj|4h%t?tTN4SVJL%r<Gcp)A-l=?_2<zId_Wa>}031m9{%(kof9H+b<95
z3ZA#Mj_Z1Ja$3jH^W1d3?|175{J!Ub6)aRFu(j*86dnZ(eW|dEya799oCXh$rcLEx
z0XMP>lAjT@__L?~M*VNn6G=3+x98hDf?wP|eT}OGJf48Ayis#qmBa>zeYlN#e!qTN
zDzB}l{F%%G@h<G2)2QsPAN>TOm|b9+Z^`!SR1C=7S`Fi!yQP|q?W0rNH>JqkO=9O$
z#S-jzcUT;_d3)zqF+a~(pb8X%=+3xy8?s!wAZ{7-z7iuyQ9OQ+`Bu?0Y;R9Ha9Op}
z4snJ#ennK?-G37|1WDW#7>Ez6(T1qh1zRnB?cSR7rRN?n<eH`e5m>8%7OR?iyq12n
zo__Q={b-}Q<UTuURFTa$;8Ix%HAHq|Pzx$2ccJIG$^@ByC6lP81(hklFuREOR!s*3
zr=K#2{<@TShLGC<QaezoRC{u=!)+Q%;i*q%ji5mcv>-$?PM1dJfAT?MK1kZe51Gs;
zX?yyUi4%goae;SfX5l@XB2HQzPs2I~Wq2x78Q(-2!S?@29htS^Ck3ZhKdhkie%|E0
ze+F_o!bA>o^&~c=0TzqUn+i!Q6Q8(@r@omWGu#5_9`s>Ox6>DBc|I^}8#N*5Sid`a
z7bMZXL1BogS?e<Xqx;F%?z0FZJHhLBfpa9-EanObB6)#kOAzt`o9cP`=uc){M2d{r
zob=*Zi{tRd@p%_y@kyT`fNW_q`Z}48lQAPhuQlusKI!tDfrA?afS>qAOwe??gA8aS
zC{WpT*fCsP%)9zZx~M^4Jk{L$M`!?VrueRrD57Pf;Pz)YhKTOiq0Cp9A~~*LmIk@4
z2Hla}Mk>KWUPI6P?f6o)Ic+?PR+yUERW;4MaO=9$MNt?<LquVzQB7c-c0Ez#@>|c3
z)OHtZ?(vYl%_@rHNYlUY3INV0bGxdU0ykI-3MpSt#8=7=2w)gPvGN{!8}srXoDbY+
z$;>Ad1d6i&S*d!0Q)_r!E;h;EuXX+sA4mT;y}tYKKe_t9r%!%%^?#3_tbf=4-N)yz
z75_(uVf(`IdG0Ex++tC17KnA@iI)>&9)wVox?nyKUrRczNLq*S8gz50W?6so)Muv#
z$30{!7YA0_HO)CYAa1Y<;R$X}(n@qPo66i){1u$It+J3iZmpu#4=1M$)N(Zbc5*;E
z2yNeD!X(}8xLw<M*ou;lCvveY*w$TI2^oAVP#&F=kfBD0NOohXyXmn*o^C2dHpLr9
z&IRHmleP7$dNbZ@$O}))m8W<{?9-j?X0zVl?1*KflOH2-+?#sd=JqS>sS>@=<I@It
zKRBb9wOff`<+_4zzIN>2e%o#wDX*}Ml+nvlkudoqi7|)RT)K=cO9<c@Sv!MM5_c+{
z#@spJ$9k0fKn;iO>RgvNb1dv%C~X6+#m~(;zLbWkKzeYm&%5#nSlBD{3IIiY_@
z+Y;Vj3mEASIqN(cA$CXnO)eoNym3*#K%R5gpgY6$%rNz)l<Q7eH|@HB60_HQ5U*6W
z67968CJk!GnA&7crg2upZ(pt@%Ch0wnTFESunV5)a*fR>KTPz}6wUVpI{4D|=6K{q
zeeJWDa<^R4+YBf?WB^6)39+{^p%)H*Ivx+PNEv5qcphWg>FCiCn@*nm+B|%Dwimyy
zZ|^paj}K{{)C}?TiW$_q0*(N&0##Z7mAr+2v;Vl;ju401$-rsFtWZrKlxmI?GIEv9
zbUcYkR?>Y0&Kwn{2Wu+A6`3UJv-h~OVa-@4!;?fj>&-{)1jKSUE{#LP=P#M^N&1#(
z&tivUiA8;|3D=b#VI?3F$8YKlKr)l`7%o3EftVk=Q?Y>YdO2&Z(>cOVRc=ic&cfNS
z>^bgu+0JEh-|VFggsRALpMIgEzw?2MFYX5FsC(T8D^=05dZpt!<T?2I0rQU1A(pnb
z2et$$c5+gfUlTe+lDC*~PK0y@bAyX0mS){^VuyUpb11lKzyxisLCYl4IuAycOSCTs
zltn5E1ld{Kq2y-r<No2Uk&eiMvQsR#fmy;%azOInty<^EZ&Gl)Nm?$8=)(Cn?N5^N
z6tf7aWLzpckzkO>?$H|q+^w!FawRjFRH$RJ^1ema+<>?9C7pR(a0g%w*}h73W#Aw1
z57EjB2?{fU0!~Eum4-t%sT)&ORW*czvgD!S)3DH#0UhEAhLT?_czLjejtpM@rPQg8
z{tt4S-gzH6_TROQpP#1nf8Xu@?&b3}?7y3Dz4m|nI45Cl+T>=pe!4>jU)u-!uZ~J!
zvO`~^pKNI=v8Absn|rPp<N9x9ZJgHs-~ayqx#s47*?7G1^!xt5kI&cG{|*2CZ`@@6
zHx}9dmNq4U{eJ_wb@MJbfX&-7)OSUMy#8Nzd<B@Z|9@V4?4JKmYEPbg-~adV`D@+(
z>HHt5i!AnByj>y+A~3ET=D#EqI}`MZy^)<6LsO^t^>5MxZRe;Nl`T?qZTPNL1fBYC
z@~91#c~^Un^okVzR-*2-FPx`3gxwTU$3K@r2?C)N(Trr$f(+NQWhrPu*FLAWYIM~b
zPNwb3XR<{VQv?JZ2HC8iHYHed*D0($N{|c!tuv*b)a>}B%R6+byIXCe;U~Cad^fd^
z`f=fF5?`=fS|MW=Kxg$(Hx6}U<u!=<A{w_9d9gs|)c$BPPoha{+8RdG0_3}#4+g8t
zekB$bdi0{tI0OnU4^*pHy$gXjo4Wk@r=&ZJqKxumv;4R~`-xe;K>JBMdK9_sugD9x
zdL!Ox?0~6okr1qlxMzM<Bvj#-txctF7FZv}^XOkim8>?nZaF2yO69eYS7NB(@CUHc
zD<dkAQz_9l94^|w@pb%)p_8(+@gg15*98uxqFshzn8}*~b{IFN)Vdb&?RVa<N}ppH
zhu_ws=LfPTH9FnTvGSa@DFP}8t-cE=!3fQ3p&;^pITzu-0KG+AkS6_Tk#Afl8(!i|
zCGpme3clbOG%<Wruo{V;=?NXpxKIOm(II}}-&E6znDcxJT!UFPu!bP^po(DDrg9ko
zSq9zNEJ`k0BgPjSRk&a^;`H(!I)Br1=sI{1)k2U<pdlWSK8~)P^N6ohwfDCNYFe_I
z=L$c)jQZj}OgQ>tv`QIWDiKKUL@)1G#m>a&>MP~>U_82rRx0IkdG-wc`X{Io{TKz>
z!cgzLwBnBnKTh-JBSyIg)HmRtFU`9827T2F<lLm1jr)+tw+(~)aK_tCZpUEWa-AGS
z@3{1?w3sOsL^=zTWx#KBQwSiaO&7c&TnK5C>7YINWKA4l6MQA(e9xI=z9y-|-vEWq
zP9q~?X$bwkTYvvWK5qPnR)2Ko7T`JhpN;j$DgE!$$KUn8_wxDc=zmDxVrM9weVYB0
z^oLzrBZTT10Z73-v0jamZB2f!w&uRqUck+iuSL?tW^`4&n;bj%+!j3vXK$5MmLyuX
zS1)*V03oU0)Q@(L8}a@w1f6P}QoMw{J=ZlKf*y!6+o$^&j$*C0z3ve;C)4q{b!(tU
z$l<i7R~DbdENpfFZaX0BQb`C$qoh|h(evGd*?WvrkHhRIalfM<olje%_NDQA-XC;g
z*e~#m6HZ|K+<N15|M&>47vr7d!^8ci7&QHS+1NhXdClL?_78UB=Kf*5Vk-d=;dbjU
z&t9Rt04oLh(Qa!<etm|a3v&+!!-+$`=#IM6ew$~KCjj7+8c~ldS*b=Q0$^8}i8(mV
zsHhZ8h8>VU!RRPz3qX^uYtR*D&SaA~VA<${83BVW<0vqV1+aTO8kBIw`Vv=_!Mdl6
zy1T>iRT{mrktKVYxk+Q5OV(7*N8ZU)7HH*VF;Z$IG;cn|gGYNUhoi%eiyz7PKxwQ|
zEeAVRY{mVZdfBsitLe>Ji9U-_{d4t7pxt=NDYUAe*~6J8*t=a(wNHQyI|PD|%Hjl_
z36y$=ffQY=ime@^(=~_OL{J-V;v<N<dANOYvVZgn${|jabPMnkp3^Lrwyeb_H9IyZ
zkgZXFwSNkMeINk;2*hwGTD4&nbM7l2HzDkdS<4!Muhy@J$Gc)KPs~coD^dUAJf8Q*
z(Vx*(uRney8d&!B30f>Ppg($Lw7^D)YN56p9DxQyA4SVsztsL*d$Ii8b@YBep7?Kf
z?f{z2|37{#7|C?}x9|M_y?p*M{Qtr}k`yqs$i1&(EK~8PRD>!HKIIR}*4*I`amC|b
zz+rv)5qw#$SJ`P^ry9{==infh#pnWr!%fUscV@rDpcKKkt@a=O7t`*Cz>8TjlXorh
zjX2AvpPbUE#E9wGcxDr3R420r1$DAK+w_exOec8RK+N#qlw!;UR>vxZ#^8K>P1QKR
zJ(c)#E7D`Si1DF4P<{v{>5EL2ak#yI@bXv;aVLJc-!yKbxDgG%5u*eK0A4x4ASE1V
z0<yEH!286-$@~PK;hD3-!^0$(3@^1Nb(Wl*!ZSqhg@dx2L8i@)wvx&!o?41D_<TF<
znG6`aJ+mi!r_EFLBTXYKY9g&MWpJA|;E?I-%L2Z=^Q#wd*nY(TUnH<i7Q{b<KrTCI
zeA?WP{*-=dsdu{-|3V1ju+T!7L2qbNLN@ixz03s}^(E=?hSszUC=ACWD0XnX^J}~(
zMg%kS@v<*C`7$>4=n;*K`^nf=y3C(j&J?}bJKI!uM{;N%r~QO{?)VA$`PqnMb^(WA
zs$DA$Dc+i?(EsE-$w`G=LYyssnTHgEJ0BHai=`sdC5r%I@l98O+456SL3k$P!5|1~
zDy$vd8jEjm1I!cUAe49lE}Y`WrnQ?GrStBwp-~;CRwCFB9%9Msj9sbABtXMWy_N`!
zyO5L?TUT>k!Qc&~+yo8)Q^zFZXwpLs1bB%i@a;d6h?3?^Ky;rBKCQ}}qmeNKgzM_3
z#5?;SDnxC8)c)0$N*@njYN_lMszz$*JgX$2sjA$lz)QmLc`8Kp+Lu^BGXWf-E<}LB
zc?m^<DrD^8%)Gp;rAfi2qY23UqYD^0OpxdoW`MICDMJKjKW!Q>tknxdNRT`-B)6HQ
z%pJ3WS}lUIjy;hPoM1fYERLs$Q^peeeQ=MCo8m;=-u->k<HI_;fH)f05k|~lLIIk)
zs3X`vflQzl9?z3hKH><*|E~7FD(4|XF$!QxY32o?q?|mz8KMK^6)wC5C!0DA`on%=
z<`h=&7XjFWq@Y`_#iHmufk78x-}FLVd7y=0U0`-IHYIcZ;6|`z9F%+>bB1o}36qvW
z!G|d+7u#?x4;U`8H_&X3c&ZQWK7#+Q|K8rGf>p<4l*zPzanV&!24q&?B`v;HogboJ
z$m{(0-~fUjGjmsLS=>Vr`jCVsuqyrqv1yn<UP;@nKL7vieQS3k$8o5?0>7fg<t_=4
z0P!OD5@lgY?2-{*0k99<J$rD507xQ>mw*A6d!_Y}6FZSC+0wmnoW$4GiDT#5z9-f?
zCnu5Q*vXHH$dy0kFWj!`$8^v13@}SBS4l8&Rz!DocXf4jb#-@j6<dixm_b97mziMa
zw*yfKbj}U=I3=JE1rU(|0m98Bm<CMkqT#HX3LB1~Ylids!<1G%D~|hF@YedsBmYL0
zn&G6PY!F<B_{p8GYrn~|Wa#rvcxF&k!w`L=&U1#WXNLQS4|OOiW*?ho=1Ja&aiYL1
z=X$p`zqQE;v&%3!75))NO)xP<urPnWAJ6KK6S+vNk7F+Sig1x}cgR^p7khv@C~O>Y
zA^mtzQ~EP3TlsR;v$-N2oxjj35vm{a+NJUuQ~p<pkX&TiBe@(cUspVmvuwn^3Owt%
zwP$522fa?~S#}yD2jVsD6<miULo_HLvyTQPx2KA(#P(;5TH3Y12x_&WYT$7XbX`%h
zI0I8oN(LWvVCYcTB_j8Zii$^Lb5t^^wt=Q57=+f3Y8q}kxSB?_T0V`qvgTIOyyw-P
zG|o;VX=mr~G_LcJ8X`cQZg961p3T%zb?vDG26lwa(*Vit-QNYM=Ob)MS*OL>F-Ac`
z=_G=($J~8#Pv7%)O2l$LXMc1KMk)!0b+_0bRIBxVpG^+$h9=O_lQUaG`e+XjUB2%g
zRjVL)Hb9#c)<34GEvDcurWi1ua53Jrog$?wU-}!h6F)^$L`I?iubdhJnzYb;@{;=!
zbEn9!6{wU{W}G2@)e48wuS7-79(Ru(S%9}WIQL`MkUPE6b~*<z0b()f5)uw4F`&AR
z-l~Xoq#;P&_J$e~_dz}vx(@dGbp^ajJCTnFbVe3SF)d4YO_YTdp{_I$b8kH^Fc5<0
zjL)BGeWTw{i4V;CcqOXa<GtzS1uab3ib1IQjWw-JIF>YyIL&7xK9Yz+F+w#tkRo_9
zfRd_SGiiltKZeL%t;;V-{!%zea+gL3KV79**xLe&g4_A6&2^!xfZJeKciJ7B)K9wg
zs_p8+sK`s>PF8V;Zjl>pt4Uy-3GM`7RlwtWCx#KOTr$Lw@JdW37^lH+htJ?Cl298E
zCt1s^{M}Q23vPwK^{^c*I=o(oj15n#cW1pS{U#OfGOF_!Lz3uvO@83YFi-0k8(Z&%
zYrQvm>kfHn?RxnbuaRf38qIcqhA&G92Yf}T-yyluhOM=sfN+DEm$f7v2J($gEIFhW
zDoX>jy?`QwmS>kEx%EXe=};Z_d4-&LMsco&d4m7<N^|4Nt_ENXBg|pp4ie^a`Mz*r
zu6AR%5<RjoSLpEkWci4=3tou73V%JQKVn;-gb38N;s!Z7;1D82muFt}`xxd69j+3}
zszTGAbyRTP*7DUp{s}IfmajJ9K%dCXqJq7O(5%w<Xvg=VLP!ND=xR_smF+{Hae1eP
zJFqNVN7Y;KY8AkF!?Q&G;SJm8*`S?Q7Y<T|qc}UJ&A5A1;vGdN7FV2mg`&wFvSg4!
z6+^HsU+r$QSz51=w)YZB;SnbWn6J7uL^7ytdOR2pYuA}#?k*15qxv@Q-k%!#I>Oo!
zDu$Q$5?_mdXp;69G68tl;}xDQ8U;~f4??qcG!kODfQN|FI)`7=u>wmMsL~AN&*t#&
z*YV$F&EyUOdFOZ5x6rMLA5&l>j58!T*iS%OVMz~1Y7`WF8NeYUhiaoh=4fpmu5m}b
zd~SRrf@yQc;aJja8BtR&_x7ql+9xuvcRd?)Yw-LHiru?9xIc@35!}jO?c?MWw2@VR
zolHEc_b2GEPqaJeAL==<Zy=WZ-iDpNItU70&>4A^d?PSev7_s=$>O8yh_UcF6A3#l
zg08*J6A{qEta?n_=f<j9Aau@`4r;4}#ca9wMSRGpX=q*8&;^P!+EM-&9tZX5PKaGF
z4V7%Pq*=2KV3ubN`sj6h6^ac!%A<@&tgskfs)9-0im>AZYWVWdEum(;v9rcm2r;Js
zBAhX^jzo7ml1;<}cDfc3`sFlq8G#Z^jS(=HqGYn}`d}*<mjeOIvd&!wlOj3M)JW=N
zbolVPi=PRooQpi^=3bpoIfpsqWyQ@5JoXXu75QB6KY5(Mi)~|=|CfcF!T<00{pY28
zFT(%#AKog^|1<gkSF(n>T~Tw<<Ms$1KmZO<8MNW93QH<J!MV`a!vw6zLe6>zn@%1P
zjX2v-mQv}j7@FyMo9PX2Mx6FWBw{>-o*z;wbWedsb;0Cp+#5a4T^OVF#fDZv71cr4
z&s{k?SpWkB28^N7;3xJSPK_CW>O8LBL63ucOXhVN!9oV|17GI6ok6NGVCpRh6-RZR
zu5S<Q(R+X<6cS!+7BP&ejNs?E!qhtuF?PV_9pJ$yz)wn8cS2@A@)FBly;-;VA|8;<
zhSJyfyr~Qye&+jU#Mb<%sPRAuOh&Cwc$v`xxr*^}-4F*?=JkL`>A=kZ--Q22>|G=X
z-Hf{(+i9mF8gjIK5KdG_Lqo_m<ySGTGT0IZysOu_YfRTA3st_X3foEta=PJa1&g9>
zUoK0T0)ELkhf@GjxYt=zs}#T9qhJ9MvQ;vqS$U%rI2=)fb6dkzlDYP0Bc-=$g^~Jo
znpm@XkHAGtRkOMA4M%fXk;7IlAOzUT#YXb-R(Aq^upTxjd3c~q&m8gAZL4)-EpWHH
z;+l6p-L!qW=_f0lIM$jqvsX~C_l?E?axSLf^})ms7c#`9|8rMr7wZBhSpUy1%%|tw
z`hPl^9qa#>@%^Xq|ME)Tt~EL?AA`)D%d0M^w(U;ydXA);IR*8UwR$c%S{dJ4csxXo
z9YH>CN06?VFM9feV>(!UZ@Sp+xzqJ{EyKM{LMXIRJy5m`E{J@C%wUj3Z>piaV_)Bv
z&QXmwgRgpCgeYaYmaVd^%b}4P;y6O4op=}<?0A&Scw=P5Ty<=`UU&mcv?`lB>xH{;
zi=IllVZcB{gj>&VZINjRe<MS&)6C7i+gb9qJ9TGw=SDGq6LTx&wY?z_x7H01G$$8W
zE;qF1oPW&~+GBGDt<*o0)<-jA?%@!IYQ?*i8^uDQQr@7#a)XeJ*GZ`a++#oyLKgjj
zHbw!uBY~2Bh?Pf0tgIpy1ht_w>I-yd6rf`1`es>RMw=9n!UBAAhglRt^tgzElgQ8C
zRr9mSrJTD87Hy7hLsDrs8H;z<MfS7;92k!d;!(O|TaHwVH>#y4L?-m6RJciz%?6MR
z58vP#gOHRzUj#tW-0QcHwsdS#$#mA7Po)N6M99(trJS!<P^P@nJ~bOH!gm??H*?C_
z-Ur(a#~qM5V6!~Gp*R>*2b||y&BmbvAqQ<%^%5G4mi_$EDm!RlZohu0wcre|sNNm~
z0(m-DJ)#=$%c7^uz5!wuROkXbXi<HzFP>xgc<-bQLzD*1xvCl<2^MO)UvAf$bv^oo
z+CG}TsR`(rj9rtmeOCR%?pc6TU%u*m8R+Ds>qeT6BQzdH0yHrPcu0sW#n-KfzJm(K
zC?0|lt!av2j53bh88jIlEXoph#{k#?+$y<M+9;NBMo>i<wFXEn6!SYb3p#R`bYA4-
zb?*=d#LD(kjA7U6IfropmbpZoFuX8sLgnBo`44#ZgX1RE$@xPyerL?cBx=wGOuyWu
zG=q&U5@AA^snJgHKC`;Xs?s3u46i%>D*QWZW`8kUq85&Z(g?rMbt<oR25p-cP}~#i
z^CkvWrI_)Ride4$hH=A63zxdac{WR~AqlaGBx{1-oYN*51*HjelkVXv;$A&vG}scv
zB@Qfmpkt_n-S#^D!BYv=89%Q)M-S0OwH886HDZv?CVH9=xMHcyXu&M`{R~>bh2Hs$
zT9q(Uoi1@aDN5`iT|73Xd+KfQtOF04&}$Rj1dG?n!YL>NRVrXz=QVizQaMflNAXKF
z@8^rkV1`{Pl=1CvVO^6e%5&TQ`0Wp`4hWUkWYC?3XR$|CAMLUcW%fYUZABUpFYUAu
z8u?u#dMJ~XPiSsqdcj@*qw@C4W=`o8a>K}!z&xH+-lCJtI;?XKEig!Cv;IQqS?&3s
z-JJheP@u&e!r+_E|2Y`;XkRzU@NYhhvA^>&5Gi4{PGRpInaRyH<;6->SV>mx6C0j|
zNON_>m|5qr_Jr+@k6{iX=Ua12{&b!<vqX{RHHbN8*88n0VMPgA$G}^6_Id?uS(tgu
z1mJRGyF4Kte#wV1WJHV@u;|i=B#MQJ5<q3hzSXY}zc6quzlK->WL50*(fGZ*i;m}=
z3x^Ag>^CGBs+jmNk+F9`7SOGjMi`T!6)5Y02<;4d)%v~UeYEvjamDB3ks3I1XhnL6
zVoa%f^=g;RC07?9v^QFqdawa{D60iLfOXal5t~bP4r6W^BSOrIU7ZFSBXPQ1ulTP(
ze$UAK_iX`B%KW#4Zo@cj!PcCQIKCSUp*QGI1Aj5m#@;2NC|bQ*8xopLQ&>0+T;2>7
z&nVm^66b=#x5FZXhzZY@ZNP6Rb|JKAy!nCahRci+>pQ_*#tuoCsyj^O?Oiu9r5
zb@}2#g>FDarF|tx9j)ApwgkM_z}MmuCp@X`KWy05BV1W&X*TQ7a0FOiEC|D~=^3!;
znXu^@vFUlS>6x(MD*VIN{xtig-Hujl%1f0#kDIAiz<x;s5;5T)n>A$~Z`g;2Jb_?_
za?*<nz{;dE%)H8tTRUr&axuSFnD&_9`b!$4;-rfg-{95${w;(j3rCgY#yO3{K@azf
zUSA<zfIu93Cq%*z3p<2Y#EdaD+|?H-UhF&qN6!GqZ+?ZuI5uqN8-9dnuRe0wC>f(#
zmzFhDwOet#0hcxV-hz7~PqL^~y19etK!a`Bd?yjR;qsY&!3FUaYXl*FE&(1edw}({
zAu%18h~QVSncJ_|Av$oU+pX99W{lt3>*@q@TfJrm=vOV9)={V1rW1ut%)4mL<_BQj
z^Qc{A{D4K=9R4h9qs|08pWu^#v#g1W+-@N(o8VLH19E(Tqy+4de2jOL@Z_8)La}GH
z+3`1g3*^tCB_)G~di?PfTq)$KTit4kV>8@tO~>Fl1;(Z-?yk{)Hn;P|H%#+@nOoI+
zj|i5pld6S2xPgYyWxx3_;u1B|0wtJH3YT+BWUp0_cL5l*sS48QQz~Bs^CQ6w+>dhE
z;eR8;YR7)T`ixF^En1y%<uxezP%$eJs3I8JF}32~hTg)+`*_yS5F1jHxuhtF5X^G)
zB37YLX9R-F1P1!HwC`+=^^6sF3EQuPZ7k7fbNhSPLMs<~;yTh(KeHuNqb})plb!-C
zd%$RAtR!wQpzv0~ccrdA>Bm2VDhoA;Cas<-m{$^|9{y^soUd%;OB)c4$cX*%0RTIP
zB`nDc)~dZ(0fYIzGP=2JWp8(PtE3OB+#qsmlS<X<TB<^<<+8x@eCBACxQaU$<9OiW
zDK5j*48cTi#|}i+o$G_F?Lk%+H{+@kOt|-`Xe{comU&s60Sz)~7pa7qGheKo9NOwb
zT=UShSYV+!rBQ5cbfkov9{!F3=x=&p!9;0-QrbSEvigW!2Gf+T{OxCmf|4q6<PW!@
z!aekdyW_w?WKYBf?cDu~D7Go0M6K89R&ds%H^78KE=YK6CXek$9$O`kJu-R9Ba){)
zB6-RN^4P)TDSOES=PvyKc-5k21mfuy8_F;DtWuzC6-v`X(rM5`GHOw}W#*Ti;)S^o
zSxnpFZ(;H2_g=nK+Pq!R!w_@j+!&z>Z77Dk;V}9Wx#)c!kG-V%3n4S+^~PoU0FbXJ
z7JFc8vR%H#T(d=-I$u>`s4V(}Tie%nDSPC%3wZZ3QtS?4hCmwy$6?^og_6hjhRJ8!
zc<mZ_$#27mci7X@4&E~)O(mw{o1vV)St)J)k3x*R3fC=aBaVu|q-dON4qh*B!>SMT
zEAH-YyS@1Mb=GlM0)AFuLkvp*IcW6ywsMxkFX%nKN``2g9*;KYdzMi%(9w^EmD|D3
z#H<MsPfy*Lg|=#Tp9p}2q@ow5Xu{E&c*IMIkuoz~p@HZWKdb{FVWW=2M{!g<+^Ss*
zt7<#PV1fG&J&!%$;fumGLx<0?opuvoO(0k!w;MfsU^U5&LAz?h%TnaJMs1nE1x1wW
zMXoC=c_b7xE^jgsdQFPZ?LUMS6qJV>Tlt%?%Lynh7lOAP8B9wHwF7Da^>oE~3Jg$N
zo7dq#!q<CceX|6isxfr*9+($1w7F+CS4-DS4ZU6{U_sM9|Mm^Ov#&M!7|VO(4xyl=
zWcM0fwgvQQX_b5<pe>vwe9MdG7SDumAjb7}D1^;};KG;BwIK&(&OPI^z2Vs0Uf0_=
zu6yeaT#_~OOD-Pk%-OE<v(Mt%TTamU5{4XHD;KwBNecfr;UrC9Xn6L!RHpcsTtF;Q
z1p})qHx#C+KsSoz&Fw<b1;$fVKpqOw1;|r1!0X$EZ3>f{C0Pd!5>=?;U7B#GnBQ|%
zDAO5m65}P%|4mFh_O)>JCo#sk>kYcLi^zq|HFuXGNkx$Ub`uYhbdYT?$hI3~%?q-o
zgXFh8Ao*<_q+Fa%!t*7SrjV*aZQjl^sH_SFsctB$Rh8Um$@B{$eD9>zvRp(ju3yh@
zA%csv=96sF8Fa|exPvBa_=0Zepj6%S0i`)Qs9&9~8p}RlWu1f9*UCQq!7Odc7K?ts
zEK3F6D;2>=i4Ra@LQB<VcyZSkh0>a<*7dbKm8~F4j0K!*ccF4{p|VowoLpm{xLBqv
zStjdhx$I_{vSb+(=!Om|SjG$LVwv)~U!ATR%RXQl%ak3K@j!Z5ro4W~zw>uIy}#q%
z{X4S%&oVwQt4mg|Gw8}V2hv_ZS<PnM=~4uHa!^KiQtcC#1lGz5hE7m*2N7<t9EdzX
zqc#lgIU4*R3jW5j+@{=#uY3rG6ba0Wp|S!%GvK}oa%N_Dp5hvc{{~czIKrcEI9-FA
zGAH~TQNlMlh(v~Uh1EF>5Fz{O=1iiabaq<Shwizs1a>i|_1uT(vT#gXb-7K}Fxm~2
zBh|LOdUb$K4;f_*<kQ_>IIUsaCI9F#pxaBTRv8^<C3(L><Wz}?meYC<(ZWVlFiW>*
zv|smVq5C6~cb5I2?8a%$Hu5xc)}JY3x@|kUut8XwiSR*}IqnA&rdj8WR)#~yNYrP0
zvkSY%4LXgYTlYiz$S{NsE##gP5!Bz=0IsqM_Q#6Mc-W}1s<m@)Z{RT=ctEX-haDiE
zWcC-|W0_|K@C@=lnr?Yo6Q?9QyXDfYy_Klx$`4G5q1t7FM`5IE^{m!1Cc$BcWGhDe
z)vH}6v@^mmzYz$=3Lz<EF=3>%3a>6$Iklf^-C8!QR%BzHTD}rgB{;H~Hm}8fW2f79
zu1IAHdkLqVu0$fMrbCxm4u|J|5giEA9Dq(2u+{-OUC76mC(IKI^h<y!$pFRf%IPR6
z%>dFe9e_?0DB@Igq5-iVcxkP+$8i=}N_7HsI3&mlF#GLC+-+m3z(87gxJZU+0>Fr%
zY_Qwwv>N^Dpfl)K_yL0h>CJQ(5vM4|B0Lky(9M2p(4_nWj$lPQqKqNaQ${poETc3e
z?gjYZseKl=>5`WQT{s)7*D77~?ErcD*cbqyFuxUus6^#ykgb~J0hj~i%8|g}lc4Lk
zAJgGonX-_$g~TSb5=st0>%Q4ke%5m|SnhEv;)Ufo0B!r$Y<p^U`v!}6VU?N{Z(Vjz
zFpLKkCDU8T%`wJY98SyeoU6=EHCY4e)mxq8x;plH4$1~Pfm=Kk9=ti#x^o!fZ%Xcr
z7)Y*iu5E_(_#M+wcFP@hpQ&a8IM+}#z7|>wqUm@IQ$bt~#Uvzp`qJd5?gR`0bq`vu
zT9q6PSUB^Fcz{I?=Q!0xT14YcHD^{_F$yb|-Mvy}dzY@~yG2fxR;S$nhfhE*PDm|{
zwaJe#4Yh6LOZc?AQY>uc%LT@)9!FB@$a^wHmwXGEGCf@@-eq{K@9uc9K(D{V2Mdgs
zF1yGrxioiZs(IAVmklPH!x#S!>3NtfLZCS{<`evOf=l_D?>b0Jb?TZ&$5QT60@+Pg
z7Mkr=l)|CeZzY)he6SkIhAS>M)N6uk#r;9A&qN-lne;H{>W>6=fqJ~hsgJwEn3)Qx
z@Ac-VFtFdtgqrr?-k*)d6|?(6880tiVzW!j?jxLKz`~+V`4%m<Vm3~8KZJwE51Q7Y
zcFzPOytcJlDp0=L-eq<ccq2Ay;ry-g?v2f@E&kx_F5JMBoU0*^xvlfk(eHJayx86~
z+~3p53N<Junxi;QFe>i~0_V2Z9q~Pi9`924U4VONA#3OlCTLtHzb=Y-!pQ<45ibLf
zIL-s?p@DdGW86^dz{MJPi_JNN6BE00A2V-2)((CoB==P+;e3ekpU<Ve?*H+kJ-@SW
zi2wIgE}eAwf6U}EWB-qr@?C=eN4NWTlizpU;rlCGA2d1Y136~$dUy2Dl*;zprW_WD
z-RlF-<7NdnG82w>lL<HxGpL;)(-sLF)7+z4Do7--WI=nhnbduz{kd%3d5UAx?$s;3
z(JA@cJ-dEl6a3pg@x1fI(*Oa)ei)!s+j9=<GDi>4l2vV(=@^#XX*H^ubj4;)V!)Er
zs#SV}HWjjmw5l#o(erH#Vns>ekeL2P*SB!MC;m1YsH~jFFh$g>7^O&+0}yiUZ)+?3
znol7J?*pFo60e<@IO112zi;(=4R8uU_+PA6uV>!N`I!92`PQmcV0SCrL$<8$1+_6m
z{?i{BNB(E#sr=8)CzE6Oe;FS)=}aVndk>qPeXF_5rnBG&DxI30PIup`K7jM06<2Px
zvj32$(|Jitlb1P17w+yAs9ILoDd)Fn?N>zg0C0suyy&ivzpsh;zimCBBC=V3K5Yz{
z|8&YHUGqOf{}|8z%lNL0sQz7Xw7=<UjOu==WSst!Bb!ulXwuAHx6`x0C^;Gxn${$G
z5H7919-C`DfHfv@Z1wty)&nXWXobzje$S#CGEkXl!q(<>xDTd@j(AB}(dZf&AeZ3A
zKfa#d+S<KSQ3XpSzqhG@h&A4mxUpL*SJsQ0w+lsM0aa-*12C85#;hBgTV?QxTrO^z
z0k-pNrNWvyue|Nk9%v~_&TdBeH938U9cW-mEE=U$*+n;!dt{mUIW(;3Q93#Y^*71%
z<TOO+-n?0XAu8|gZmn(PH+L$VYgDs;6vOf1ZGnfCMzu<lSVHA`zEt3ZgtNMMtzjL;
z#idJXA?r$+U&^>r7IRCcx@O#UEiI;8De3h5QZ$PGfC9U*ww2$xY3fLo>cWTSuF%%+
zv^#O;nKX_XT^;m#H5HF@{BQ?2xU;L;ajV&|`c&y<iL~LCWyjI;XdI5^SQp&59r_XZ
zGBNY3q1EU^v3R%Fu{(GvN;`on>()A*xr{-Z{G^8eg|RjGpF9u~`vnJB-g0<+#DBEw
zHvfxz2W3Cts>f51JCfJZxwg#&O}<uRZeIyIdjw+R@gH+N58mJEeKKt|`yKM2-Fet1
zR-g2btR8x(g@~$G;K7Mt!iQE5HZ*<GXcPOW-lA<pC#U;I^=6Y)yL4ififike#n@c;
zfbOp4&zKqLcoZPOb_6gkc;{YD9E}VM%YRt-)?w3IhLeR%067U9Hsj&p1Qksbsub6z
zs`K`vvbVh+<Mvz?yWY2{)JjxCl;QsVtD~1VdKd;;KKc#ajuw3`L^*UP6t<B4429US
zNf=_+s{3J(65(V<FToFN!jypb&sDqE3{waWkwSpCtVXE85Fr>s6zLv43I$Hr_M=)g
zR1v!yntQ{sZ5U{F{uYYC!$2P&0ACxFgnV&rgZ{If%c6cTdWH2WU6pWp;o=>tV80KP
zWb0+fsSujA5876!8P~F^{dy=yvRh$f1|Bqqnm*3CZKyIBZ#+zaa6;htAiOw}=ggss
zgqlcr0Ur)N?94tsPy`y)h3Gcewy1t!A2s^qh^kp!hl-Zo*oJfSz&hh%cc^bt5=Y@m
zE9=ow(2kStCvn61qW9Tf)sLP3ASrvtc(Z!(cYwprf9GkQe*c%vCCBGKm-1bD{AaqW
zyj_9Eck2biRiGzV*rdo~9pAXmtPQx+k+G30*I~~INs8f+9=NR8Xb(>2WQaF$4I=|M
zFOpk}N<8OOj@(M+l!Q#0+{&btgj|-~%4MAdykxq*ySugWl{63F_x~4u=c9hZ=6`lR
z<vRb(rjq0M@0arN2!R)V`@@~~Jg0gy<J+nW`nqtZKKFdvz)PNmdEfa@KbZgX3z>yf
zCY`49Kb@SP{~DQpzG$)Uzxn)U<DX6?QmF*~{T$jDBLCA1$+T<yGxOQhSpHweNA-~d
z5+C$-2!ykZ_tE)eobki_oYn2l!I^BF3edS$y-!ty{XwHyGXcjzk?<=JjmP7mT8L2X
zG80cO#?x7<XfCHy%jrx)iVHH6TudgTGcz-xF@cJ+@nkNZUVw_{Q_I<OVktYHUd*J@
zi@f63UL)~^)NGE-(0`Z6Yp+EKd{uUTK=+>arsC_$_H^^^&Fh8A^*6xH+|+#rT&s5x
zbgEsqD~*%G{rXgtFa>Z1Y?dH;Fgj5>vij3gP|HrC3_9>sEIQ+<fOcsrI>U++|KjU=
z`8+MJA#iUBZb)if%bJ=cQ~V}I{)Wo&@B0F~V3uHaCjB{DZX}NIf%jzyANX_gLqNSM
zJ0zF0$wWGtSxhaZ7nT%u$fSWC=)Vh+9pIayYICDHHLIp{+nEP-Jqd?@HaZiTf`L@C
z9<&?U?`Gr8L8I2_Xo+;t8V58bcxdV;R;$~r_eUBR6R_`~n1IhcB7T*s!;xN2W)e$D
z*bk%@a>{U|k|{b8GweSwAdFh|6T5<ZPuZT&L%!9+B>s1$*67u%cBj{<_oq1;vHQ`u
zoHa0M>Q+;kFMO(C%KqR0{>x4S;je0|M)#3*I)!G=Tg9w1-8ugK!9GP-qA7YxWdIwq
z^T~g{{wH7L`ahq`dDj2=vHjnrd_EE-8D{-YKFj()qy-QJ>3EXLf-FfbE+=!#>BZsF
zWduxI5+<8lPR=JX^BKy9OUZdf!pvtt;M0HE`tQHy;^GgBZsgoc{&|=E$OW(Y$q;LP
z@)_3r;QG(a1Ea0^+4ORDK9Nl>r54h;Y(`;$^dhhT{g*8<k*UTZF7***jgJ@>_lQ{4
zBieEv8MclmM_tF0Vb}41n$Jz;5!P`!%d*)-CP%mR3kx*KA@L$8R5Ocdxr#?zOL!#2
z`W-pv;(f02`pO+KEZdO_TC*?m<LiI=MXvw3g$3{WKR;goFXQu(M92@B5!ZhP9CH01
z(gNRIEX7kPlFBWomX?$0;ZkV?Ox%)bk?#5E4kI_8UPvvd`~Tbm2!HzT$m{=q#a%xi
zrjaxNh593F0KxU2n+rzN02Y^1$wV@>xRg%KYllFYEbjWVFJ{+owJm>Tfm3d{vY?P-
zG-V;6=5r6oD9Xapaw?agd;a-UHl0Z-qp`FA$^!m-5nFy(ywPNG>c8pc|7&9XPc6N`
z^*@tJXT9hDWBZRw`OLzF@k4Ho`RSWuv!udo=DlDzvAv)k!Qx*lNPuKKm5!$tVGokZ
zE+>cYL4sR%36;zul`DzN!s6mmZedY9*iA37UEY$|<|)=^>|B3yXRUI(uvXqJu0GPT
z4X6LBZ8}G1d=1#3f-CfYWUbTcf}K3NpoxQ6YD4^!&1|wjC>(#90KmZ`q%Lsc6`wDa
zOu)XQWCA|-IQdnoj}#UEsm09vQaYVcx8s={F2*@NPV1XRv-#rYnq$7$sMdoZ_jWR`
zE5Nvh2f^b=OK@1<qcgtHE;Gu2dbc)rC8SUV0>Ht+$#!9T^9B~cLxlk7?XA06S$nH_
zk{!ZQ+;WmC(23Rq-;vaye3?jtIyd)tYE#)}X&EmUmQvYlDyOndY7vz<_zz>83VSJJ
z9^pI$BLQNuPrfn&6Ox8?d@!WAU_E1T;Kjhw4tp6&Gj0niFB#5T8u`y)4$n)zzO#wu
z@PX(7+X0}lb5x@hTZtFFrj5VRKmLLW)}loJxp@B>s{iHExs+S~qiJLP?=rqCFU{>Y
z+VH^eD0=1evrkUH^UE*(?I&m7d=jO5jC*8aGBrVWGZXRnQN7unAn}fqbTmQkufPk)
zb~IA29?_gzee1BkO!`MeXDfDYLAMu2<R0Di*mOTM+sqt1tR)hO`xBycDxttN`cN~m
z_WPaYz^)Ta>>OYsK#_iD(5u$*eda6#0y~07n{&NR$DT7BRLe%v2?GkyTBi$-*R3W5
z53jMdyIp+a>28jQJuDG>%17i;XFwiWZ5!T+ihj#BGYJI}H(CGw&NnHAh}C8-F&~F+
zqV<nD1G<;ruag0IE@O}o0S#z@wVyO>l8PQQqIBrK{dcDy{_&ST|LNJsAF-i}x7kq1
zF_OexolFVT)V?8!CneNGl)LaV1GYN^+IQjMw48QY7VCwe8+bNeolJ|W*^z}L>ZA%b
z5n<i?@_V12e)xkgzxBhjAN~E=d+(h7=oe4_&nKt9`-`VP{MOTd`SIzK&%gZi$?3m-
zE6OMdoBh?vY5Fht79f+;@D>={3z7H%nM}rFQP#2pO&NO9`2|j)p8oa+Uq1O?r+@al
zv%mQDfBg0X=>O@@e*W~mcPR$1uBMY;{O;eLe*YJEiormm2O=sPAHxb}PRHJgMtUt0
z?}<Ho<VwD{efs%7o__f2bc%99I?ZZ@CU~nK{xNO!i_gB7PO_{oKKt(JM<1X!yqCzm
zdt?$`v60npkcpGU93}L9@Nz_xTh<?Sdg8r5ILMnwClwBeAVv%g5?=@3Q|&>^s<bIr
z_g7Onn#LbFSGc0S%1=n<s_l~pQ#8NZv}|}azKStQ8dW-o$R)$7jz;J>M%s<`A6X>6
z#wkHbAqM;OSATi-$v^%6#~(la<!@$B-~DS&h$o+){^t91kOdf$fOD9}Cmv>tRBH+|
z&vDX=T!yW5Lr*alwXJIPIwcTw?8W0D-0_NJ4!Xhd<qevLta0V+Z$3Z!?k8s-|MS_$
z-+KBF|8n~A`?SK}zw_SN`@iI^eEN5%-~N>K+%WWVa7EQ1+g532C6|r2Et`&G9A7z5
zc@_sB17gH9c&pc<;Pl_)Mau;a1IOkIFF~LL$jnK#iV5(>dV&!N`6H}VhyGetIbXb4
zD6eXzCBS;2RHj=QwXB>!t`a~)`54VzpAT;VZGZI6*$3}E{r1m)|IS~Ye)#Fx`+s`+
z?w=yfKl<Xc|HljQaU05Rk%-mnS&vqyC*M*5=H_PS$YY3B0?r0#4kW^2GWiz5-+S%;
zV~DBP0spN!r^*x3NnVTvYkg2h_;y`#IA_JvcYk*FgJ03LgNhPdTu%S@2l`5K_E%3%
zKl;B^W>OjQ#b@s@$@#@+??>@b4ba*VeefJ4x|c7nZFq99awg$lBJmm}2`}%_1Dw@P
zta9gG;nZd&dI1e1vKP}dU44H3)6?(0Pir{)%|}oF=9{PQ{u+jh{Qx>vyNo?`GR~=^
zsvdmE^$aCG6Y!{WQ6_x)lTW_<<Y!XuVK*2^6e|-^KqjZFmaR5$yHG4`?(W2*+8RLN
zkTR2Rsihy2w~6(Tu7)?rL}G$Wz18hOxSGk-<0)Fc(SFwQX(+Gg3t}MxQK6QHaIF+c
zEnh>M0ss~|fQr|IAmQon{`~a4?@~&s0(6?nu{kOMV^I*6v=3IVdK81X!l1wR<n(X<
zgs!P)-+yxU0h=_mhA*G|m`jHbKYIGJ-%tU5_U@;rpS<_wPrn_-g%_4W;Hda9XRm9o
zlDS&_c&<HYHg!hqVn72aoESI@5A5Qtv+sNdbI;!UbCs!n71g9dl+_U5>88jl#4{`B
zbn+#1VzGmLJ}?9H{=%vop_HQvo&D1{pZ)^YCZ>!iyo-w+OXZ+H`26&@AF??+IX$g6
z6N{1fVV$Ito+Vq;o4EF=u9rx#7rkK`f8%fbjlc0X{>I<<8-L?({EffyH~z-o_#1!Y
dZ~TqF@i+d)-}oDU<L@i{{eNwYzk>ik5CEW0a=QQk
literal 0
HcmV?d00001
@@ -13,6 +13,10 @@ CFLAGS += -DSXE_DPDK
CFLAGS += -DSXE_HOST_DRIVER
CFLAGS += -DSXE_DPDK_L4_FEATURES
CFLAGS += -DSXE_DPDK_SRIOV
+CFLAGS += -DSXE_DPDK_FILTER_CTRL
+CFLAGS += -DSXE_DPDK_MACSEC
+CFLAGS += -DSXE_DPDK_TM
+CFLAGS += -DSXE_DPDK_SIMD
CFLAGS += -O3
CFLAGS += $(WERROR_FLAGS)
@@ -86,6 +90,16 @@ SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxe_stats.c
SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxe_tx.c
SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxe_vf.c
+ifeq ($(CONFIG_RTE_ARCH_ARM64),y)
+SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxe_vec_neon.c
+else
+SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxe_vec_sse.c
+endif
+SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxe_filter_ctrl.c
+SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxe_fnav.c
+SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxe_macsec.c
+SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxe_tm.c
+
SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxevf_main.c
SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxevf_filter.c
SRCS-$(CONFIG_RTE_LIBRTE_SXE_PMD) += sxevf_msg.c
deleted file mode 100644
@@ -1,4 +0,0 @@
-dpdk_images_v0.1:
-只包含dodk源码,源码目录:/usr/src/dpdk
-dpdk_images_v0.2:
-包含dpdk源码和build下的原生编译产物
@@ -11,9 +11,9 @@
#include "sxe_common.h"
#define SXE_TRACE_ID_COUNT_MASK 0x00000000000000FFLLU
-#define SXE_TRACE_ID_TID_MASK 0x0000000000FFFF00LLU
+#define SXE_TRACE_ID_TID_MASK 0x0000000000FFFF00LLU
#define SXE_TRACE_ID_TIME_MASK 0x00FFFFFFFF000000LLU
-#define SXE_TRACE_ID_FLAG 0xFF00000000000000LLU
+#define SXE_TRACE_ID_FLAG 0xFF00000000000000LLU
#define SXE_TRACE_ID_COUNT_SHIFT 0
#define SXE_TRACE_ID_TID_SHIFT 8
@@ -22,18 +22,17 @@
#define SXE_SEC_TO_MS(sec) (sec * 1000ULL)
#define SXE_SEC_TO_NS(sec) (sec * 1000000000ULL)
-#define SXE_USEC_PER_MS 1000
+#define SXE_USEC_PER_MS 1000
-static u64 sxe_trace_id = 0;
+u64 sxe_trace_id;
u64 sxe_time_get_real_ms(void)
{
u64 ms = 0;
- struct timeval tv = { 0 };
+ struct timeval tv = { 0 };
s32 ret = gettimeofday(&tv, NULL);
- if(ret < 0) {
+ if (ret < 0)
goto l_end;
- }
ms = SXE_SEC_TO_MS(tv.tv_sec) + tv.tv_usec / SXE_USEC_PER_MS;
@@ -43,8 +42,8 @@ u64 sxe_time_get_real_ms(void)
u64 sxe_trace_id_gen(void)
{
- u64 tid = getpid() + (pthread_self() << 20);
- u64 index = 0;
+ u64 tid = getpid() + (pthread_self() << 20);
+ u64 index = 0;
u64 timestamp = sxe_time_get_real_ms();
sxe_trace_id = (SXE_TRACE_ID_FLAG)
@@ -57,7 +56,6 @@ u64 sxe_trace_id_gen(void)
void sxe_trace_id_clean(void)
{
sxe_trace_id = 0;
- return;
}
u64 sxe_trace_id_get(void)
@@ -19,27 +19,27 @@
#ifdef SXE_TEST
#define STATIC
#else
-#define STATIC static
+#define static static
#endif
#ifndef DIV_ROUND_UP
-#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
+#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
#endif
#define __iomem
#define __force
-#define min(a,b) RTE_MIN(a,b)
+#define min(a, b) RTE_MIN(a, b)
#ifdef __has_attribute
#if __has_attribute(__fallthrough__)
# define fallthrough __attribute__((__fallthrough__))
#else
-# define fallthrough do {} while (0)
-#endif
+# define fallthrough do {} while (0)
+#endif
#else
-# define fallthrough do {} while (0)
-#endif
+# define fallthrough do {} while (0)
+#endif
#define __swab32(_value) \
(((u32)(_value) >> 24) | (((u32)(_value) & 0x00FF0000) >> 8) | \
@@ -74,7 +74,7 @@
#define mdelay rte_delay_ms
#define udelay rte_delay_us
#define usleep_range(min, max) rte_delay_us(min)
-#define msleep(x) rte_delay_us(x*1000)
+#define msleep(x) rte_delay_us(x*1000)
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
#define BIT(x) (1UL << (x))
@@ -82,15 +82,15 @@
#define NSEC_PER_SEC 1000000000L
-#define ETH_P_1588 0x88F7
+#define ETH_P_1588 0x88F7
#define VLAN_PRIO_SHIFT 13
static inline void
set_bit(unsigned long nr, void *addr)
{
- int *m = ((int *)addr) + (nr >> 5);
- *m |= 1 << (nr & 31);
+ int *m = ((int *)addr) + (nr >> 5);
+ *m |= 1 << (nr & 31);
}
static inline int
@@ -137,7 +137,6 @@ static inline u32 sxe_read_addr(const volatile void *addr)
static inline void sxe_write_addr(u32 value, volatile void *addr)
{
rte_write32((rte_cpu_to_le_32(value)), addr);
- return;
}
#endif
@@ -19,7 +19,7 @@ int sxe_eth_dev_callback_process(struct rte_eth_dev *dev,
#define __rte_cold __attribute__((cold))
-#define ETH_SPEED_NUM_UNKNOWN UINT32_MAX
+#define ETH_SPEED_NUM_UNKNOWN UINT32_MAX
#ifdef RTE_ARCH_ARM64
#define RTE_ARCH_ARM
#endif
@@ -38,131 +38,129 @@ int sxe_eth_dev_callback_process(struct rte_eth_dev *dev,
#if defined DPDK_20_11_5 || defined DPDK_19_11_6
-#define RTE_ETH_RSS_IPV4 ETH_RSS_IPV4
-#define RTE_ETH_RSS_NONFRAG_IPV4_TCP ETH_RSS_NONFRAG_IPV4_TCP
-#define RTE_ETH_RSS_NONFRAG_IPV4_UDP ETH_RSS_NONFRAG_IPV4_UDP
-#define RTE_ETH_RSS_IPV6 ETH_RSS_IPV6
-#define RTE_ETH_RSS_NONFRAG_IPV6_TCP ETH_RSS_NONFRAG_IPV6_TCP
-#define RTE_ETH_RSS_NONFRAG_IPV6_UDP ETH_RSS_NONFRAG_IPV6_UDP
-#define RTE_ETH_RSS_IPV6_EX ETH_RSS_IPV6_EX
-#define RTE_ETH_RSS_IPV6_TCP_EX ETH_RSS_IPV6_TCP_EX
-#define RTE_ETH_RSS_IPV6_UDP_EX ETH_RSS_IPV6_UDP_EX
+#define RTE_ETH_RSS_IPV4 ETH_RSS_IPV4
+#define RTE_ETH_RSS_NONFRAG_IPV4_TCP ETH_RSS_NONFRAG_IPV4_TCP
+#define RTE_ETH_RSS_NONFRAG_IPV4_UDP ETH_RSS_NONFRAG_IPV4_UDP
+#define RTE_ETH_RSS_IPV6 ETH_RSS_IPV6
+#define RTE_ETH_RSS_NONFRAG_IPV6_TCP ETH_RSS_NONFRAG_IPV6_TCP
+#define RTE_ETH_RSS_NONFRAG_IPV6_UDP ETH_RSS_NONFRAG_IPV6_UDP
+#define RTE_ETH_RSS_IPV6_EX ETH_RSS_IPV6_EX
+#define RTE_ETH_RSS_IPV6_TCP_EX ETH_RSS_IPV6_TCP_EX
+#define RTE_ETH_RSS_IPV6_UDP_EX ETH_RSS_IPV6_UDP_EX
-#define RTE_ETH_VLAN_TYPE_UNKNOWN ETH_VLAN_TYPE_UNKNOWN
-#define RTE_ETH_VLAN_TYPE_INNER ETH_VLAN_TYPE_INNER
-#define RTE_ETH_VLAN_TYPE_OUTER ETH_VLAN_TYPE_OUTER
-#define RTE_ETH_VLAN_TYPE_MAX ETH_VLAN_TYPE_MAX
+#define RTE_ETH_VLAN_TYPE_UNKNOWN ETH_VLAN_TYPE_UNKNOWN
+#define RTE_ETH_VLAN_TYPE_INNER ETH_VLAN_TYPE_INNER
+#define RTE_ETH_VLAN_TYPE_OUTER ETH_VLAN_TYPE_OUTER
+#define RTE_ETH_VLAN_TYPE_MAX ETH_VLAN_TYPE_MAX
-#define RTE_ETH_8_POOLS ETH_8_POOLS
-#define RTE_ETH_16_POOLS ETH_16_POOLS
-#define RTE_ETH_32_POOLS ETH_32_POOLS
-#define RTE_ETH_64_POOLS ETH_64_POOLS
+#define RTE_ETH_8_POOLS ETH_8_POOLS
+#define RTE_ETH_16_POOLS ETH_16_POOLS
+#define RTE_ETH_32_POOLS ETH_32_POOLS
+#define RTE_ETH_64_POOLS ETH_64_POOLS
-#define RTE_ETH_4_TCS ETH_4_TCS
-#define RTE_ETH_8_TCS ETH_8_TCS
+#define RTE_ETH_4_TCS ETH_4_TCS
+#define RTE_ETH_8_TCS ETH_8_TCS
-#define RTE_ETH_MQ_RX_NONE ETH_MQ_RX_NONE
-#define RTE_ETH_MQ_RX_RSS ETH_MQ_RX_RSS
-#define RTE_ETH_MQ_RX_DCB ETH_MQ_RX_DCB
-#define RTE_ETH_MQ_RX_DCB_RSS ETH_MQ_RX_DCB_RSS
-#define RTE_ETH_MQ_RX_VMDQ_ONLY ETH_MQ_RX_VMDQ_ONLY
-#define RTE_ETH_MQ_RX_VMDQ_RSS ETH_MQ_RX_VMDQ_RSS
-#define RTE_ETH_MQ_RX_VMDQ_DCB ETH_MQ_RX_VMDQ_DCB
+#define RTE_ETH_MQ_RX_NONE ETH_MQ_RX_NONE
+#define RTE_ETH_MQ_RX_RSS ETH_MQ_RX_RSS
+#define RTE_ETH_MQ_RX_DCB ETH_MQ_RX_DCB
+#define RTE_ETH_MQ_RX_DCB_RSS ETH_MQ_RX_DCB_RSS
+#define RTE_ETH_MQ_RX_VMDQ_ONLY ETH_MQ_RX_VMDQ_ONLY
+#define RTE_ETH_MQ_RX_VMDQ_RSS ETH_MQ_RX_VMDQ_RSS
+#define RTE_ETH_MQ_RX_VMDQ_DCB ETH_MQ_RX_VMDQ_DCB
#define RTE_ETH_MQ_RX_VMDQ_DCB_RSS ETH_MQ_RX_VMDQ_DCB_RSS
-#define RTE_ETH_MQ_TX_NONE ETH_MQ_TX_NONE
-#define RTE_ETH_MQ_TX_DCB ETH_MQ_TX_DCB
-#define RTE_ETH_MQ_TX_VMDQ_DCB ETH_MQ_TX_VMDQ_DCB
-#define RTE_ETH_MQ_TX_VMDQ_ONLY ETH_MQ_TX_VMDQ_ONLY
+#define RTE_ETH_MQ_TX_NONE ETH_MQ_TX_NONE
+#define RTE_ETH_MQ_TX_DCB ETH_MQ_TX_DCB
+#define RTE_ETH_MQ_TX_VMDQ_DCB ETH_MQ_TX_VMDQ_DCB
+#define RTE_ETH_MQ_TX_VMDQ_ONLY ETH_MQ_TX_VMDQ_ONLY
-#define RTE_ETH_FC_NONE RTE_FC_NONE
-#define RTE_ETH_FC_RX_PAUSE RTE_FC_RX_PAUSE
-#define RTE_ETH_FC_TX_PAUSE RTE_FC_TX_PAUSE
-#define RTE_ETH_FC_FULL RTE_FC_FULL
+#define RTE_ETH_FC_NONE RTE_FC_NONE
+#define RTE_ETH_FC_RX_PAUSE RTE_FC_RX_PAUSE
+#define RTE_ETH_FC_TX_PAUSE RTE_FC_TX_PAUSE
+#define RTE_ETH_FC_FULL RTE_FC_FULL
-#define RTE_ETH_MQ_RX_RSS_FLAG ETH_MQ_RX_RSS_FLAG
-#define RTE_ETH_MQ_RX_DCB_FLAG ETH_MQ_RX_DCB_FLAG
-#define RTE_ETH_MQ_RX_VMDQ_FLAG ETH_MQ_RX_VMDQ_FLAG
+#define RTE_ETH_MQ_RX_RSS_FLAG ETH_MQ_RX_RSS_FLAG
+#define RTE_ETH_MQ_RX_DCB_FLAG ETH_MQ_RX_DCB_FLAG
+#define RTE_ETH_MQ_RX_VMDQ_FLAG ETH_MQ_RX_VMDQ_FLAG
-#define RTE_ETH_RX_OFFLOAD_VLAN_STRIP DEV_RX_OFFLOAD_VLAN_STRIP
-#define RTE_ETH_RX_OFFLOAD_IPV4_CKSUM DEV_RX_OFFLOAD_IPV4_CKSUM
-#define RTE_ETH_RX_OFFLOAD_UDP_CKSUM DEV_RX_OFFLOAD_UDP_CKSUM
-#define RTE_ETH_RX_OFFLOAD_TCP_CKSUM DEV_RX_OFFLOAD_TCP_CKSUM
-#define RTE_ETH_RX_OFFLOAD_TCP_LRO DEV_RX_OFFLOAD_TCP_LRO
-#define RTE_ETH_RX_OFFLOAD_QINQ_STRIP DEV_RX_OFFLOAD_QINQ_STRIP
+#define RTE_ETH_RX_OFFLOAD_VLAN_STRIP DEV_RX_OFFLOAD_VLAN_STRIP
+#define RTE_ETH_RX_OFFLOAD_IPV4_CKSUM DEV_RX_OFFLOAD_IPV4_CKSUM
+#define RTE_ETH_RX_OFFLOAD_UDP_CKSUM DEV_RX_OFFLOAD_UDP_CKSUM
+#define RTE_ETH_RX_OFFLOAD_TCP_CKSUM DEV_RX_OFFLOAD_TCP_CKSUM
+#define RTE_ETH_RX_OFFLOAD_TCP_LRO DEV_RX_OFFLOAD_TCP_LRO
+#define RTE_ETH_RX_OFFLOAD_QINQ_STRIP DEV_RX_OFFLOAD_QINQ_STRIP
#define RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM
-#define RTE_ETH_RX_OFFLOAD_MACSEC_STRIP DEV_RX_OFFLOAD_MACSEC_STRIP
-#define RTE_ETH_RX_OFFLOAD_VLAN_FILTER DEV_RX_OFFLOAD_VLAN_FILTER
-#define RTE_ETH_RX_OFFLOAD_VLAN_EXTEND DEV_RX_OFFLOAD_VLAN_EXTEND
-#define RTE_ETH_RX_OFFLOAD_SCATTER DEV_RX_OFFLOAD_SCATTER
-#define RTE_ETH_RX_OFFLOAD_TIMESTAMP DEV_RX_OFFLOAD_TIMESTAMP
-#define RTE_ETH_RX_OFFLOAD_SECURITY DEV_RX_OFFLOAD_SECURITY
-#define RTE_ETH_RX_OFFLOAD_KEEP_CRC DEV_RX_OFFLOAD_KEEP_CRC
-#define RTE_ETH_RX_OFFLOAD_SCTP_CKSUM DEV_RX_OFFLOAD_SCTP_CKSUM
+#define RTE_ETH_RX_OFFLOAD_MACSEC_STRIP DEV_RX_OFFLOAD_MACSEC_STRIP
+#define RTE_ETH_RX_OFFLOAD_VLAN_FILTER DEV_RX_OFFLOAD_VLAN_FILTER
+#define RTE_ETH_RX_OFFLOAD_VLAN_EXTEND DEV_RX_OFFLOAD_VLAN_EXTEND
+#define RTE_ETH_RX_OFFLOAD_SCATTER DEV_RX_OFFLOAD_SCATTER
+#define RTE_ETH_RX_OFFLOAD_TIMESTAMP DEV_RX_OFFLOAD_TIMESTAMP
+#define RTE_ETH_RX_OFFLOAD_SECURITY DEV_RX_OFFLOAD_SECURITY
+#define RTE_ETH_RX_OFFLOAD_KEEP_CRC DEV_RX_OFFLOAD_KEEP_CRC
+#define RTE_ETH_RX_OFFLOAD_SCTP_CKSUM DEV_RX_OFFLOAD_SCTP_CKSUM
#define RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM DEV_RX_OFFLOAD_OUTER_UDP_CKSUM
-#define RTE_ETH_RX_OFFLOAD_RSS_HASH DEV_RX_OFFLOAD_RSS_HASH
+#define RTE_ETH_RX_OFFLOAD_RSS_HASH DEV_RX_OFFLOAD_RSS_HASH
-#define RTE_ETH_TX_OFFLOAD_VLAN_INSERT DEV_TX_OFFLOAD_VLAN_INSERT
-#define RTE_ETH_TX_OFFLOAD_IPV4_CKSUM DEV_TX_OFFLOAD_IPV4_CKSUM
-#define RTE_ETH_TX_OFFLOAD_UDP_CKSUM DEV_TX_OFFLOAD_UDP_CKSUM
-#define RTE_ETH_TX_OFFLOAD_TCP_CKSUM DEV_TX_OFFLOAD_TCP_CKSUM
-#define RTE_ETH_TX_OFFLOAD_SCTP_CKSUM DEV_TX_OFFLOAD_SCTP_CKSUM
-#define RTE_ETH_TX_OFFLOAD_TCP_TSO DEV_TX_OFFLOAD_TCP_TSO
-#define RTE_ETH_TX_OFFLOAD_UDP_TSO DEV_TX_OFFLOAD_UDP_TSO
+#define RTE_ETH_TX_OFFLOAD_VLAN_INSERT DEV_TX_OFFLOAD_VLAN_INSERT
+#define RTE_ETH_TX_OFFLOAD_IPV4_CKSUM DEV_TX_OFFLOAD_IPV4_CKSUM
+#define RTE_ETH_TX_OFFLOAD_UDP_CKSUM DEV_TX_OFFLOAD_UDP_CKSUM
+#define RTE_ETH_TX_OFFLOAD_TCP_CKSUM DEV_TX_OFFLOAD_TCP_CKSUM
+#define RTE_ETH_TX_OFFLOAD_SCTP_CKSUM DEV_TX_OFFLOAD_SCTP_CKSUM
+#define RTE_ETH_TX_OFFLOAD_TCP_TSO DEV_TX_OFFLOAD_TCP_TSO
+#define RTE_ETH_TX_OFFLOAD_UDP_TSO DEV_TX_OFFLOAD_UDP_TSO
#define RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM
-#define RTE_ETH_TX_OFFLOAD_QINQ_INSERT DEV_TX_OFFLOAD_QINQ_INSERT
-#define RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO DEV_TX_OFFLOAD_VXLAN_TNL_TSO
-#define RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO DEV_TX_OFFLOAD_GRE_TNL_TSO
-#define RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO DEV_TX_OFFLOAD_IPIP_TNL_TSO
+#define RTE_ETH_TX_OFFLOAD_QINQ_INSERT DEV_TX_OFFLOAD_QINQ_INSERT
+#define RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO DEV_TX_OFFLOAD_VXLAN_TNL_TSO
+#define RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO DEV_TX_OFFLOAD_GRE_TNL_TSO
+#define RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO DEV_TX_OFFLOAD_IPIP_TNL_TSO
#define RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO DEV_TX_OFFLOAD_GENEVE_TNL_TSO
-#define RTE_ETH_TX_OFFLOAD_MACSEC_INSERT DEV_TX_OFFLOAD_MACSEC_INSERT
-#define RTE_ETH_TX_OFFLOAD_MT_LOCKFREE DEV_TX_OFFLOAD_MT_LOCKFREE
-#define RTE_ETH_TX_OFFLOAD_MULTI_SEGS DEV_TX_OFFLOAD_MULTI_SEGS
+#define RTE_ETH_TX_OFFLOAD_MACSEC_INSERT DEV_TX_OFFLOAD_MACSEC_INSERT
+#define RTE_ETH_TX_OFFLOAD_MT_LOCKFREE DEV_TX_OFFLOAD_MT_LOCKFREE
+#define RTE_ETH_TX_OFFLOAD_MULTI_SEGS DEV_TX_OFFLOAD_MULTI_SEGS
#define RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE DEV_TX_OFFLOAD_MBUF_FAST_FREE
-#define RTE_ETH_TX_OFFLOAD_SECURITY DEV_TX_OFFLOAD_SECURITY
-#define RTE_ETH_TX_OFFLOAD_UDP_TNL_TSO DEV_TX_OFFLOAD_UDP_TNL_TSO
-#define RTE_ETH_TX_OFFLOAD_IP_TNL_TSO DEV_TX_OFFLOAD_IP_TNL_TSO
+#define RTE_ETH_TX_OFFLOAD_SECURITY DEV_TX_OFFLOAD_SECURITY
+#define RTE_ETH_TX_OFFLOAD_UDP_TNL_TSO DEV_TX_OFFLOAD_UDP_TNL_TSO
+#define RTE_ETH_TX_OFFLOAD_IP_TNL_TSO DEV_TX_OFFLOAD_IP_TNL_TSO
#define RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM DEV_TX_OFFLOAD_OUTER_UDP_CKSUM
#define RTE_ETH_TX_OFFLOAD_SEND_ON_TIMESTAMP DEV_TX_OFFLOAD_SEND_ON_TIMESTAMP
-#define RTE_ETH_LINK_SPEED_AUTONEG ETH_LINK_SPEED_AUTONEG
-#define RTE_ETH_LINK_SPEED_FIXED ETH_LINK_SPEED_FIXED
-#define RTE_ETH_LINK_SPEED_1G ETH_LINK_SPEED_1G
-#define RTE_ETH_LINK_SPEED_10G ETH_LINK_SPEED_10G
+#define RTE_ETH_LINK_SPEED_AUTONEG ETH_LINK_SPEED_AUTONEG
+#define RTE_ETH_LINK_SPEED_FIXED ETH_LINK_SPEED_FIXED
+#define RTE_ETH_LINK_SPEED_1G ETH_LINK_SPEED_1G
+#define RTE_ETH_LINK_SPEED_10G ETH_LINK_SPEED_10G
-#define RTE_ETH_SPEED_NUM_NONE ETH_SPEED_NUM_NONE
-#define RTE_ETH_SPEED_NUM_1G ETH_SPEED_NUM_1G
-#define RTE_ETH_SPEED_NUM_10G ETH_SPEED_NUM_10G
-#define RTE_ETH_SPEED_NUM_UNKNOWN ETH_SPEED_NUM_UNKNOWN
+#define RTE_ETH_SPEED_NUM_NONE ETH_SPEED_NUM_NONE
+#define RTE_ETH_SPEED_NUM_1G ETH_SPEED_NUM_1G
+#define RTE_ETH_SPEED_NUM_10G ETH_SPEED_NUM_10G
+#define RTE_ETH_SPEED_NUM_UNKNOWN ETH_SPEED_NUM_UNKNOWN
-#define RTE_ETH_LINK_HALF_DUPLEX ETH_LINK_HALF_DUPLEX
-#define RTE_ETH_LINK_FULL_DUPLEX ETH_LINK_FULL_DUPLEX
-#define RTE_ETH_LINK_DOWN ETH_LINK_DOWN
-#define RTE_ETH_LINK_UP ETH_LINK_UP
+#define RTE_ETH_LINK_HALF_DUPLEX ETH_LINK_HALF_DUPLEX
+#define RTE_ETH_LINK_FULL_DUPLEX ETH_LINK_FULL_DUPLEX
+#define RTE_ETH_LINK_DOWN ETH_LINK_DOWN
+#define RTE_ETH_LINK_UP ETH_LINK_UP
-#define RTE_ETH_RSS_RETA_SIZE_128 ETH_RSS_RETA_SIZE_128
-#define RTE_ETH_RETA_GROUP_SIZE RTE_RETA_GROUP_SIZE
-
+#define RTE_ETH_RSS_RETA_SIZE_128 ETH_RSS_RETA_SIZE_128
+#define RTE_ETH_RETA_GROUP_SIZE RTE_RETA_GROUP_SIZE
#define RTE_ETH_VMDQ_MAX_VLAN_FILTERS ETH_VMDQ_MAX_VLAN_FILTERS
#define RTE_ETH_DCB_NUM_USER_PRIORITIES ETH_DCB_NUM_USER_PRIORITIES
-#define RTE_ETH_VMDQ_DCB_NUM_QUEUES ETH_VMDQ_DCB_NUM_QUEUES
-#define RTE_ETH_DCB_NUM_QUEUES ETH_DCB_NUM_QUEUES
-
+#define RTE_ETH_VMDQ_DCB_NUM_QUEUES ETH_VMDQ_DCB_NUM_QUEUES
+#define RTE_ETH_DCB_NUM_QUEUES ETH_DCB_NUM_QUEUES
-#define RTE_ETH_DCB_PFC_SUPPORT ETH_DCB_PFC_SUPPORT
+#define RTE_ETH_DCB_PFC_SUPPORT ETH_DCB_PFC_SUPPORT
#define RTE_ETH_VLAN_STRIP_OFFLOAD ETH_VLAN_STRIP_OFFLOAD
@@ -170,74 +168,73 @@ int sxe_eth_dev_callback_process(struct rte_eth_dev *dev,
#define RTE_ETH_VLAN_EXTEND_OFFLOAD ETH_VLAN_EXTEND_OFFLOAD
#define RTE_ETH_QINQ_STRIP_OFFLOAD ETH_QINQ_STRIP_OFFLOAD
-#define RTE_ETH_VLAN_STRIP_MASK ETH_VLAN_STRIP_MASK
-#define RTE_ETH_VLAN_FILTER_MASK ETH_VLAN_FILTER_MASK
-#define RTE_ETH_VLAN_EXTEND_MASK ETH_VLAN_EXTEND_MASK
-#define RTE_ETH_QINQ_STRIP_MASK ETH_QINQ_STRIP_MASK
-#define RTE_ETH_VLAN_ID_MAX ETH_VLAN_ID_MAX
+#define RTE_ETH_VLAN_STRIP_MASK ETH_VLAN_STRIP_MASK
+#define RTE_ETH_VLAN_FILTER_MASK ETH_VLAN_FILTER_MASK
+#define RTE_ETH_VLAN_EXTEND_MASK ETH_VLAN_EXTEND_MASK
+#define RTE_ETH_QINQ_STRIP_MASK ETH_QINQ_STRIP_MASK
+#define RTE_ETH_VLAN_ID_MAX ETH_VLAN_ID_MAX
#define RTE_ETH_NUM_RECEIVE_MAC_ADDR ETH_NUM_RECEIVE_MAC_ADDR
#define RTE_ETH_VMDQ_NUM_UC_HASH_ARRAY ETH_VMDQ_NUM_UC_HASH_ARRAY
-#define RTE_ETH_VMDQ_ACCEPT_UNTAG ETH_VMDQ_ACCEPT_UNTAG
-#define RTE_ETH_VMDQ_ACCEPT_HASH_MC ETH_VMDQ_ACCEPT_HASH_MC
-#define RTE_ETH_VMDQ_ACCEPT_HASH_UC ETH_VMDQ_ACCEPT_HASH_UC
+#define RTE_ETH_VMDQ_ACCEPT_UNTAG ETH_VMDQ_ACCEPT_UNTAG
+#define RTE_ETH_VMDQ_ACCEPT_HASH_MC ETH_VMDQ_ACCEPT_HASH_MC
+#define RTE_ETH_VMDQ_ACCEPT_HASH_UC ETH_VMDQ_ACCEPT_HASH_UC
#define RTE_ETH_VMDQ_ACCEPT_BROADCAST ETH_VMDQ_ACCEPT_BROADCAST
#define RTE_ETH_VMDQ_ACCEPT_MULTICAST ETH_VMDQ_ACCEPT_MULTICAST
-#define RTE_VLAN_HLEN 4
-
-
-#define RTE_MBUF_F_RX_VLAN PKT_RX_VLAN
-#define RTE_MBUF_F_RX_RSS_HASH PKT_RX_RSS_HASH
-#define RTE_MBUF_F_RX_FDIR PKT_RX_FDIR
-#define RTE_MBUF_F_RX_OUTER_IP_CKSUM_BAD PKT_RX_EIP_CKSUM_BAD
-#define RTE_MBUF_F_RX_VLAN_STRIPPED PKT_RX_VLAN_STRIPPED
-#define RTE_MBUF_F_RX_IP_CKSUM_MASK PKT_RX_IP_CKSUM_MASK
-#define RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN
-#define RTE_MBUF_F_RX_IP_CKSUM_BAD PKT_RX_IP_CKSUM_BAD
-#define RTE_MBUF_F_RX_IP_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD
-#define RTE_MBUF_F_RX_IP_CKSUM_NONE PKT_RX_IP_CKSUM_NONE
-#define RTE_MBUF_F_RX_L4_CKSUM_MASK PKT_RX_L4_CKSUM_MASK
-#define RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN PKT_RX_L4_CKSUM_UNKNOWN
-#define RTE_MBUF_F_RX_L4_CKSUM_BAD PKT_RX_L4_CKSUM_BAD
-#define RTE_MBUF_F_RX_L4_CKSUM_GOOD PKT_RX_L4_CKSUM_GOOD
-#define RTE_MBUF_F_RX_L4_CKSUM_NONE PKT_RX_L4_CKSUM_NONE
-#define RTE_MBUF_F_RX_IEEE1588_PTP PKT_RX_IEEE1588_PTP
-#define RTE_MBUF_F_RX_IEEE1588_TMST PKT_RX_IEEE1588_TMST
-#define RTE_MBUF_F_RX_FDIR_ID PKT_RX_FDIR_ID
-#define RTE_MBUF_F_RX_FDIR_FLX PKT_RX_FDIR_FLX
-#define RTE_MBUF_F_RX_QINQ_STRIPPED PKT_RX_QINQ_STRIPPED
-#define RTE_MBUF_F_RX_LRO PKT_RX_LRO
-#define RTE_MBUF_F_RX_SEC_OFFLOAD PKT_RX_SEC_OFFLOAD
+#define RTE_VLAN_HLEN 4
+
+#define RTE_MBUF_F_RX_VLAN PKT_RX_VLAN
+#define RTE_MBUF_F_RX_RSS_HASH PKT_RX_RSS_HASH
+#define RTE_MBUF_F_RX_FDIR PKT_RX_FDIR
+#define RTE_MBUF_F_RX_OUTER_IP_CKSUM_BAD PKT_RX_EIP_CKSUM_BAD
+#define RTE_MBUF_F_RX_VLAN_STRIPPED PKT_RX_VLAN_STRIPPED
+#define RTE_MBUF_F_RX_IP_CKSUM_MASK PKT_RX_IP_CKSUM_MASK
+#define RTE_MBUF_F_RX_IP_CKSUM_UNKNOWN PKT_RX_IP_CKSUM_UNKNOWN
+#define RTE_MBUF_F_RX_IP_CKSUM_BAD PKT_RX_IP_CKSUM_BAD
+#define RTE_MBUF_F_RX_IP_CKSUM_GOOD PKT_RX_IP_CKSUM_GOOD
+#define RTE_MBUF_F_RX_IP_CKSUM_NONE PKT_RX_IP_CKSUM_NONE
+#define RTE_MBUF_F_RX_L4_CKSUM_MASK PKT_RX_L4_CKSUM_MASK
+#define RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN PKT_RX_L4_CKSUM_UNKNOWN
+#define RTE_MBUF_F_RX_L4_CKSUM_BAD PKT_RX_L4_CKSUM_BAD
+#define RTE_MBUF_F_RX_L4_CKSUM_GOOD PKT_RX_L4_CKSUM_GOOD
+#define RTE_MBUF_F_RX_L4_CKSUM_NONE PKT_RX_L4_CKSUM_NONE
+#define RTE_MBUF_F_RX_IEEE1588_PTP PKT_RX_IEEE1588_PTP
+#define RTE_MBUF_F_RX_IEEE1588_TMST PKT_RX_IEEE1588_TMST
+#define RTE_MBUF_F_RX_FDIR_ID PKT_RX_FDIR_ID
+#define RTE_MBUF_F_RX_FDIR_FLX PKT_RX_FDIR_FLX
+#define RTE_MBUF_F_RX_QINQ_STRIPPED PKT_RX_QINQ_STRIPPED
+#define RTE_MBUF_F_RX_LRO PKT_RX_LRO
+#define RTE_MBUF_F_RX_SEC_OFFLOAD PKT_RX_SEC_OFFLOAD
#define RTE_MBUF_F_RX_SEC_OFFLOAD_FAILED PKT_RX_SEC_OFFLOAD_FAILED
-#define RTE_MBUF_F_RX_QINQ PKT_RX_QINQ
-
-#define RTE_MBUF_F_TX_SEC_OFFLOAD PKT_TX_SEC_OFFLOAD
-#define RTE_MBUF_F_TX_MACSEC PKT_TX_MACSEC
-#define RTE_MBUF_F_TX_QINQ PKT_TX_QINQ
-#define RTE_MBUF_F_TX_TCP_SEG PKT_TX_TCP_SEG
-#define RTE_MBUF_F_TX_IEEE1588_TMST PKT_TX_IEEE1588_TMST
-#define RTE_MBUF_F_TX_L4_NO_CKSUM PKT_TX_L4_NO_CKSUM
-#define RTE_MBUF_F_TX_TCP_CKSUM PKT_TX_TCP_CKSUM
-#define RTE_MBUF_F_TX_SCTP_CKSUM PKT_TX_SCTP_CKSUM
-#define RTE_MBUF_F_TX_UDP_CKSUM PKT_TX_UDP_CKSUM
-#define RTE_MBUF_F_TX_L4_MASK PKT_TX_L4_MASK
-#define RTE_MBUF_F_TX_IP_CKSUM PKT_TX_IP_CKSUM
-#define RTE_MBUF_F_TX_IPV4 PKT_TX_IPV4
-#define RTE_MBUF_F_TX_IPV6 PKT_TX_IPV6
-#define RTE_MBUF_F_TX_VLAN PKT_TX_VLAN
-#define RTE_MBUF_F_TX_OUTER_IP_CKSUM PKT_TX_OUTER_IP_CKSUM
-#define RTE_MBUF_F_TX_OUTER_IPV4 PKT_TX_OUTER_IPV4
-#define RTE_MBUF_F_TX_OUTER_IPV6 PKT_TX_OUTER_IPV6
-
-#define RTE_MBUF_F_TX_OFFLOAD_MASK PKT_TX_OFFLOAD_MASK
-
-#define RTE_ETH_8_POOLS ETH_8_POOLS
-#define RTE_ETH_16_POOLS ETH_16_POOLS
-#define RTE_ETH_32_POOLS ETH_32_POOLS
-#define RTE_ETH_64_POOLS ETH_64_POOLS
+#define RTE_MBUF_F_RX_QINQ PKT_RX_QINQ
+
+#define RTE_MBUF_F_TX_SEC_OFFLOAD PKT_TX_SEC_OFFLOAD
+#define RTE_MBUF_F_TX_MACSEC PKT_TX_MACSEC
+#define RTE_MBUF_F_TX_QINQ PKT_TX_QINQ
+#define RTE_MBUF_F_TX_TCP_SEG PKT_TX_TCP_SEG
+#define RTE_MBUF_F_TX_IEEE1588_TMST PKT_TX_IEEE1588_TMST
+#define RTE_MBUF_F_TX_L4_NO_CKSUM PKT_TX_L4_NO_CKSUM
+#define RTE_MBUF_F_TX_TCP_CKSUM PKT_TX_TCP_CKSUM
+#define RTE_MBUF_F_TX_SCTP_CKSUM PKT_TX_SCTP_CKSUM
+#define RTE_MBUF_F_TX_UDP_CKSUM PKT_TX_UDP_CKSUM
+#define RTE_MBUF_F_TX_L4_MASK PKT_TX_L4_MASK
+#define RTE_MBUF_F_TX_IP_CKSUM PKT_TX_IP_CKSUM
+#define RTE_MBUF_F_TX_IPV4 PKT_TX_IPV4
+#define RTE_MBUF_F_TX_IPV6 PKT_TX_IPV6
+#define RTE_MBUF_F_TX_VLAN PKT_TX_VLAN
+#define RTE_MBUF_F_TX_OUTER_IP_CKSUM PKT_TX_OUTER_IP_CKSUM
+#define RTE_MBUF_F_TX_OUTER_IPV4 PKT_TX_OUTER_IPV4
+#define RTE_MBUF_F_TX_OUTER_IPV6 PKT_TX_OUTER_IPV6
+
+#define RTE_MBUF_F_TX_OFFLOAD_MASK PKT_TX_OFFLOAD_MASK
+
+#define RTE_ETH_8_POOLS ETH_8_POOLS
+#define RTE_ETH_16_POOLS ETH_16_POOLS
+#define RTE_ETH_32_POOLS ETH_32_POOLS
+#define RTE_ETH_64_POOLS ETH_64_POOLS
#ifdef RTE_LIBRTE_ETHDEV_DEBUG
#define RTE_ETHDEV_DEBUG_RX
@@ -248,7 +245,7 @@ int sxe_eth_dev_callback_process(struct rte_eth_dev *dev,
#if defined DPDK_20_11_5 || defined DPDK_19_11_6
#define rte_eth_fdir_pballoc_type rte_fdir_pballoc_type
-#define rte_eth_fdir_conf rte_fdir_conf
+#define rte_eth_fdir_conf rte_fdir_conf
#define RTE_ETH_FDIR_PBALLOC_64K RTE_FDIR_PBALLOC_64K
#define RTE_ETH_FDIR_PBALLOC_128K RTE_FDIR_PBALLOC_128K
@@ -261,15 +258,15 @@ int sxe_eth_dev_callback_process(struct rte_eth_dev *dev,
(&((pci_dev)->intr_handle))
#define SXE_DEV_FNAV_CONF(dev) \
- (&((dev)->data->dev_conf.fdir_conf))
+ (&((dev)->data->dev_conf.fdir_conf))
#define SXE_GET_FRAME_SIZE(dev) \
(dev->data->dev_conf.rxmode.max_rx_pkt_len)
-
+
#elif defined DPDK_21_11_5
#define SXE_PCI_INTR_HANDLE(pci_dev) \
((pci_dev)->intr_handle)
#define SXE_DEV_FNAV_CONF(dev) \
- (&((dev)->data->dev_conf.fdir_conf))
+ (&((dev)->data->dev_conf.fdir_conf))
#define SXE_GET_FRAME_SIZE(dev) \
(dev->data->mtu + SXE_ETH_OVERHEAD)
@@ -277,7 +274,7 @@ int sxe_eth_dev_callback_process(struct rte_eth_dev *dev,
#define SXE_PCI_INTR_HANDLE(pci_dev) \
((pci_dev)->intr_handle)
#define SXE_DEV_FNAV_CONF(dev) \
- (&((struct sxe_adapter *)(dev)->data->dev_private)->fnav_conf)
+ (&((struct sxe_adapter *)(dev)->data->dev_private)->fnav_conf)
#define RTE_ADAPTER_HAVE_FNAV_CONF
#define SXE_GET_FRAME_SIZE(dev) \
(dev->data->mtu + SXE_ETH_OVERHEAD)
@@ -17,45 +17,45 @@
#define SXE_ERR_VF(errcode) SXE_ERR_MODULE(SXE_ERR_MODULE_VF, errcode)
#define SXE_ERR_HDC(errcode) SXE_ERR_MODULE(SXE_ERR_MODULE_HDC, errcode)
-#define SXE_ERR_CONFIG EINVAL
-#define SXE_ERR_PARAM EINVAL
-#define SXE_ERR_RESET_FAILED EPERM
-#define SXE_ERR_NO_SPACE ENOSPC
-#define SXE_ERR_FNAV_CMD_INCOMPLETE EBUSY
-#define SXE_ERR_MBX_LOCK_FAIL EBUSY
-#define SXE_ERR_OPRATION_NOT_PERM EPERM
-#define SXE_ERR_LINK_STATUS_INVALID EINVAL
-#define SXE_ERR_LINK_SPEED_INVALID EINVAL
-#define SXE_ERR_DEVICE_NOT_SUPPORTED EOPNOTSUPP
-#define SXE_ERR_HDC_LOCK_BUSY EBUSY
-#define SXE_ERR_HDC_FW_OV_TIMEOUT ETIMEDOUT
-#define SXE_ERR_MDIO_CMD_TIMEOUT ETIMEDOUT
-#define SXE_ERR_INVALID_LINK_SETTINGS EINVAL
-#define SXE_ERR_FNAV_REINIT_FAILED EIO
-#define SXE_ERR_CLI_FAILED EIO
-#define SXE_ERR_MASTER_REQUESTS_PENDING SXE_ERR_PF(1)
-#define SXE_ERR_SFP_NO_INIT_SEQ_PRESENT SXE_ERR_PF(2)
-#define SXE_ERR_ENABLE_SRIOV_FAIL SXE_ERR_PF(3)
-#define SXE_ERR_IPSEC_SA_STATE_NOT_EXSIT SXE_ERR_PF(4)
-#define SXE_ERR_SFP_NOT_PERSENT SXE_ERR_PF(5)
-#define SXE_ERR_PHY_NOT_PERSENT SXE_ERR_PF(6)
-#define SXE_ERR_PHY_RESET_FAIL SXE_ERR_PF(7)
-#define SXE_ERR_FC_NOT_NEGOTIATED SXE_ERR_PF(8)
-#define SXE_ERR_SFF_NOT_SUPPORTED SXE_ERR_PF(9)
+#define SXE_ERR_CONFIG EINVAL
+#define SXE_ERR_PARAM EINVAL
+#define SXE_ERR_RESET_FAILED EPERM
+#define SXE_ERR_NO_SPACE ENOSPC
+#define SXE_ERR_FNAV_CMD_INCOMPLETE EBUSY
+#define SXE_ERR_MBX_LOCK_FAIL EBUSY
+#define SXE_ERR_OPRATION_NOT_PERM EPERM
+#define SXE_ERR_LINK_STATUS_INVALID EINVAL
+#define SXE_ERR_LINK_SPEED_INVALID EINVAL
+#define SXE_ERR_DEVICE_NOT_SUPPORTED EOPNOTSUPP
+#define SXE_ERR_HDC_LOCK_BUSY EBUSY
+#define SXE_ERR_HDC_FW_OV_TIMEOUT ETIMEDOUT
+#define SXE_ERR_MDIO_CMD_TIMEOUT ETIMEDOUT
+#define SXE_ERR_INVALID_LINK_SETTINGS EINVAL
+#define SXE_ERR_FNAV_REINIT_FAILED EIO
+#define SXE_ERR_CLI_FAILED EIO
+#define SXE_ERR_MASTER_REQUESTS_PENDING SXE_ERR_PF(1)
+#define SXE_ERR_SFP_NO_INIT_SEQ_PRESENT SXE_ERR_PF(2)
+#define SXE_ERR_ENABLE_SRIOV_FAIL SXE_ERR_PF(3)
+#define SXE_ERR_IPSEC_SA_STATE_NOT_EXSIT SXE_ERR_PF(4)
+#define SXE_ERR_SFP_NOT_PERSENT SXE_ERR_PF(5)
+#define SXE_ERR_PHY_NOT_PERSENT SXE_ERR_PF(6)
+#define SXE_ERR_PHY_RESET_FAIL SXE_ERR_PF(7)
+#define SXE_ERR_FC_NOT_NEGOTIATED SXE_ERR_PF(8)
+#define SXE_ERR_SFF_NOT_SUPPORTED SXE_ERR_PF(9)
-#define SXEVF_ERR_MAC_ADDR_INVALID EINVAL
-#define SXEVF_ERR_RESET_FAILED EIO
-#define SXEVF_ERR_ARGUMENT_INVALID EINVAL
-#define SXEVF_ERR_NOT_READY EBUSY
-#define SXEVF_ERR_POLL_ACK_FAIL EIO
-#define SXEVF_ERR_POLL_MSG_FAIL EIO
-#define SXEVF_ERR_MBX_LOCK_FAIL EBUSY
-#define SXEVF_ERR_REPLY_INVALID EINVAL
-#define SXEVF_ERR_IRQ_NUM_INVALID EINVAL
-#define SXEVF_ERR_PARAM EINVAL
-#define SXEVF_ERR_MAILBOX_FAIL SXE_ERR_VF(1)
-#define SXEVF_ERR_MSG_HANDLE_ERR SXE_ERR_VF(2)
-#define SXEVF_ERR_DEVICE_NOT_SUPPORTED SXE_ERR_VF(3)
-#define SXEVF_ERR_IPSEC_SA_STATE_NOT_EXSIT SXE_ERR_VF(4)
+#define SXEVF_ERR_MAC_ADDR_INVALID EINVAL
+#define SXEVF_ERR_RESET_FAILED EIO
+#define SXEVF_ERR_ARGUMENT_INVALID EINVAL
+#define SXEVF_ERR_NOT_READY EBUSY
+#define SXEVF_ERR_POLL_ACK_FAIL EIO
+#define SXEVF_ERR_POLL_MSG_FAIL EIO
+#define SXEVF_ERR_MBX_LOCK_FAIL EBUSY
+#define SXEVF_ERR_REPLY_INVALID EINVAL
+#define SXEVF_ERR_IRQ_NUM_INVALID EINVAL
+#define SXEVF_ERR_PARAM EINVAL
+#define SXEVF_ERR_MAILBOX_FAIL SXE_ERR_VF(1)
+#define SXEVF_ERR_MSG_HANDLE_ERR SXE_ERR_VF(2)
+#define SXEVF_ERR_DEVICE_NOT_SUPPORTED SXE_ERR_VF(3)
+#define SXEVF_ERR_IPSEC_SA_STATE_NOT_EXSIT SXE_ERR_VF(4)
#endif
@@ -4,7 +4,7 @@
#ifdef SXE_PHY_CONFIGURE
#include <linux/mdio.h>
#endif
-#if defined (__KERNEL__) || defined (SXE_KERNEL_TEST)
+#if defined(__KERNEL__) || defined(SXE_KERNEL_TEST)
#include "sxe_pci.h"
#include "sxe_log.h"
#include "sxe_debug.h"
@@ -24,25 +24,25 @@
#define SXE_MSGID_MASK (0xFFFFFFFF)
-#define SXE_CTRL_MSG_MASK (0x700)
+#define SXE_CTRL_MSG_MASK (0x700)
-#define SXE_RING_WAIT_LOOP 10
-#define SXE_REG_NAME_LEN 16
+#define SXE_RING_WAIT_LOOP 10
+#define SXE_REG_NAME_LEN 16
#define SXE_DUMP_REG_STRING_LEN 73
-#define SXE_DUMP_REGS_NUM 64
-#define SXE_MAX_RX_DESC_POLL 10
-#define SXE_LPBK_EN 0x00000001
-#define SXE_MACADDR_LOW_4_BYTE 4
+#define SXE_DUMP_REGS_NUM 64
+#define SXE_MAX_RX_DESC_POLL 10
+#define SXE_LPBK_EN 0x00000001
+#define SXE_MACADDR_LOW_4_BYTE 4
#define SXE_MACADDR_HIGH_2_BYTE 2
-#define SXE_RSS_FIELD_MASK 0xffff0000
-#define SXE_MRQE_MASK 0x0000000f
+#define SXE_RSS_FIELD_MASK 0xffff0000
+#define SXE_MRQE_MASK 0x0000000f
-#define SXE_HDC_DATA_LEN_MAX 256
+#define SXE_HDC_DATA_LEN_MAX 256
#define SXE_8_TC_MSB (0x11111111)
-STATIC u32 sxe_read_reg(struct sxe_hw *hw, u32 reg);
-STATIC void sxe_write_reg(struct sxe_hw *hw, u32 reg, u32 value);
+static u32 sxe_read_reg(struct sxe_hw *hw, u32 reg);
+static void sxe_write_reg(struct sxe_hw *hw, u32 reg, u32 value);
static void sxe_write_reg64(struct sxe_hw *hw, u32 reg, u64 value);
#define SXE_WRITE_REG_ARRAY_32(a, reg, offset, value) \
@@ -50,7 +50,7 @@ static void sxe_write_reg64(struct sxe_hw *hw, u32 reg, u64 value);
#define SXE_READ_REG_ARRAY_32(a, reg, offset) \
sxe_read_reg(a, reg + (offset << 2))
-#define SXE_REG_READ(hw, addr) sxe_read_reg(hw, addr)
+#define SXE_REG_READ(hw, addr) sxe_read_reg(hw, addr)
#define SXE_REG_WRITE(hw, reg, value) sxe_write_reg(hw, reg, value)
#define SXE_WRITE_FLUSH(a) sxe_read_reg(a, SXE_STATUS)
#define SXE_REG_WRITE_ARRAY(hw, reg, offset, value) \
@@ -90,26 +90,21 @@ u16 sxe_mac_reg_num_get(void)
}
-#ifndef SXE_DPDK
+#ifndef SXE_DPDK
void sxe_hw_fault_handle(struct sxe_hw *hw)
{
struct sxe_adapter *adapter = hw->adapter;
- if (test_bit(SXE_HW_FAULT, &hw->state)) {
- goto l_ret;
- }
+ if (test_bit(SXE_HW_FAULT, &hw->state))
+ return;
set_bit(SXE_HW_FAULT, &hw->state);
LOG_DEV_ERR("sxe nic hw fault\n");
- if ((hw->fault_handle != NULL) && (hw->priv != NULL) ) {
+ if ((hw->fault_handle != NULL) && (hw->priv != NULL))
hw->fault_handle(hw->priv);
- }
-
-l_ret:
- return;
}
static u32 sxe_hw_fault_check(struct sxe_hw *hw, u32 reg)
@@ -118,32 +113,29 @@ static u32 sxe_hw_fault_check(struct sxe_hw *hw, u32 reg)
u8 __iomem *base_addr = hw->reg_base_addr;
struct sxe_adapter *adapter = hw->adapter;
- if (sxe_is_hw_fault(hw)) {
+ if (sxe_is_hw_fault(hw))
goto l_out;
- }
for (i = 0; i < SXE_REG_READ_RETRY; i++) {
value = hw->reg_read(base_addr + SXE_STATUS);
- if (value != SXE_REG_READ_FAIL) {
+ if (value != SXE_REG_READ_FAIL)
break;
- }
mdelay(3);
}
- if (SXE_REG_READ_FAIL == value) {
+ if (value == SXE_REG_READ_FAIL) {
LOG_ERROR_BDF("read registers multiple times failed, ret=%#x\n", value);
sxe_hw_fault_handle(hw);
- } else {
+ } else
value = hw->reg_read(base_addr + reg);
- }
return value;
l_out:
return SXE_REG_READ_FAIL;
}
-STATIC u32 sxe_read_reg(struct sxe_hw *hw, u32 reg)
+static u32 sxe_read_reg(struct sxe_hw *hw, u32 reg)
{
u32 value;
u8 __iomem *base_addr = hw->reg_base_addr;
@@ -155,7 +147,7 @@ STATIC u32 sxe_read_reg(struct sxe_hw *hw, u32 reg)
}
value = hw->reg_read(base_addr + reg);
- if (unlikely(SXE_REG_READ_FAIL == value)) {
+ if (unlikely(value == SXE_REG_READ_FAIL)) {
LOG_ERROR_BDF("reg[0x%x] read failed, ret=%#x\n", reg, value);
value = sxe_hw_fault_check(hw, reg);
}
@@ -164,32 +156,29 @@ STATIC u32 sxe_read_reg(struct sxe_hw *hw, u32 reg)
return value;
}
-STATIC void sxe_write_reg(struct sxe_hw *hw, u32 reg, u32 value)
+static void sxe_write_reg(struct sxe_hw *hw, u32 reg, u32 value)
{
u8 __iomem *base_addr = hw->reg_base_addr;
- if (sxe_is_hw_fault(hw)) {
- goto l_ret;
- }
+ if (sxe_is_hw_fault(hw))
+ return;
hw->reg_write(value, base_addr + reg);
-l_ret:
- return;
}
-#else
+#else
-STATIC u32 sxe_read_reg(struct sxe_hw *hw, u32 reg)
+static u32 sxe_read_reg(struct sxe_hw *hw, u32 reg)
{
u32 i, value;
u8 __iomem *base_addr = hw->reg_base_addr;
value = rte_le_to_cpu_32(rte_read32(base_addr + reg));
- if (unlikely(SXE_REG_READ_FAIL == value)) {
+ if (unlikely(value == SXE_REG_READ_FAIL)) {
value = rte_le_to_cpu_32(rte_read32(base_addr + SXE_STATUS));
- if (unlikely(SXE_REG_READ_FAIL != value)) {
+ if (unlikely(value != SXE_REG_READ_FAIL)) {
value = rte_le_to_cpu_32(rte_read32(base_addr + reg));
} else {
@@ -198,16 +187,15 @@ STATIC u32 sxe_read_reg(struct sxe_hw *hw, u32 reg)
for (i = 0; i < SXE_REG_READ_RETRY; i++) {
value = rte_le_to_cpu_32(rte_read32(base_addr + SXE_STATUS));
- if (unlikely(SXE_REG_READ_FAIL != value)) {
+ if (unlikely(value != SXE_REG_READ_FAIL)) {
value = rte_le_to_cpu_32(rte_read32(base_addr + reg));
LOG_INFO("reg[0x%x] read ok, value=%#x\n",
reg, value);
break;
- } else {
- LOG_ERROR("reg[0x%x] and reg[0x%x] read failed, ret=%#x\n",
- reg, SXE_STATUS, value);
}
+ LOG_ERROR("reg[0x%x] and reg[0x%x] read failed, ret=%#x\n",
+ reg, SXE_STATUS, value);
mdelay(3);
}
@@ -217,13 +205,12 @@ STATIC u32 sxe_read_reg(struct sxe_hw *hw, u32 reg)
return value;
}
-STATIC void sxe_write_reg(struct sxe_hw *hw, u32 reg, u32 value)
+static void sxe_write_reg(struct sxe_hw *hw, u32 reg, u32 value)
{
u8 __iomem *base_addr = hw->reg_base_addr;
rte_write32((rte_cpu_to_le_32(value)), (base_addr + reg));
- return;
}
#endif
@@ -231,14 +218,11 @@ static void sxe_write_reg64(struct sxe_hw *hw, u32 reg, u64 value)
{
u8 __iomem *reg_addr = hw->reg_base_addr;
- if (sxe_is_hw_fault(hw)) {
- goto l_ret;
- }
+ if (sxe_is_hw_fault(hw))
+ return;
writeq(value, reg_addr + reg);
-l_ret:
- return;
}
@@ -251,7 +235,6 @@ void sxe_hw_no_snoop_disable(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_CTRL_EXT, ctrl_ext);
SXE_WRITE_FLUSH(hw);
- return;
}
s32 sxe_hw_uc_addr_pool_enable(struct sxe_hw *hw,
@@ -291,21 +274,19 @@ static s32 sxe_hw_uc_addr_pool_disable(struct sxe_hw *hw, u8 rar_idx)
hi = SXE_REG_READ(hw, SXE_MPSAR_HIGH(rar_idx));
low = SXE_REG_READ(hw, SXE_MPSAR_LOW(rar_idx));
- if (sxe_is_hw_fault(hw)) {
+ if (sxe_is_hw_fault(hw))
goto l_end;
- }
if (!hi & !low) {
LOG_DEBUG_BDF("no need clear rar-pool relation register.\n");
goto l_end;
}
- if (low) {
+ if (low)
SXE_REG_WRITE(hw, SXE_MPSAR_LOW(rar_idx), 0);
- }
- if (hi) {
+
+ if (hi)
SXE_REG_WRITE(hw, SXE_MPSAR_HIGH(rar_idx), 0);
- }
l_end:
@@ -328,9 +309,9 @@ s32 sxe_hw_nic_reset(struct sxe_hw *hw)
for (i = 0; i < 10; i++) {
ctrl = SXE_REG_READ(hw, SXE_CTRL);
- if (!(ctrl & SXE_CTRL_RST_MASK)) {
+ if (!(ctrl & SXE_CTRL_RST_MASK))
break;
- }
+
udelay(1);
}
@@ -350,13 +331,11 @@ void sxe_hw_pf_rst_done_set(struct sxe_hw *hw)
value |= SXE_CTRL_EXT_PFRSTD;
SXE_REG_WRITE(hw, SXE_CTRL_EXT, value);
- return;
}
static void sxe_hw_regs_flush(struct sxe_hw *hw)
{
SXE_WRITE_FLUSH(hw);
- return;
}
static const struct sxe_reg_info sxe_reg_info_tbl[] = {
@@ -397,74 +376,74 @@ static void sxe_hw_reg_print(struct sxe_hw *hw,
switch (reginfo->addr) {
case SXE_SRRCTL(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_SRRCTL(i));
- }
+
break;
case SXE_RDLEN(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_RDLEN(i));
- }
+
break;
case SXE_RDH(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_RDH(i));
- }
+
break;
case SXE_RDT(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_RDT(i));
- }
+
break;
case SXE_RXDCTL(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_RXDCTL(i));
- }
+
break;
case SXE_RDBAL(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_RDBAL(i));
- }
+
break;
case SXE_RDBAH(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_RDBAH(i));
- }
+
break;
case SXE_TDBAL(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_TDBAL(i));
- }
+
break;
case SXE_TDBAH(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_TDBAH(i));
- }
+
break;
case SXE_TDLEN(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_TDLEN(i));
- }
+
break;
case SXE_TDH(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_TDH(i));
- }
+
break;
case SXE_TDT(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_TDT(i));
- }
+
break;
case SXE_TXDCTL(0):
- for (i = 0; i < SXE_DUMP_REGS_NUM; i++) {
+ for (i = 0; i < SXE_DUMP_REGS_NUM; i++)
regs[i] = SXE_REG_READ(hw, SXE_TXDCTL(i));
- }
+
break;
default:
LOG_DEV_INFO("%-15s %08x\n",
reginfo->name, SXE_REG_READ(hw, reginfo->addr));
- goto l_end;
+ return;
}
while (first_reg_idx < SXE_DUMP_REGS_NUM) {
@@ -473,15 +452,12 @@ static void sxe_hw_reg_print(struct sxe_hw *hw,
"%s[%d-%d]", reginfo->name,
first_reg_idx, (first_reg_idx + 7));
- for (j = 0; j < 8; j++) {
+ for (j = 0; j < 8; j++)
value += sprintf(value, " %08x", regs[first_reg_idx++]);
- }
LOG_DEV_ERR("%-15s%s\n", reg_name, buf);
}
-l_end:
- return;
}
static void sxe_hw_reg_dump(struct sxe_hw *hw)
@@ -489,11 +465,10 @@ static void sxe_hw_reg_dump(struct sxe_hw *hw)
const struct sxe_reg_info *reginfo;
for (reginfo = (const struct sxe_reg_info *)sxe_reg_info_tbl;
- reginfo->name; reginfo++) {
+ reginfo->name; reginfo++) {
sxe_hw_reg_print(hw, reginfo);
}
- return;
}
static s32 sxe_hw_status_reg_test(struct sxe_hw *hw)
@@ -539,22 +514,22 @@ struct sxe_self_test_reg {
static const struct sxe_self_test_reg self_test_reg[] = {
{ SXE_FCRTL(0), 1, PATTERN_TEST, 0x8007FFE0, 0x8007FFF0 },
{ SXE_FCRTH(0), 1, PATTERN_TEST, 0x8007FFE0, 0x8007FFF0 },
- { SXE_PFCTOP, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
+ { SXE_PFCTOP, 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
{ SXE_FCTTV(0), 1, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
{ SXE_VLNCTRL, 1, PATTERN_TEST, 0x00000000, 0x00000000 },
{ SXE_RDBAL(0), 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFF80 },
{ SXE_RDBAH(0), 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
{ SXE_RDLEN(0), 4, PATTERN_TEST, 0x000FFFFF, 0x000FFFFF },
{ SXE_RXDCTL(0), 4, WRITE_NO_TEST, 0, SXE_RXDCTL_ENABLE },
- { SXE_RDT(0), 4, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF },
+ { SXE_RDT(0), 4, PATTERN_TEST, 0x0000FFFF, 0x0000FFFF },
{ SXE_RXDCTL(0), 4, WRITE_NO_TEST, 0, 0 },
{ SXE_TDBAL(0), 4, PATTERN_TEST, 0xFFFFFF80, 0xFFFFFFFF },
{ SXE_TDBAH(0), 4, PATTERN_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
{ SXE_TDLEN(0), 4, PATTERN_TEST, 0x000FFF80, 0x000FFF80 },
- { SXE_RXCTRL, 1, SET_READ_TEST, 0x00000001, 0x00000001 },
- { SXE_RAL(0), 16, TABLE64_TEST_LO, 0xFFFFFFFF, 0xFFFFFFFF },
- { SXE_RAL(0), 16, TABLE64_TEST_HI, 0x8001FFFF, 0x800CFFFF },
- { SXE_MTA(0), 128, TABLE32_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
+ { SXE_RXCTRL, 1, SET_READ_TEST, 0x00000001, 0x00000001 },
+ { SXE_RAL(0), 16, TABLE64_TEST_LO, 0xFFFFFFFF, 0xFFFFFFFF },
+ { SXE_RAL(0), 16, TABLE64_TEST_HI, 0x8001FFFF, 0x800CFFFF },
+ { SXE_MTA(0), 128, TABLE32_TEST, 0xFFFFFFFF, 0xFFFFFFFF },
{ .reg = 0 }
};
@@ -625,7 +600,7 @@ static s32 sxe_hw_reg_set_and_check(struct sxe_hw *hw, int reg,
return ret;
}
-STATIC s32 sxe_hw_regs_test(struct sxe_hw *hw)
+static s32 sxe_hw_regs_test(struct sxe_hw *hw)
{
u32 i;
s32 ret = 0;
@@ -676,9 +651,8 @@ STATIC s32 sxe_hw_regs_test(struct sxe_hw *hw)
break;
}
- if (ret) {
+ if (ret)
goto l_end;
- }
}
test++;
@@ -716,7 +690,6 @@ static void sxe_hw_ring_irq_enable(struct sxe_hw *hw, u64 qmask)
SXE_REG_WRITE(hw, SXE_EIMS_EX(1), mask1);
}
- return;
}
u32 sxe_hw_pending_irq_read_clear(struct sxe_hw *hw)
@@ -727,7 +700,6 @@ u32 sxe_hw_pending_irq_read_clear(struct sxe_hw *hw)
void sxe_hw_pending_irq_write_clear(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_EICR, value);
- return;
}
u32 sxe_hw_irq_cause_get(struct sxe_hw *hw)
@@ -739,7 +711,6 @@ static void sxe_hw_event_irq_trigger(struct sxe_hw *hw)
{
SXE_REG_WRITE(hw, SXE_EICS, (SXE_EICS_TCP_TIMER | SXE_EICS_OTHER));
- return;
}
static void sxe_hw_ring_irq_trigger(struct sxe_hw *hw, u64 eics)
@@ -750,7 +721,6 @@ static void sxe_hw_ring_irq_trigger(struct sxe_hw *hw, u64 eics)
SXE_REG_WRITE(hw, SXE_EICS_EX(0), mask);
mask = (eics >> 32);
SXE_REG_WRITE(hw, SXE_EICS_EX(1), mask);
- return;
}
void sxe_hw_ring_irq_auto_disable(struct sxe_hw *hw,
@@ -763,14 +733,12 @@ void sxe_hw_ring_irq_auto_disable(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_EIAM, SXE_EICS_RTX_QUEUE);
}
- return;
}
void sxe_hw_irq_general_reg_set(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_GPIE, value);
- return;
}
u32 sxe_hw_irq_general_reg_get(struct sxe_hw *hw)
@@ -782,7 +750,6 @@ static void sxe_hw_set_eitrsel(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_EITRSEL, value);
- return;
}
void sxe_hw_event_irq_map(struct sxe_hw *hw, u8 offset, u16 irq_idx)
@@ -800,7 +767,6 @@ void sxe_hw_event_irq_map(struct sxe_hw *hw, u8 offset, u16 irq_idx)
SXE_REG_WRITE(hw, SXE_IVAR_MISC, ivar);
- return;
}
void sxe_hw_ring_irq_map(struct sxe_hw *hw, bool is_tx,
@@ -819,7 +785,6 @@ void sxe_hw_ring_irq_map(struct sxe_hw *hw, bool is_tx,
SXE_REG_WRITE(hw, SXE_IVAR(reg_idx >> 1), ivar);
- return;
}
void sxe_hw_ring_irq_interval_set(struct sxe_hw *hw,
@@ -831,7 +796,6 @@ void sxe_hw_ring_irq_interval_set(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_EITR(irq_idx), eitr);
- return;
}
static void sxe_hw_event_irq_interval_set(struct sxe_hw *hw,
@@ -839,28 +803,24 @@ static void sxe_hw_event_irq_interval_set(struct sxe_hw *hw,
{
SXE_REG_WRITE(hw, SXE_EITR(irq_idx), value);
- return;
}
void sxe_hw_event_irq_auto_clear_set(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_EIAC, value);
- return;
}
void sxe_hw_specific_irq_disable(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_EIMC, value);
- return;
}
void sxe_hw_specific_irq_enable(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_EIMS, value);
- return;
}
void sxe_hw_all_irq_disable(struct sxe_hw *hw)
@@ -872,7 +832,6 @@ void sxe_hw_all_irq_disable(struct sxe_hw *hw)
SXE_WRITE_FLUSH(hw);
- return;
}
static void sxe_hw_spp_configure(struct sxe_hw *hw, u32 hw_spp_proc_delay_us)
@@ -882,7 +841,6 @@ static void sxe_hw_spp_configure(struct sxe_hw *hw, u32 hw_spp_proc_delay_us)
~SXE_SPP_PROC_DELAY_US_MASK) |
hw_spp_proc_delay_us);
- return;
}
static s32 sxe_hw_irq_test(struct sxe_hw *hw, u32 *icr, bool shared)
@@ -985,13 +943,12 @@ u32 sxe_hw_link_speed_get(struct sxe_hw *hw)
struct sxe_adapter *adapter = hw->adapter;
value = SXE_REG_READ(hw, SXE_COMCTRL);
- if ((value & SXE_COMCTRL_SPEED_10G) == SXE_COMCTRL_SPEED_10G) {
+ if ((value & SXE_COMCTRL_SPEED_10G) == SXE_COMCTRL_SPEED_10G)
speed = SXE_LINK_SPEED_10GB_FULL;
- } else if ((value & SXE_COMCTRL_SPEED_1G) == SXE_COMCTRL_SPEED_1G) {
+ else if ((value & SXE_COMCTRL_SPEED_1G) == SXE_COMCTRL_SPEED_1G)
speed = SXE_LINK_SPEED_1GB_FULL;
- } else {
+ else
speed = SXE_LINK_SPEED_UNKNOWN;
- }
LOG_DEBUG_BDF("hw link speed=%x, (0x80=10G, 0x20=1G)\n, reg=%x",
speed, value);
@@ -1005,18 +962,17 @@ void sxe_hw_link_speed_set(struct sxe_hw *hw, u32 speed)
ctrl = SXE_REG_READ(hw, SXE_COMCTRL);
- if (SXE_LINK_SPEED_1GB_FULL == speed) {
+ if (speed == SXE_LINK_SPEED_1GB_FULL) {
ctrl |= SXE_COMCTRL_SPEED_1G;
- } else if (SXE_LINK_SPEED_10GB_FULL == speed) {
+ } else if (speed == SXE_LINK_SPEED_10GB_FULL) {
ctrl |= SXE_COMCTRL_SPEED_10G;
}
SXE_REG_WRITE(hw, SXE_COMCTRL, ctrl);
- return;
}
-STATIC bool sxe_hw_1g_link_up_check(struct sxe_hw *hw)
+static bool sxe_hw_1g_link_up_check(struct sxe_hw *hw)
{
return (SXE_REG_READ(hw, SXE_LINKS) & SXE_LINKS_UP) ? true : false;
}
@@ -1036,9 +992,9 @@ bool sxe_hw_is_link_state_up(struct sxe_hw *hw)
link_speed = sxe_hw_link_speed_get(hw);
if ((link_speed == SXE_LINK_SPEED_10GB_FULL) &&
- (links_reg & SXE_10G_LINKS_DOWN)) {
+ (links_reg & SXE_10G_LINKS_DOWN))
ret = false;
- }
+
}
return ret;
@@ -1052,7 +1008,6 @@ void sxe_hw_mac_pad_enable(struct sxe_hw *hw)
ctl |= SXE_MACCFG_PAD_EN;
SXE_REG_WRITE(hw, SXE_MACCFG, ctl);
- return;
}
s32 sxe_hw_fc_enable(struct sxe_hw *hw)
@@ -1066,7 +1021,7 @@ s32 sxe_hw_fc_enable(struct sxe_hw *hw)
flctrl_val = SXE_REG_READ(hw, SXE_FLCTRL);
flctrl_val &= ~(SXE_FCTRL_TFCE_MASK | SXE_FCTRL_RFCE_MASK |
- SXE_FCTRL_TFCE_FCEN_MASK | SXE_FCTRL_TFCE_XONE_MASK);
+ SXE_FCTRL_TFCE_FCEN_MASK | SXE_FCTRL_TFCE_XONE_MASK);
switch (hw->fc.current_mode) {
case SXE_FC_NONE:
@@ -1089,7 +1044,7 @@ s32 sxe_hw_fc_enable(struct sxe_hw *hw)
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
if ((hw->fc.current_mode & SXE_FC_TX_PAUSE) &&
- hw->fc.high_water[i]) {
+ hw->fc.high_water[i]) {
fcrtl = (hw->fc.low_water[i] << 9) | SXE_FCRTL_XONE;
SXE_REG_WRITE(hw, SXE_FCRTL(i), fcrtl);
fcrth = (hw->fc.high_water[i] << 9) | SXE_FCRTH_FCEN;
@@ -1103,9 +1058,8 @@ s32 sxe_hw_fc_enable(struct sxe_hw *hw)
flctrl_val |= SXE_FCTRL_TFCE_DPF_EN;
- if ((hw->fc.current_mode & SXE_FC_TX_PAUSE)) {
+ if ((hw->fc.current_mode & SXE_FC_TX_PAUSE))
flctrl_val |= (SXE_FCTRL_TFCE_FCEN_MASK | SXE_FCTRL_TFCE_XONE_MASK);
- }
SXE_REG_WRITE(hw, SXE_FLCTRL, flctrl_val);
@@ -1116,9 +1070,8 @@ s32 sxe_hw_fc_enable(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_PFCTOP, reg);
reg = hw->fc.pause_time * 0x00010001U;
- for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++) {
+ for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++)
SXE_REG_WRITE(hw, SXE_FCTTV(i), reg);
- }
SXE_REG_WRITE(hw, SXE_FCRTV, hw->fc.pause_time / 2);
@@ -1130,9 +1083,8 @@ void sxe_fc_autoneg_localcap_set(struct sxe_hw *hw)
{
u32 reg = 0;
- if (hw->fc.requested_mode == SXE_FC_DEFAULT) {
+ if (hw->fc.requested_mode == SXE_FC_DEFAULT)
hw->fc.requested_mode = SXE_FC_FULL;
- }
reg = SXE_REG_READ(hw, SXE_PCS1GANA);
@@ -1154,7 +1106,6 @@ void sxe_fc_autoneg_localcap_set(struct sxe_hw *hw)
}
SXE_REG_WRITE(hw, SXE_PCS1GANA, reg);
- return;
}
s32 sxe_hw_pfc_enable(struct sxe_hw *hw, u8 tc_idx)
@@ -1169,20 +1120,18 @@ s32 sxe_hw_pfc_enable(struct sxe_hw *hw, u8 tc_idx)
flctrl_val = SXE_REG_READ(hw, SXE_FLCTRL);
flctrl_val &= ~(SXE_FCTRL_TFCE_MASK | SXE_FCTRL_RFCE_MASK |
- SXE_FCTRL_TFCE_FCEN_MASK | SXE_FCTRL_TFCE_XONE_MASK);
+ SXE_FCTRL_TFCE_FCEN_MASK | SXE_FCTRL_TFCE_XONE_MASK);
switch (hw->fc.current_mode) {
case SXE_FC_NONE:
rx_en_num = 0;
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
reg = SXE_REG_READ(hw, SXE_FCRTH(i));
- if (reg & SXE_FCRTH_FCEN) {
+ if (reg & SXE_FCRTH_FCEN)
rx_en_num++;
- }
}
- if (rx_en_num > 1) {
+ if (rx_en_num > 1)
flctrl_val |= SXE_FCTRL_TFCE_PFC_EN;
- }
break;
@@ -1192,14 +1141,12 @@ s32 sxe_hw_pfc_enable(struct sxe_hw *hw, u8 tc_idx)
rx_en_num = 0;
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
reg = SXE_REG_READ(hw, SXE_FCRTH(i));
- if (reg & SXE_FCRTH_FCEN) {
+ if (reg & SXE_FCRTH_FCEN)
rx_en_num++;
- }
}
- if (rx_en_num > 1) {
+ if (rx_en_num > 1)
flctrl_val |= SXE_FCTRL_TFCE_PFC_EN;
- }
break;
case SXE_FC_TX_PAUSE:
@@ -1216,7 +1163,7 @@ s32 sxe_hw_pfc_enable(struct sxe_hw *hw, u8 tc_idx)
}
if ((hw->fc.current_mode & SXE_FC_TX_PAUSE) &&
- hw->fc.high_water[tc_idx]) {
+ hw->fc.high_water[tc_idx]) {
fcrtl = (hw->fc.low_water[tc_idx] << 9) | SXE_FCRTL_XONE;
SXE_REG_WRITE(hw, SXE_FCRTL(tc_idx), fcrtl);
fcrth = (hw->fc.high_water[tc_idx] << 9) | SXE_FCRTH_FCEN;
@@ -1243,9 +1190,8 @@ s32 sxe_hw_pfc_enable(struct sxe_hw *hw, u8 tc_idx)
SXE_REG_WRITE(hw, SXE_PFCTOP, reg);
reg = hw->fc.pause_time * 0x00010001U;
- for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++) {
+ for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++)
SXE_REG_WRITE(hw, SXE_FCTTV(i), reg);
- }
SXE_REG_WRITE(hw, SXE_FCRTV, hw->fc.pause_time / 2);
@@ -1260,7 +1206,6 @@ void sxe_hw_crc_configure(struct sxe_hw *hw)
ctrl |= SXE_PCCTRL_TXCE | SXE_PCCTRL_RXCE | SXE_PCCTRL_PCSC_ALL;
SXE_REG_WRITE(hw, SXE_PCCTRL, ctrl);
- return;
}
void sxe_hw_loopback_switch(struct sxe_hw *hw, bool is_enable)
@@ -1271,7 +1216,6 @@ void sxe_hw_loopback_switch(struct sxe_hw *hw, bool is_enable)
SXE_REG_WRITE(hw, SXE_LPBKCTRL, value);
- return;
}
void sxe_hw_mac_txrx_enable(struct sxe_hw *hw)
@@ -1282,7 +1226,6 @@ void sxe_hw_mac_txrx_enable(struct sxe_hw *hw)
ctl |= SXE_COMCTRL_TXEN | SXE_COMCTRL_RXEN | SXE_COMCTRL_EDSEL;
SXE_REG_WRITE(hw, SXE_COMCTRL, ctl);
- return;
}
void sxe_hw_mac_max_frame_set(struct sxe_hw *hw, u32 max_frame)
@@ -1297,7 +1240,6 @@ void sxe_hw_mac_max_frame_set(struct sxe_hw *hw, u32 max_frame)
maxfs |= SXE_MAXFS_RFSEL | SXE_MAXFS_TFSEL;
SXE_REG_WRITE(hw, SXE_MAXFS, maxfs);
- return;
}
u32 sxe_hw_mac_max_frame_get(struct sxe_hw *hw)
@@ -1324,14 +1266,13 @@ bool sxe_device_supports_autoneg_fc(struct sxe_hw *hw)
return supported;
}
-STATIC void sxe_hw_fc_param_init(struct sxe_hw *hw)
+static void sxe_hw_fc_param_init(struct sxe_hw *hw)
{
hw->fc.requested_mode = SXE_FC_FULL;
- hw->fc.current_mode = SXE_FC_FULL;
+ hw->fc.current_mode = SXE_FC_FULL;
hw->fc.pause_time = SXE_DEFAULT_FCPAUSE;
hw->fc.disable_fc_autoneg = true;
- return;
}
void sxe_hw_fc_tc_high_water_mark_set(struct sxe_hw *hw,
@@ -1339,7 +1280,6 @@ void sxe_hw_fc_tc_high_water_mark_set(struct sxe_hw *hw,
{
hw->fc.high_water[tc_idx] = mark;
- return;
}
void sxe_hw_fc_tc_low_water_mark_set(struct sxe_hw *hw,
@@ -1347,7 +1287,6 @@ void sxe_hw_fc_tc_low_water_mark_set(struct sxe_hw *hw,
{
hw->fc.low_water[tc_idx] = mark;
- return;
}
bool sxe_hw_is_fc_autoneg_disabled(struct sxe_hw *hw)
@@ -1359,7 +1298,6 @@ void sxe_hw_fc_autoneg_disable_set(struct sxe_hw *hw,
bool is_disabled)
{
hw->fc.disable_fc_autoneg = is_disabled;
- return;
}
static enum sxe_fc_mode sxe_hw_fc_current_mode_get(struct sxe_hw *hw)
@@ -1376,7 +1314,6 @@ void sxe_hw_fc_requested_mode_set(struct sxe_hw *hw,
enum sxe_fc_mode mode)
{
hw->fc.requested_mode = mode;
- return;
}
static const struct sxe_mac_operations sxe_mac_ops = {
@@ -1415,14 +1352,12 @@ u32 sxe_hw_pool_rx_mode_get(struct sxe_hw *hw, u16 pool_idx)
void sxe_hw_rx_mode_set(struct sxe_hw *hw, u32 filter_ctrl)
{
SXE_REG_WRITE(hw, SXE_FCTRL, filter_ctrl);
- return;
}
void sxe_hw_pool_rx_mode_set(struct sxe_hw *hw,
u32 vmolr, u16 pool_idx)
{
SXE_REG_WRITE(hw, SXE_VMOLR(pool_idx), vmolr);
- return;
}
void sxe_hw_rx_lro_enable(struct sxe_hw *hw, bool is_enable)
@@ -1430,12 +1365,10 @@ void sxe_hw_rx_lro_enable(struct sxe_hw *hw, bool is_enable)
u32 rfctl = SXE_REG_READ(hw, SXE_RFCTL);
rfctl &= ~SXE_RFCTL_LRO_DIS;
- if (!is_enable) {
+ if (!is_enable)
rfctl |= SXE_RFCTL_LRO_DIS;
- }
SXE_REG_WRITE(hw, SXE_RFCTL, rfctl);
- return;
}
void sxe_hw_rx_nfs_filter_disable(struct sxe_hw *hw)
@@ -1444,7 +1377,6 @@ void sxe_hw_rx_nfs_filter_disable(struct sxe_hw *hw)
rfctl |= (SXE_RFCTL_NFSW_DIS | SXE_RFCTL_NFSR_DIS);
SXE_REG_WRITE(hw, SXE_RFCTL, rfctl);
- return;
}
void sxe_hw_rx_udp_frag_checksum_disable(struct sxe_hw *hw)
@@ -1454,7 +1386,6 @@ void sxe_hw_rx_udp_frag_checksum_disable(struct sxe_hw *hw)
rxcsum = SXE_REG_READ(hw, SXE_RXCSUM);
rxcsum |= SXE_RXCSUM_PCSD;
SXE_REG_WRITE(hw, SXE_RXCSUM, rxcsum);
- return;
}
void sxe_hw_fc_mac_addr_set(struct sxe_hw *hw, u8 *mac_addr)
@@ -1462,16 +1393,15 @@ void sxe_hw_fc_mac_addr_set(struct sxe_hw *hw, u8 *mac_addr)
u32 mac_addr_h, mac_addr_l;
mac_addr_l = ((u32)mac_addr[5] |
- ((u32)mac_addr[4] << 8) |
- ((u32)mac_addr[3] << 16) |
- ((u32)mac_addr[2] << 24));
+ ((u32)mac_addr[4] << 8) |
+ ((u32)mac_addr[3] << 16) |
+ ((u32)mac_addr[2] << 24));
mac_addr_h = (((u32)mac_addr[1] << 16) |
- ((u32)mac_addr[0] << 24));
+ ((u32)mac_addr[0] << 24));
SXE_REG_WRITE(hw, SXE_SACONH, mac_addr_h);
SXE_REG_WRITE(hw, SXE_SACONL, mac_addr_l);
- return;
}
s32 sxe_hw_uc_addr_add(struct sxe_hw *hw, u32 rar_idx,
@@ -1542,7 +1472,6 @@ void sxe_hw_mta_hash_table_set(struct sxe_hw *hw,
u8 index, u32 value)
{
SXE_REG_WRITE(hw, SXE_MTA(index), value);
- return;
}
void sxe_hw_mta_hash_table_update(struct sxe_hw *hw,
@@ -1555,7 +1484,6 @@ void sxe_hw_mta_hash_table_update(struct sxe_hw *hw,
LOG_INFO("mta update value:0x%x.\n", value);
SXE_REG_WRITE(hw, SXE_MTA(reg_idx), value);
- return;
}
void sxe_hw_mc_filter_enable(struct sxe_hw *hw)
@@ -1564,7 +1492,6 @@ void sxe_hw_mc_filter_enable(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_MCSTCTRL, value);
- return;
}
static void sxe_hw_mc_filter_disable(struct sxe_hw *hw)
@@ -1575,7 +1502,6 @@ static void sxe_hw_mc_filter_disable(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_MCSTCTRL, value);
- return;
}
void sxe_hw_uc_addr_clear(struct sxe_hw *hw)
@@ -1594,26 +1520,22 @@ void sxe_hw_uc_addr_clear(struct sxe_hw *hw)
LOG_DEV_DEBUG("clear %u uta filter addr register\n",
SXE_UTA_ENTRY_NUM_MAX);
- for (i = 0; i < SXE_UTA_ENTRY_NUM_MAX; i++) {
+ for (i = 0; i < SXE_UTA_ENTRY_NUM_MAX; i++)
SXE_REG_WRITE(hw, SXE_UTA(i), 0);
- }
SXE_REG_WRITE(hw, SXE_MCSTCTRL, SXE_MC_FILTER_TYPE0);
LOG_DEV_DEBUG("clear %u mta filter addr register\n",
SXE_MTA_ENTRY_NUM_MAX);
- for (i = 0; i < SXE_MTA_ENTRY_NUM_MAX; i++) {
+ for (i = 0; i < SXE_MTA_ENTRY_NUM_MAX; i++)
SXE_REG_WRITE(hw, SXE_MTA(i), 0);
- }
- return;
}
static void sxe_hw_ethertype_filter_set(struct sxe_hw *hw,
u8 filter_type, u32 value)
{
SXE_REG_WRITE(hw, SXE_ETQF(filter_type), value);
- return;
}
void sxe_hw_vt_ctrl_cfg(struct sxe_hw *hw, u8 default_pool)
@@ -1622,14 +1544,13 @@ void sxe_hw_vt_ctrl_cfg(struct sxe_hw *hw, u8 default_pool)
ctrl = SXE_REG_READ(hw, SXE_VT_CTL);
- ctrl |= SXE_VT_CTL_VT_ENABLE;
+ ctrl |= SXE_VT_CTL_VT_ENABLE;
ctrl &= ~SXE_VT_CTL_POOL_MASK;
ctrl |= default_pool << SXE_VT_CTL_POOL_SHIFT;
- ctrl |= SXE_VT_CTL_REPLEN;
+ ctrl |= SXE_VT_CTL_REPLEN;
SXE_REG_WRITE(hw, SXE_VT_CTL, ctrl);
- return;
}
void sxe_hw_vt_disable(struct sxe_hw *hw)
@@ -1640,7 +1561,6 @@ void sxe_hw_vt_disable(struct sxe_hw *hw)
vmdctl &= ~SXE_VMD_CTL_POOL_EN;
SXE_REG_WRITE(hw, SXE_VT_CTL, vmdctl);
- return;
}
#ifdef SXE_WOL_CONFIGURE
@@ -1649,7 +1569,6 @@ static void sxe_hw_wol_status_set(struct sxe_hw *hw)
{
SXE_REG_WRITE(hw, SXE_WUS, ~0);
- return;
}
static void sxe_hw_wol_mode_set(struct sxe_hw *hw, u32 wol_status)
@@ -1660,16 +1579,14 @@ static void sxe_hw_wol_mode_set(struct sxe_hw *hw, u32 wol_status)
fctrl = SXE_REG_READ(hw, SXE_FCTRL);
fctrl |= SXE_FCTRL_BAM;
- if (wol_status & SXE_WUFC_MC) {
+ if (wol_status & SXE_WUFC_MC)
fctrl |= SXE_FCTRL_MPE;
- }
SXE_REG_WRITE(hw, SXE_FCTRL, fctrl);
SXE_REG_WRITE(hw, SXE_WUFC, wol_status);
sxe_hw_wol_status_set(hw);
- return;
}
static void sxe_hw_wol_mode_clean(struct sxe_hw *hw)
@@ -1677,7 +1594,6 @@ static void sxe_hw_wol_mode_clean(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_WUC, 0);
SXE_REG_WRITE(hw, SXE_WUFC, 0);
- return;
}
#endif
@@ -1708,7 +1624,7 @@ static const struct sxe_filter_mac_operations sxe_filter_mac_ops = {
.wol_status_set = sxe_hw_wol_status_set,
#endif
- .vt_disable = sxe_hw_vt_disable,
+ .vt_disable = sxe_hw_vt_disable,
};
u32 sxe_hw_vlan_pool_filter_read(struct sxe_hw *hw, u16 reg_index)
@@ -1720,7 +1636,6 @@ static void sxe_hw_vlan_pool_filter_write(struct sxe_hw *hw,
u16 reg_index, u32 value)
{
SXE_REG_WRITE(hw, SXE_VLVF(reg_index), value);
- return;
}
static u32 sxe_hw_vlan_pool_filter_bitmap_read(struct sxe_hw *hw,
@@ -1733,14 +1648,12 @@ static void sxe_hw_vlan_pool_filter_bitmap_write(struct sxe_hw *hw,
u16 reg_index, u32 value)
{
SXE_REG_WRITE(hw, SXE_VLVFB(reg_index), value);
- return;
}
void sxe_hw_vlan_filter_array_write(struct sxe_hw *hw,
u16 reg_index, u32 value)
{
SXE_REG_WRITE(hw, SXE_VFTA(reg_index), value);
- return;
}
u32 sxe_hw_vlan_filter_array_read(struct sxe_hw *hw, u16 reg_index)
@@ -1753,14 +1666,12 @@ void sxe_hw_vlan_filter_switch(struct sxe_hw *hw, bool is_enable)
u32 vlnctrl;
vlnctrl = SXE_REG_READ(hw, SXE_VLNCTRL);
- if (is_enable) {
+ if (is_enable)
vlnctrl |= SXE_VLNCTRL_VFE;
- } else {
+ else
vlnctrl &= ~SXE_VLNCTRL_VFE;
- }
SXE_REG_WRITE(hw, SXE_VLNCTRL, vlnctrl);
- return;
}
static void sxe_hw_vlan_untagged_pkts_rcv_switch(struct sxe_hw *hw,
@@ -1768,15 +1679,13 @@ static void sxe_hw_vlan_untagged_pkts_rcv_switch(struct sxe_hw *hw,
{
u32 vmolr = SXE_REG_READ(hw, SXE_VMOLR(vf));
vmolr |= SXE_VMOLR_BAM;
- if (accept) {
+ if (accept)
vmolr |= SXE_VMOLR_AUPE;
- } else {
+ else
vmolr &= ~SXE_VMOLR_AUPE;
- }
LOG_WARN("vf:%u value:0x%x.\n", vf, vmolr);
SXE_REG_WRITE(hw, SXE_VMOLR(vf), vmolr);
- return;
}
s32 sxe_hw_vlvf_slot_find(struct sxe_hw *hw, u32 vlan, bool vlvf_bypass)
@@ -1801,14 +1710,12 @@ s32 sxe_hw_vlvf_slot_find(struct sxe_hw *hw, u32 vlan, bool vlvf_bypass)
goto l_end;
}
- if (!first_empty_slot && !bits) {
+ if (!first_empty_slot && !bits)
first_empty_slot = regindex;
- }
}
- if (!first_empty_slot) {
+ if (!first_empty_slot)
LOG_DEV_WARN("no space in VLVF.\n");
- }
ret = first_empty_slot ? : -SXE_ERR_NO_SPACE;
l_end:
@@ -1839,15 +1746,13 @@ s32 sxe_hw_vlan_filter_configure(struct sxe_hw *hw,
vfta_delta &= vlan_on ? ~vfta : vfta;
vfta ^= vfta_delta;
- if (!(SXE_REG_READ(hw, SXE_VT_CTL) & SXE_VT_CTL_VT_ENABLE)) {
+ if (!(SXE_REG_READ(hw, SXE_VT_CTL) & SXE_VT_CTL_VT_ENABLE))
goto vfta_update;
- }
vlvf_index = sxe_hw_vlvf_slot_find(hw, vid, vlvf_bypass);
if (vlvf_index < 0) {
- if (vlvf_bypass) {
+ if (vlvf_bypass)
goto vfta_update;
- }
ret = vlvf_index;
goto l_end;
@@ -1856,17 +1761,15 @@ s32 sxe_hw_vlan_filter_configure(struct sxe_hw *hw,
bits = SXE_REG_READ(hw, SXE_VLVFB(vlvf_index * 2 + pool / 32));
bits |= BIT(pool % 32);
- if (vlan_on) {
+ if (vlan_on)
goto vlvf_update;
- }
bits ^= BIT(pool % 32);
if (!bits &&
- !SXE_REG_READ(hw, SXE_VLVFB(vlvf_index * 2 + 1 - pool / 32))) {
- if (vfta_delta) {
+ !SXE_REG_READ(hw, SXE_VLVFB(vlvf_index * 2 + 1 - pool / 32))) {
+ if (vfta_delta)
SXE_REG_WRITE(hw, SXE_VFTA(regidx), vfta);
- }
SXE_REG_WRITE(hw, SXE_VLVF(vlvf_index), 0);
SXE_REG_WRITE(hw, SXE_VLVFB(vlvf_index * 2 + pool / 32), 0);
@@ -1881,9 +1784,8 @@ s32 sxe_hw_vlan_filter_configure(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_VLVF(vlvf_index), SXE_VLVF_VIEN | vid);
vfta_update:
- if (vfta_delta) {
+ if (vfta_delta)
SXE_REG_WRITE(hw, SXE_VFTA(regidx), vfta);
- }
l_end:
return ret;
@@ -1893,9 +1795,8 @@ void sxe_hw_vlan_filter_array_clear(struct sxe_hw *hw)
{
u32 offset;
- for (offset = 0; offset < SXE_VFT_TBL_SIZE; offset++) {
+ for (offset = 0; offset < SXE_VFT_TBL_SIZE; offset++)
SXE_REG_WRITE(hw, SXE_VFTA(offset), 0);
- }
for (offset = 0; offset < SXE_VLVF_ENTRIES; offset++) {
SXE_REG_WRITE(hw, SXE_VLVF(offset), 0);
@@ -1903,7 +1804,6 @@ void sxe_hw_vlan_filter_array_clear(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_VLVFB(offset * 2 + 1), 0);
}
- return;
}
static const struct sxe_filter_vlan_operations sxe_filter_vlan_ops = {
@@ -1924,56 +1824,51 @@ static void sxe_hw_rx_pkt_buf_switch(struct sxe_hw *hw, bool is_on)
{
u32 dbucfg = SXE_REG_READ(hw, SXE_DRXCFG);
- if (is_on) {
+ if (is_on)
dbucfg |= SXE_DRXCFG_DBURX_START;
- } else {
+ else
dbucfg &= ~SXE_DRXCFG_DBURX_START;
- }
SXE_REG_WRITE(hw, SXE_DRXCFG, dbucfg);
- return;
}
static void sxe_hw_rx_pkt_buf_size_configure(struct sxe_hw *hw,
- u8 num_pb,
- u32 headroom,
- u16 strategy)
+ u8 num_pb,
+ u32 headroom,
+ u16 strategy)
{
u16 total_buf_size = (SXE_RX_PKT_BUF_SIZE - headroom);
u32 rx_buf_size;
u16 i = 0;
- if (!num_pb) {
+ if (!num_pb)
num_pb = 1;
- }
switch (strategy) {
case (PBA_STRATEGY_WEIGHTED):
rx_buf_size = ((total_buf_size * 5 * 2) / (num_pb * 8));
total_buf_size -= rx_buf_size * (num_pb / 2);
rx_buf_size <<= SXE_RX_PKT_BUF_SIZE_SHIFT;
- for (i = 0; i < (num_pb / 2); i++) {
+ for (i = 0; i < (num_pb / 2); i++)
SXE_REG_WRITE(hw, SXE_RXPBSIZE(i), rx_buf_size);
- }
+
fallthrough;
case (PBA_STRATEGY_EQUAL):
rx_buf_size = (total_buf_size / (num_pb - i))
<< SXE_RX_PKT_BUF_SIZE_SHIFT;
- for (; i < num_pb; i++) {
+ for (; i < num_pb; i++)
SXE_REG_WRITE(hw, SXE_RXPBSIZE(i), rx_buf_size);
- }
+
break;
default:
break;
}
- for (; i < SXE_PKG_BUF_NUM_MAX; i++) {
+ for (; i < SXE_PKG_BUF_NUM_MAX; i++)
SXE_REG_WRITE(hw, SXE_RXPBSIZE(i), 0);
- }
- return;
}
u32 sxe_hw_rx_pkt_buf_size_get(struct sxe_hw *hw, u8 pb)
@@ -1990,28 +1885,27 @@ void sxe_hw_rx_multi_ring_configure(struct sxe_hw *hw,
mrqc &= ~SXE_MRQE_MASK;
if (sriov_enable) {
- if (tcs > 4) {
- mrqc |= SXE_MRQC_VMDQRT8TCEN;
- } else if (tcs > 1) {
- mrqc |= SXE_MRQC_VMDQRT4TCEN;
- } else if (is_4q_per_pool == true) {
+ if (tcs > 4)
+ mrqc |= SXE_MRQC_VMDQRT8TCEN;
+ else if (tcs > 1)
+ mrqc |= SXE_MRQC_VMDQRT4TCEN;
+ else if (is_4q_per_pool == true)
mrqc |= SXE_MRQC_VMDQRSS32EN;
- } else {
+ else
mrqc |= SXE_MRQC_VMDQRSS64EN;
- }
+
} else {
- if (tcs > 4) {
+ if (tcs > 4)
mrqc |= SXE_MRQC_RTRSS8TCEN;
- } else if (tcs > 1) {
+ else if (tcs > 1)
mrqc |= SXE_MRQC_RTRSS4TCEN;
- } else {
+ else
mrqc |= SXE_MRQC_RSSEN;
- }
+
}
SXE_REG_WRITE(hw, SXE_MRQC, mrqc);
- return;
}
static void sxe_hw_rss_hash_pkt_type_set(struct sxe_hw *hw, u32 version)
@@ -2020,21 +1914,19 @@ static void sxe_hw_rss_hash_pkt_type_set(struct sxe_hw *hw, u32 version)
u32 rss_field = 0;
rss_field |= SXE_MRQC_RSS_FIELD_IPV4 |
- SXE_MRQC_RSS_FIELD_IPV4_TCP |
- SXE_MRQC_RSS_FIELD_IPV6 |
- SXE_MRQC_RSS_FIELD_IPV6_TCP;
+ SXE_MRQC_RSS_FIELD_IPV4_TCP |
+ SXE_MRQC_RSS_FIELD_IPV6 |
+ SXE_MRQC_RSS_FIELD_IPV6_TCP;
- if (version == SXE_RSS_IP_VER_4) {
+ if (version == SXE_RSS_IP_VER_4)
rss_field |= SXE_MRQC_RSS_FIELD_IPV4_UDP;
- }
- if (version == SXE_RSS_IP_VER_6) {
+
+ if (version == SXE_RSS_IP_VER_6)
rss_field |= SXE_MRQC_RSS_FIELD_IPV6_UDP;
- }
mrqc |= rss_field;
SXE_REG_WRITE(hw, SXE_MRQC, mrqc);
- return;
}
static void sxe_hw_rss_hash_pkt_type_update(struct sxe_hw *hw,
@@ -2045,23 +1937,21 @@ static void sxe_hw_rss_hash_pkt_type_update(struct sxe_hw *hw,
mrqc = SXE_REG_READ(hw, SXE_MRQC);
mrqc |= SXE_MRQC_RSS_FIELD_IPV4
- | SXE_MRQC_RSS_FIELD_IPV4_TCP
- | SXE_MRQC_RSS_FIELD_IPV6
- | SXE_MRQC_RSS_FIELD_IPV6_TCP;
+ | SXE_MRQC_RSS_FIELD_IPV4_TCP
+ | SXE_MRQC_RSS_FIELD_IPV6
+ | SXE_MRQC_RSS_FIELD_IPV6_TCP;
mrqc &= ~(SXE_MRQC_RSS_FIELD_IPV4_UDP |
SXE_MRQC_RSS_FIELD_IPV6_UDP);
- if (version == SXE_RSS_IP_VER_4) {
+ if (version == SXE_RSS_IP_VER_4)
mrqc |= SXE_MRQC_RSS_FIELD_IPV4_UDP;
- }
- if (version == SXE_RSS_IP_VER_6) {
+
+ if (version == SXE_RSS_IP_VER_6)
mrqc |= SXE_MRQC_RSS_FIELD_IPV6_UDP;
- }
SXE_REG_WRITE(hw, SXE_MRQC, mrqc);
- return;
}
static void sxe_hw_rss_rings_used_set(struct sxe_hw *hw, u32 rss_num,
@@ -2069,35 +1959,29 @@ static void sxe_hw_rss_rings_used_set(struct sxe_hw *hw, u32 rss_num,
{
u32 psrtype = 0;
- if (rss_num > 3) {
+ if (rss_num > 3)
psrtype |= 2u << 29;
- } else if (rss_num > 1) {
+ else if (rss_num > 1)
psrtype |= 1u << 29;
- }
- while (pool--) {
+ while (pool--)
SXE_REG_WRITE(hw, SXE_PSRTYPE(pf_offset + pool), psrtype);
- }
- return;
}
void sxe_hw_rss_key_set_all(struct sxe_hw *hw, u32 *rss_key)
{
u32 i;
- for (i = 0; i < SXE_MAX_RSS_KEY_ENTRIES; i++) {
+ for (i = 0; i < SXE_MAX_RSS_KEY_ENTRIES; i++)
SXE_REG_WRITE(hw, SXE_RSSRK(i), rss_key[i]);
- }
- return;
}
void sxe_hw_rss_redir_tbl_reg_write(struct sxe_hw *hw,
u16 reg_idx, u32 value)
{
SXE_REG_WRITE(hw, SXE_RETA(reg_idx >> 2), value);
- return;
}
void sxe_hw_rss_redir_tbl_set_all(struct sxe_hw *hw, u8 *redir_tbl)
@@ -2114,7 +1998,6 @@ void sxe_hw_rss_redir_tbl_set_all(struct sxe_hw *hw, u8 *redir_tbl)
tbl = 0;
}
}
- return;
}
void sxe_hw_rx_cap_switch_on(struct sxe_hw *hw)
@@ -2132,7 +2015,6 @@ void sxe_hw_rx_cap_switch_on(struct sxe_hw *hw)
rxctrl |= SXE_RXCTRL_RXEN;
SXE_REG_WRITE(hw, SXE_RXCTRL, rxctrl);
- return;
}
void sxe_hw_rx_cap_switch_off(struct sxe_hw *hw)
@@ -2153,7 +2035,6 @@ void sxe_hw_rx_cap_switch_off(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_RXCTRL, rxctrl);
}
- return;
}
static void sxe_hw_rx_func_switch_on(struct sxe_hw *hw)
@@ -2164,7 +2045,6 @@ static void sxe_hw_rx_func_switch_on(struct sxe_hw *hw)
rxctrl |= SXE_COMCTRL_RXEN | SXE_COMCTRL_EDSEL;
SXE_REG_WRITE(hw, SXE_COMCTRL, rxctrl);
- return;
}
void sxe_hw_tx_pkt_buf_switch(struct sxe_hw *hw, bool is_on)
@@ -2182,27 +2062,22 @@ void sxe_hw_tx_pkt_buf_switch(struct sxe_hw *hw, bool is_on)
SXE_REG_WRITE(hw, SXE_DTXCFG, dbucfg);
}
- return;
}
void sxe_hw_tx_pkt_buf_size_configure(struct sxe_hw *hw, u8 num_pb)
{
u32 i, tx_pkt_size;
- if (!num_pb){
+ if (!num_pb)
num_pb = 1;
- }
tx_pkt_size = SXE_TX_PBSIZE_MAX / num_pb;
- for (i = 0; i < num_pb; i++) {
+ for (i = 0; i < num_pb; i++)
SXE_REG_WRITE(hw, SXE_TXPBSIZE(i), tx_pkt_size);
- }
- for (; i < SXE_PKG_BUF_NUM_MAX; i++) {
+ for (; i < SXE_PKG_BUF_NUM_MAX; i++)
SXE_REG_WRITE(hw, SXE_TXPBSIZE(i), 0);
- }
- return;
}
void sxe_hw_rx_lro_ack_switch(struct sxe_hw *hw, bool is_on)
@@ -2217,7 +2092,6 @@ void sxe_hw_rx_lro_ack_switch(struct sxe_hw *hw, bool is_on)
SXE_REG_WRITE(hw, SXE_LRODBU, lro_dbu);
- return;
}
static void sxe_hw_vf_rx_switch(struct sxe_hw *hw,
@@ -2232,10 +2106,9 @@ static void sxe_hw_vf_rx_switch(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_VFRE(reg_offset), vfre);
- return;
}
-STATIC s32 sxe_hw_fnav_wait_init_done(struct sxe_hw *hw)
+static s32 sxe_hw_fnav_wait_init_done(struct sxe_hw *hw)
{
u32 i;
s32 ret = 0;
@@ -2266,16 +2139,15 @@ void sxe_hw_fnav_enable(struct sxe_hw *hw, u32 fnavctrl)
SXE_REG_WRITE(hw, SXE_FNAVSKEY, SXE_FNAV_SAMPLE_HASH_KEY);
fnavctrl_ori = SXE_REG_READ(hw, SXE_FNAVCTRL);
- if((fnavctrl_ori & 0x13) != (fnavctrl & 0x13)) {
+ if ((fnavctrl_ori & 0x13) != (fnavctrl & 0x13))
is_clear_stat = true;
- }
SXE_REG_WRITE(hw, SXE_FNAVCTRL, fnavctrl);
SXE_WRITE_FLUSH(hw);
sxe_hw_fnav_wait_init_done(hw);
- if(is_clear_stat) {
+ if (is_clear_stat) {
SXE_REG_READ(hw, SXE_FNAVUSTAT);
SXE_REG_READ(hw, SXE_FNAVFSTAT);
SXE_REG_READ(hw, SXE_FNAVMATCH);
@@ -2283,7 +2155,6 @@ void sxe_hw_fnav_enable(struct sxe_hw *hw, u32 fnavctrl)
SXE_REG_READ(hw, SXE_FNAVLEN);
}
- return;
}
static s32 sxe_hw_fnav_mode_init(struct sxe_hw *hw,
@@ -2295,8 +2166,8 @@ static s32 sxe_hw_fnav_mode_init(struct sxe_hw *hw,
if ((sxe_fnav_mode != SXE_FNAV_SAMPLE_MODE) &&
(sxe_fnav_mode != SXE_FNAV_SPECIFIC_MODE)) {
- LOG_ERROR_BDF("mode[%u] a error fnav mode, fnav do not work. please use"
- "SXE_FNAV_SAMPLE_MODE or SXE_FNAV_SPECIFIC_MODE\n",
+ LOG_ERROR_BDF("mode[%u] a error fnav mode, fnav do not work. please"
+ " use SXE_FNAV_SAMPLE_MODE or SXE_FNAV_SPECIFIC_MODE\n",
sxe_fnav_mode);
goto l_end;
}
@@ -2307,8 +2178,8 @@ static s32 sxe_hw_fnav_mode_init(struct sxe_hw *hw,
}
fnavctrl |= (0x6 << SXE_FNAVCTRL_FLEX_SHIFT) |
- (0xA << SXE_FNAVCTRL_MAX_LENGTH_SHIFT) |
- (4 << SXE_FNAVCTRL_FULL_THRESH_SHIFT);
+ (0xA << SXE_FNAVCTRL_MAX_LENGTH_SHIFT) |
+ (4 << SXE_FNAVCTRL_FULL_THRESH_SHIFT);
sxe_hw_fnav_enable(hw, fnavctrl);
@@ -2359,7 +2230,7 @@ static s32 sxe_hw_fnav_flow_type_mask_get(struct sxe_hw *hw,
case 0x0:
*fnavm |= SXE_FNAVM_L4P;
if (input_mask->ntuple.dst_port ||
- input_mask->ntuple.src_port) {
+ input_mask->ntuple.src_port) {
LOG_DEV_ERR("error on src/dst port mask\n");
ret = -SXE_ERR_CONFIG;
goto l_ret;
@@ -2423,7 +2294,7 @@ static s32 sxe_hw_fnav_flex_bytes_mask_get(struct sxe_hw *hw,
}
s32 sxe_hw_fnav_specific_rule_mask_set(struct sxe_hw *hw,
- union sxe_fnav_rule_info *input_mask)
+ union sxe_fnav_rule_info *input_mask)
{
s32 ret;
u32 fnavm = SXE_FNAVM_DIPv6;
@@ -2431,44 +2302,39 @@ s32 sxe_hw_fnav_specific_rule_mask_set(struct sxe_hw *hw,
struct sxe_adapter *adapter = hw->adapter;
- if (input_mask->ntuple.bkt_hash) {
+ if (input_mask->ntuple.bkt_hash)
LOG_DEV_ERR("bucket hash should always be 0 in mask\n");
- }
ret = sxe_hw_fnav_vm_pool_mask_get(hw, input_mask->ntuple.vm_pool, &fnavm);
- if (ret) {
+ if (ret)
goto l_err_config;
- }
ret = sxe_hw_fnav_flow_type_mask_get(hw, input_mask, &fnavm);
- if (ret) {
+ if (ret)
goto l_err_config;
- }
ret = sxe_hw_fnav_vlan_mask_get(hw, input_mask->ntuple.vlan_id, &fnavm);
- if (ret) {
+ if (ret)
goto l_err_config;
- }
ret = sxe_hw_fnav_flex_bytes_mask_get(hw, input_mask->ntuple.flex_bytes, &fnavm);
- if (ret) {
+ if (ret)
goto l_err_config;
- }
LOG_DEBUG_BDF("fnavm = 0x%x\n", fnavm);
SXE_REG_WRITE(hw, SXE_FNAVM, fnavm);
fnavtcpm = sxe_hw_fnav_port_mask_get(input_mask->ntuple.src_port,
- input_mask->ntuple.dst_port);
+ input_mask->ntuple.dst_port);
LOG_DEBUG_BDF("fnavtcpm = 0x%x\n", fnavtcpm);
SXE_REG_WRITE(hw, SXE_FNAVTCPM, ~fnavtcpm);
SXE_REG_WRITE(hw, SXE_FNAVUDPM, ~fnavtcpm);
SXE_REG_WRITE_BE32(hw, SXE_FNAVSIP4M,
- ~input_mask->ntuple.src_ip[0]);
+ ~input_mask->ntuple.src_ip[0]);
SXE_REG_WRITE_BE32(hw, SXE_FNAVDIP4M,
- ~input_mask->ntuple.dst_ip[0]);
+ ~input_mask->ntuple.dst_ip[0]);
return 0;
@@ -2476,16 +2342,15 @@ s32 sxe_hw_fnav_specific_rule_mask_set(struct sxe_hw *hw,
return -SXE_ERR_CONFIG;
}
-STATIC s32 sxe_hw_fnav_cmd_complete_check(struct sxe_hw *hw,
+static s32 sxe_hw_fnav_cmd_complete_check(struct sxe_hw *hw,
u32 *fnavcmd)
{
u32 i;
for (i = 0; i < SXE_FNAVCMD_CMD_POLL * 10; i++) {
*fnavcmd = SXE_REG_READ(hw, SXE_FNAVCMD);
- if (!(*fnavcmd & SXE_FNAVCMD_CMD_MASK)) {
+ if (!(*fnavcmd & SXE_FNAVCMD_CMD_MASK))
return 0;
- }
udelay(10);
}
@@ -2497,17 +2362,16 @@ static void sxe_hw_fnav_filter_ip_set(struct sxe_hw *hw,
union sxe_fnav_rule_info *input)
{
SXE_REG_WRITE_BE32(hw, SXE_FNAVSIPv6(0),
- input->ntuple.src_ip[0]);
+ input->ntuple.src_ip[0]);
SXE_REG_WRITE_BE32(hw, SXE_FNAVSIPv6(1),
- input->ntuple.src_ip[1]);
+ input->ntuple.src_ip[1]);
SXE_REG_WRITE_BE32(hw, SXE_FNAVSIPv6(2),
- input->ntuple.src_ip[2]);
+ input->ntuple.src_ip[2]);
SXE_REG_WRITE_BE32(hw, SXE_FNAVIPSA, input->ntuple.src_ip[0]);
SXE_REG_WRITE_BE32(hw, SXE_FNAVIPDA, input->ntuple.dst_ip[0]);
- return;
}
static void sxe_hw_fnav_filter_port_set(struct sxe_hw *hw,
@@ -2520,7 +2384,6 @@ static void sxe_hw_fnav_filter_port_set(struct sxe_hw *hw,
fnavport |= be16_to_cpu(input->ntuple.src_port);
SXE_REG_WRITE(hw, SXE_FNAVPORT, fnavport);
- return;
}
static void sxe_hw_fnav_filter_vlan_set(struct sxe_hw *hw,
@@ -2533,7 +2396,6 @@ static void sxe_hw_fnav_filter_vlan_set(struct sxe_hw *hw,
fnavvlan |= ntohs(input->ntuple.vlan_id);
SXE_REG_WRITE(hw, SXE_FNAVVLAN, fnavvlan);
- return;
}
static void sxe_hw_fnav_filter_bkt_hash_set(struct sxe_hw *hw,
@@ -2546,7 +2408,6 @@ static void sxe_hw_fnav_filter_bkt_hash_set(struct sxe_hw *hw,
fnavhash |= soft_id << SXE_FNAVHASH_SIG_SW_INDEX_SHIFT;
SXE_REG_WRITE(hw, SXE_FNAVHASH, fnavhash);
- return;
}
static s32 sxe_hw_fnav_filter_cmd_set(struct sxe_hw *hw,
@@ -2561,9 +2422,8 @@ static s32 sxe_hw_fnav_filter_cmd_set(struct sxe_hw *hw,
SXE_FNAVCMD_LAST | SXE_FNAVCMD_QUEUE_EN;
#ifndef SXE_DPDK
- if (queue == SXE_FNAV_DROP_QUEUE) {
+ if (queue == SXE_FNAV_DROP_QUEUE)
fnavcmd |= SXE_FNAVCMD_DROP;
- }
#endif
fnavcmd |= input->ntuple.flow_type << SXE_FNAVCMD_FLOW_TYPE_SHIFT;
@@ -2572,9 +2432,8 @@ static s32 sxe_hw_fnav_filter_cmd_set(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_FNAVCMD, fnavcmd);
ret = sxe_hw_fnav_cmd_complete_check(hw, &fnavcmd);
- if (ret) {
+ if (ret)
LOG_DEV_ERR("flow navigator command did not complete!\n");
- }
return ret;
}
@@ -2597,9 +2456,8 @@ s32 sxe_hw_fnav_specific_rule_add(struct sxe_hw *hw,
SXE_WRITE_FLUSH(hw);
ret = sxe_hw_fnav_filter_cmd_set(hw, input, queue);
- if (ret) {
+ if (ret)
LOG_ERROR_BDF("set fnav filter cmd error. ret=%d\n", ret);
- }
return ret;
}
@@ -2656,7 +2514,6 @@ void sxe_hw_fnav_sample_rule_configure(struct sxe_hw *hw,
LOG_DEV_DEBUG("tx queue=%x hash=%x\n", queue, (u32)fnavhashcmd);
- return;
}
static u64 sxe_hw_fnav_sample_rule_hash_get(struct sxe_hw *hw,
@@ -2787,7 +2644,6 @@ static void sxe_hw_fnav_sample_stats_reinit(struct sxe_hw *hw)
SXE_REG_READ(hw, SXE_FNAVMISS);
SXE_REG_READ(hw, SXE_FNAVLEN);
- return;
}
static void sxe_hw_ptp_freq_adjust(struct sxe_hw *hw, u32 adj_freq)
@@ -2796,7 +2652,6 @@ static void sxe_hw_ptp_freq_adjust(struct sxe_hw *hw, u32 adj_freq)
SXE_REG_WRITE(hw, SXE_TIMADJH, adj_freq);
SXE_WRITE_FLUSH(hw);
- return;
}
u64 sxe_hw_ptp_systime_get(struct sxe_hw *hw)
@@ -2822,7 +2677,6 @@ void sxe_hw_ptp_systime_init(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_SYSTIMH, 0);
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_ptp_init(struct sxe_hw *hw)
@@ -2834,21 +2688,19 @@ void sxe_hw_ptp_init(struct sxe_hw *hw)
SXE_TSCTRL_L4_UNICAST;
regval = SXE_REG_READ(hw, SXE_TSCTRL);
- regval &= ~SXE_TSCTRL_ONESTEP;
- regval &= ~SXE_TSCTRL_CSEN;
+ regval &= ~SXE_TSCTRL_ONESTEP;
+ regval &= ~SXE_TSCTRL_CSEN;
regval |= tsctl;
SXE_REG_WRITE(hw, SXE_TSCTRL, regval);
SXE_REG_WRITE(hw, SXE_TIMINC,
SXE_TIMINC_SET(SXE_INCPD, SXE_IV_NS, SXE_IV_SNS));
- return;
}
void sxe_hw_ptp_rx_timestamp_clear(struct sxe_hw *hw)
{
SXE_REG_READ(hw, SXE_RXSTMPH);
- return;
}
void sxe_hw_ptp_tx_timestamp_get(struct sxe_hw *hw,
@@ -2878,13 +2730,11 @@ void sxe_hw_ptp_tx_timestamp_get(struct sxe_hw *hw,
*ts_ns = (sec_8bit << 24) | ((reg_ns & 0xFFFFFF00) >> 8);
if (unlikely((sec_24bit - systimm_24bit) >= 0x00FFFFF0)) {
- if (systimm_8bit >= 1) {
+ if (systimm_8bit >= 1)
systimm_8bit -= 1;
- }
}
*ts_sec = systimm_8bit | sec_24bit;
- return;
}
u64 sxe_hw_ptp_rx_timestamp_get(struct sxe_hw *hw)
@@ -2909,9 +2759,8 @@ bool sxe_hw_ptp_is_rx_timestamp_valid(struct sxe_hw *hw)
u32 tsyncrxctl;
tsyncrxctl = SXE_REG_READ(hw, SXE_TSYNCRXCTL);
- if (tsyncrxctl & SXE_TSYNCRXCTL_RXTT) {
+ if (tsyncrxctl & SXE_TSYNCRXCTL_RXTT)
rx_tmstamp_valid = true;
- }
return rx_tmstamp_valid;
}
@@ -2923,9 +2772,9 @@ void sxe_hw_ptp_timestamp_mode_set(struct sxe_hw *hw,
if (is_l2) {
SXE_REG_WRITE(hw, SXE_ETQF(SXE_ETQF_FILTER_1588),
- (SXE_ETQF_FILTER_EN |
- SXE_ETQF_1588 |
- ETH_P_1588));
+ (SXE_ETQF_FILTER_EN |
+ SXE_ETQF_1588 |
+ ETH_P_1588));
} else {
SXE_REG_WRITE(hw, SXE_ETQF(SXE_ETQF_FILTER_1588), 0);
}
@@ -2940,7 +2789,6 @@ void sxe_hw_ptp_timestamp_mode_set(struct sxe_hw *hw,
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_ptp_timestamp_enable(struct sxe_hw *hw)
@@ -2954,7 +2802,6 @@ void sxe_hw_ptp_timestamp_enable(struct sxe_hw *hw)
SXE_TSYNCRXCTL_REN));
SXE_WRITE_FLUSH(hw);
- return;
}
static void sxe_hw_dcb_tc_rss_configure(struct sxe_hw *hw, u16 rss)
@@ -2991,9 +2838,8 @@ static void sxe_hw_tx_ring_disable(struct sxe_hw *hw, u8 reg_idx,
wait_delay += delay_interval * 2;
txdctl = SXE_REG_READ(hw, SXE_TXDCTL(reg_idx));
- if (!(txdctl & SXE_TXDCTL_ENABLE)) {
+ if (!(txdctl & SXE_TXDCTL_ENABLE))
return;
- }
}
LOG_MSG_ERR(drv, "register TXDCTL.ENABLE not cleared within the polling period\n");
@@ -3037,7 +2883,6 @@ static u32 sxe_hw_tx_dbu_fc_status_get(struct sxe_hw *hw)
static void sxe_hw_fnav_sample_hash_set(struct sxe_hw *hw, u64 hash)
{
SXE_REG64_WRITE(hw, SXE_FNAVHASH, hash);
- return;
}
static const struct sxe_dbu_operations sxe_dbu_ops = {
@@ -3088,19 +2933,12 @@ static const struct sxe_dbu_operations sxe_dbu_ops = {
};
-void sxe_hw_rx_dma_ctrl_init(struct sxe_hw *hw, bool crc_strip_on)
+void sxe_hw_rx_dma_ctrl_init(struct sxe_hw *hw)
{
u32 rx_dma_ctrl = SXE_REG_READ(hw, SXE_RDRXCTL);
- if (crc_strip_on) {
- rx_dma_ctrl |= SXE_RDRXCTL_CRCSTRIP;
- } else {
- rx_dma_ctrl &= ~SXE_RDRXCTL_CRCSTRIP;
- }
-
rx_dma_ctrl &= ~SXE_RDRXCTL_LROFRSTSIZE;
SXE_REG_WRITE(hw, SXE_RDRXCTL, rx_dma_ctrl);
- return;
}
void sxe_hw_rx_dma_lro_ctrl_set(struct sxe_hw *hw)
@@ -3109,7 +2947,6 @@ void sxe_hw_rx_dma_lro_ctrl_set(struct sxe_hw *hw)
rx_dma_ctrl |= SXE_RDRXCTL_LROACKC;
SXE_REG_WRITE(hw, SXE_RDRXCTL, rx_dma_ctrl);
- return;
}
void sxe_hw_rx_desc_thresh_set(struct sxe_hw *hw, u8 reg_idx)
@@ -3121,7 +2958,6 @@ void sxe_hw_rx_desc_thresh_set(struct sxe_hw *hw, u8 reg_idx)
rxdctl |= 0x10;
SXE_REG_WRITE(hw, SXE_RXDCTL(reg_idx), rxdctl);
- return;
}
void sxe_hw_rx_ring_switch(struct sxe_hw *hw, u8 reg_idx, bool is_on)
@@ -3156,7 +2992,6 @@ void sxe_hw_rx_ring_switch(struct sxe_hw *hw, u8 reg_idx, bool is_on)
"the polling period\n", reg_idx, is_on);
}
- return;
}
void sxe_hw_rx_ring_switch_not_polling(struct sxe_hw *hw, u8 reg_idx, bool is_on)
@@ -3172,7 +3007,6 @@ void sxe_hw_rx_ring_switch_not_polling(struct sxe_hw *hw, u8 reg_idx, bool is_on
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_rx_queue_desc_reg_configure(struct sxe_hw *hw,
@@ -3181,21 +3015,18 @@ void sxe_hw_rx_queue_desc_reg_configure(struct sxe_hw *hw,
{
SXE_REG_WRITE(hw, SXE_RDH(reg_idx), rdh_value);
SXE_REG_WRITE(hw, SXE_RDT(reg_idx), rdt_value);
- return;
}
static void sxe_hw_rx_ring_head_init(struct sxe_hw *hw, u8 reg_idx)
{
SXE_REG_WRITE(hw, SXE_RDH(reg_idx), 0);
- return;
}
static void sxe_hw_rx_ring_tail_init(struct sxe_hw *hw, u8 reg_idx)
{
SXE_REG_WRITE(hw, SXE_RDT(reg_idx), 0);
- return;
}
void sxe_hw_rx_ring_desc_configure(struct sxe_hw *hw,
@@ -3212,12 +3043,10 @@ void sxe_hw_rx_ring_desc_configure(struct sxe_hw *hw,
sxe_hw_rx_ring_head_init(hw, reg_idx);
sxe_hw_rx_ring_tail_init(hw, reg_idx);
- return;
}
void sxe_hw_rx_rcv_ctl_configure(struct sxe_hw *hw, u8 reg_idx,
- u32 header_buf_len, u32 pkg_buf_len
- )
+ u32 header_buf_len, u32 pkg_buf_len)
{
u32 srrctl;
@@ -3228,7 +3057,6 @@ void sxe_hw_rx_rcv_ctl_configure(struct sxe_hw *hw, u8 reg_idx,
SXE_REG_WRITE(hw, SXE_SRRCTL(reg_idx), srrctl);
- return;
}
void sxe_hw_rx_lro_ctl_configure(struct sxe_hw *hw,
@@ -3240,7 +3068,6 @@ void sxe_hw_rx_lro_ctl_configure(struct sxe_hw *hw,
lroctrl |= max_desc;
SXE_REG_WRITE(hw, SXE_LROCTL(reg_idx), lroctrl);
- return;
}
static u32 sxe_hw_rx_desc_ctrl_get(struct sxe_hw *hw, u8 reg_idx)
@@ -3264,7 +3091,6 @@ static void sxe_hw_dcb_arbiter_set(struct sxe_hw *hw, bool is_enable)
SXE_REG_WRITE(hw, SXE_RTTDCS, rttdcs);
}
- return;
}
@@ -3291,11 +3117,10 @@ static void sxe_hw_tx_multi_ring_configure(struct sxe_hw *hw, u8 tcs,
} else if (tcs > SXE_DCB_1_TC) {
mtqc = SXE_MTQC_RT_ENA | SXE_MTQC_4TC_4TQ;
} else {
- if (max_txq > 63) {
+ if (max_txq > 63)
mtqc = SXE_MTQC_RT_ENA | SXE_MTQC_4TC_4TQ;
- } else {
+ else
mtqc = SXE_MTQC_64Q_1PB;
- }
}
}
@@ -3303,21 +3128,18 @@ static void sxe_hw_tx_multi_ring_configure(struct sxe_hw *hw, u8 tcs,
sxe_hw_dcb_arbiter_set(hw, true);
- return;
}
void sxe_hw_tx_ring_head_init(struct sxe_hw *hw, u8 reg_idx)
{
SXE_REG_WRITE(hw, SXE_TDH(reg_idx), 0);
- return;
}
void sxe_hw_tx_ring_tail_init(struct sxe_hw *hw, u8 reg_idx)
{
SXE_REG_WRITE(hw, SXE_TDT(reg_idx), 0);
- return;
}
void sxe_hw_tx_ring_desc_configure(struct sxe_hw *hw,
@@ -3328,14 +3150,12 @@ void sxe_hw_tx_ring_desc_configure(struct sxe_hw *hw,
SXE_WRITE_FLUSH(hw);
- SXE_REG_WRITE(hw, SXE_TDBAL(reg_idx), (desc_dma_addr & \
- DMA_BIT_MASK(32)));
+ SXE_REG_WRITE(hw, SXE_TDBAL(reg_idx), (desc_dma_addr & DMA_BIT_MASK(32)));
SXE_REG_WRITE(hw, SXE_TDBAH(reg_idx), (desc_dma_addr >> 32));
SXE_REG_WRITE(hw, SXE_TDLEN(reg_idx), desc_mem_len);
sxe_hw_tx_ring_head_init(hw, reg_idx);
sxe_hw_tx_ring_tail_init(hw, reg_idx);
- return;
}
void sxe_hw_tx_desc_thresh_set(
@@ -3352,7 +3172,6 @@ void sxe_hw_tx_desc_thresh_set(
SXE_REG_WRITE(hw, SXE_TXDCTL(reg_idx), txdctl);
- return;
}
void sxe_hw_all_ring_disable(struct sxe_hw *hw, u32 ring_max)
@@ -3372,7 +3191,6 @@ void sxe_hw_all_ring_disable(struct sxe_hw *hw, u32 ring_max)
SXE_WRITE_FLUSH(hw);
usleep_range(1000, 2000);
- return;
}
void sxe_hw_tx_ring_switch(struct sxe_hw *hw, u8 reg_idx, bool is_on)
@@ -3404,7 +3222,6 @@ void sxe_hw_tx_ring_switch(struct sxe_hw *hw, u8 reg_idx, bool is_on)
"the polling period\n", reg_idx, is_on);
}
- return;
}
void sxe_hw_tx_ring_switch_not_polling(struct sxe_hw *hw, u8 reg_idx, bool is_on)
@@ -3418,7 +3235,6 @@ void sxe_hw_tx_ring_switch_not_polling(struct sxe_hw *hw, u8 reg_idx, bool is_on
SXE_REG_WRITE(hw, SXE_TXDCTL(reg_idx), txdctl);
}
- return;
}
void sxe_hw_tx_pkt_buf_thresh_configure(struct sxe_hw *hw,
@@ -3426,26 +3242,21 @@ void sxe_hw_tx_pkt_buf_thresh_configure(struct sxe_hw *hw,
{
u32 i, tx_pkt_size, tx_pb_thresh;
- if (!num_pb){
+ if (!num_pb)
num_pb = 1;
- }
tx_pkt_size = SXE_TX_PBSIZE_MAX / num_pb;
- if (true == dcb_enable) {
+ if (true == dcb_enable)
tx_pb_thresh = (tx_pkt_size / 1024) - SXE_TX_PKT_SIZE_MAX;
- } else {
+ else
tx_pb_thresh = (tx_pkt_size / 1024) - SXE_NODCB_TX_PKT_SIZE_MAX;
- }
- for (i = 0; i < num_pb; i++) {
+ for (i = 0; i < num_pb; i++)
SXE_REG_WRITE(hw, SXE_TXPBTHRESH(i), tx_pb_thresh);
- }
- for (; i < SXE_PKG_BUF_NUM_MAX; i++) {
+ for (; i < SXE_PKG_BUF_NUM_MAX; i++)
SXE_REG_WRITE(hw, SXE_TXPBTHRESH(i), 0);
- }
- return;
}
void sxe_hw_tx_enable(struct sxe_hw *hw)
@@ -3456,7 +3267,6 @@ void sxe_hw_tx_enable(struct sxe_hw *hw)
ctl |= SXE_DMATXCTL_TE;
SXE_REG_WRITE(hw, SXE_DMATXCTL, ctl);
- return;
}
static u32 sxe_hw_tx_desc_ctrl_get(struct sxe_hw *hw, u8 reg_idx)
@@ -3476,7 +3286,6 @@ static void sxe_hw_tx_desc_wb_thresh_clear(struct sxe_hw *hw, u8 reg_idx)
reg_data |= SXE_TXDCTL_ENABLE;
SXE_REG_WRITE(hw, SXE_TXDCTL(reg_idx), reg_data);
- return;
}
void sxe_hw_vlan_tag_strip_switch(struct sxe_hw *hw,
@@ -3486,15 +3295,13 @@ void sxe_hw_vlan_tag_strip_switch(struct sxe_hw *hw,
rxdctl = SXE_REG_READ(hw, SXE_RXDCTL(reg_index));
- if (is_enable) {
+ if (is_enable)
rxdctl |= SXE_RXDCTL_VME;
- } else {
+ else
rxdctl &= ~SXE_RXDCTL_VME;
- }
SXE_REG_WRITE(hw, SXE_RXDCTL(reg_index), rxdctl);
- return;
}
static void sxe_hw_tx_vlan_tag_set(struct sxe_hw *hw,
@@ -3503,13 +3310,11 @@ static void sxe_hw_tx_vlan_tag_set(struct sxe_hw *hw,
u32 vmvir = vid | (qos << VLAN_PRIO_SHIFT) | SXE_VMVIR_VLANA_DEFAULT;
SXE_REG_WRITE(hw, SXE_VMVIR(vf), vmvir);
- return;
}
void sxe_hw_tx_vlan_tag_clear(struct sxe_hw *hw, u32 vf)
{
SXE_REG_WRITE(hw, SXE_VMVIR(vf), 0);
- return;
}
u32 sxe_hw_tx_vlan_insert_get(struct sxe_hw *hw, u32 vf)
@@ -3523,42 +3328,39 @@ void sxe_hw_tx_ring_info_get(struct sxe_hw *hw,
*head = SXE_REG_READ(hw, SXE_TDH(idx));
*tail = SXE_REG_READ(hw, SXE_TDT(idx));
- return;
}
void sxe_hw_dcb_rx_bw_alloc_configure(struct sxe_hw *hw,
- u16 *refill,
- u16 *max,
- u8 *bwg_id,
- u8 *prio_type,
- u8 *prio_tc,
- u8 max_priority)
-{
- u32 reg;
- u32 credit_refill;
- u32 credit_max;
- u8 i;
+ u16 *refill,
+ u16 *max,
+ u8 *bwg_id,
+ u8 *prio_type,
+ u8 *prio_tc,
+ u8 max_priority)
+{
+ u32 reg;
+ u32 credit_refill;
+ u32 credit_max;
+ u8 i;
reg = SXE_RTRPCS_RRM | SXE_RTRPCS_RAC | SXE_RTRPCS_ARBDIS;
SXE_REG_WRITE(hw, SXE_RTRPCS, reg);
reg = 0;
- for (i = 0; i < max_priority; i++) {
+ for (i = 0; i < max_priority; i++)
reg |= (prio_tc[i] << (i * SXE_RTRUP2TC_UP_SHIFT));
- }
SXE_REG_WRITE(hw, SXE_RTRUP2TC, reg);
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
credit_refill = refill[i];
- credit_max = max[i];
+ credit_max = max[i];
reg = credit_refill | (credit_max << SXE_RTRPT4C_MCL_SHIFT);
reg |= (u32)(bwg_id[i]) << SXE_RTRPT4C_BWG_SHIFT;
- if (prio_type[i] == PRIO_LINK) {
+ if (prio_type[i] == PRIO_LINK)
reg |= SXE_RTRPT4C_LSP;
- }
SXE_REG_WRITE(hw, SXE_RTRPT4C(i), reg);
}
@@ -3566,7 +3368,6 @@ void sxe_hw_dcb_rx_bw_alloc_configure(struct sxe_hw *hw,
reg = SXE_RTRPCS_RRM | SXE_RTRPCS_RAC;
SXE_REG_WRITE(hw, SXE_RTRPCS, reg);
- return;
}
void sxe_hw_dcb_tx_desc_bw_alloc_configure(struct sxe_hw *hw,
@@ -3575,8 +3376,8 @@ void sxe_hw_dcb_tx_desc_bw_alloc_configure(struct sxe_hw *hw,
u8 *bwg_id,
u8 *prio_type)
{
- u32 reg, max_credits;
- u8 i;
+ u32 reg, max_credits;
+ u8 i;
for (i = 0; i < 128; i++) {
SXE_REG_WRITE(hw, SXE_RTTDQSEL, i);
@@ -3589,13 +3390,11 @@ void sxe_hw_dcb_tx_desc_bw_alloc_configure(struct sxe_hw *hw,
reg |= refill[i];
reg |= (u32)(bwg_id[i]) << SXE_RTTDT2C_BWG_SHIFT;
- if (prio_type[i] == PRIO_GROUP) {
+ if (prio_type[i] == PRIO_GROUP)
reg |= SXE_RTTDT2C_GSP;
- }
- if (prio_type[i] == PRIO_LINK) {
+ if (prio_type[i] == PRIO_LINK)
reg |= SXE_RTTDT2C_LSP;
- }
SXE_REG_WRITE(hw, SXE_RTTDT2C(i), reg);
}
@@ -3603,7 +3402,6 @@ void sxe_hw_dcb_tx_desc_bw_alloc_configure(struct sxe_hw *hw,
reg = SXE_RTTDCS_TDPAC | SXE_RTTDCS_TDRM;
SXE_REG_WRITE(hw, SXE_RTTDCS, reg);
- return;
}
void sxe_hw_dcb_tx_data_bw_alloc_configure(struct sxe_hw *hw,
@@ -3618,14 +3416,13 @@ void sxe_hw_dcb_tx_data_bw_alloc_configure(struct sxe_hw *hw,
u8 i;
reg = SXE_RTTPCS_TPPAC | SXE_RTTPCS_TPRM |
- (SXE_RTTPCS_ARBD_DCB << SXE_RTTPCS_ARBD_SHIFT) |
- SXE_RTTPCS_ARBDIS;
+ (SXE_RTTPCS_ARBD_DCB << SXE_RTTPCS_ARBD_SHIFT) |
+ SXE_RTTPCS_ARBDIS;
SXE_REG_WRITE(hw, SXE_RTTPCS, reg);
reg = 0;
- for (i = 0; i < max_priority; i++) {
+ for (i = 0; i < max_priority; i++)
reg |= (prio_tc[i] << (i * SXE_RTTUP2TC_UP_SHIFT));
- }
SXE_REG_WRITE(hw, SXE_RTTUP2TC, reg);
@@ -3634,22 +3431,19 @@ void sxe_hw_dcb_tx_data_bw_alloc_configure(struct sxe_hw *hw,
reg |= (u32)(max[i]) << SXE_RTTPT2C_MCL_SHIFT;
reg |= (u32)(bwg_id[i]) << SXE_RTTPT2C_BWG_SHIFT;
- if (prio_type[i] == PRIO_GROUP) {
+ if (prio_type[i] == PRIO_GROUP)
reg |= SXE_RTTPT2C_GSP;
- }
- if (prio_type[i] == PRIO_LINK) {
+ if (prio_type[i] == PRIO_LINK)
reg |= SXE_RTTPT2C_LSP;
- }
SXE_REG_WRITE(hw, SXE_RTTPT2C(i), reg);
}
reg = SXE_RTTPCS_TPPAC | SXE_RTTPCS_TPRM |
- (SXE_RTTPCS_ARBD_DCB << SXE_RTTPCS_ARBD_SHIFT);
+ (SXE_RTTPCS_ARBD_DCB << SXE_RTTPCS_ARBD_SHIFT);
SXE_REG_WRITE(hw, SXE_RTTPCS, reg);
- return;
}
void sxe_hw_dcb_pfc_configure(struct sxe_hw *hw,
@@ -3682,9 +3476,8 @@ void sxe_hw_dcb_pfc_configure(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_PFCTOP, reg_val);
for (i = 0; i < max_priority; i++) {
- if (prio_tc[i] > max_tc) {
+ if (prio_tc[i] > max_tc)
max_tc = prio_tc[i];
- }
}
for (i = 0; i <= max_tc; i++) {
@@ -3716,13 +3509,11 @@ void sxe_hw_dcb_pfc_configure(struct sxe_hw *hw,
}
reg = hw->fc.pause_time * 0x00010001;
- for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++) {
+ for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++)
SXE_REG_WRITE(hw, SXE_FCTTV(i), reg);
- }
SXE_REG_WRITE(hw, SXE_FCRTV, hw->fc.pause_time / 2);
- return;
}
static void sxe_hw_dcb_8tc_vmdq_off_stats_configure(struct sxe_hw *hw)
@@ -3736,28 +3527,26 @@ static void sxe_hw_dcb_8tc_vmdq_off_stats_configure(struct sxe_hw *hw)
}
for (i = 0; i < 32; i++) {
- if (i < 8) {
+ if (i < 8)
reg = 0x00000000;
- } else if (i < 16) {
+ else if (i < 16)
reg = 0x01010101;
- } else if (i < 20) {
+ else if (i < 20)
reg = 0x02020202;
- } else if (i < 24) {
+ else if (i < 24)
reg = 0x03030303;
- } else if (i < 26) {
+ else if (i < 26)
reg = 0x04040404;
- } else if (i < 28) {
+ else if (i < 28)
reg = 0x05050505;
- } else if (i < 30) {
+ else if (i < 30)
reg = 0x06060606;
- } else {
+ else
reg = 0x07070707;
- }
SXE_REG_WRITE(hw, SXE_TQSM(i), reg);
}
- return;
}
static void sxe_hw_dcb_rx_up_tc_map_set(struct sxe_hw *hw, u8 tc)
@@ -3771,28 +3560,23 @@ static void sxe_hw_dcb_rx_up_tc_map_set(struct sxe_hw *hw, u8 tc)
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
u8 up2tc = reg >> (i * SXE_RTRUP2TC_UP_SHIFT);
- if (up2tc > tc) {
+ if (up2tc > tc)
reg &= ~(0x7 << SXE_RTRUP2TC_UP_MASK);
- }
}
- if (reg != rsave) {
+ if (reg != rsave)
SXE_REG_WRITE(hw, SXE_RTRUP2TC, reg);
- }
- return;
}
void sxe_hw_vt_pool_loopback_switch(struct sxe_hw *hw,
bool is_enable)
{
- if (true == is_enable) {
+ if (true == is_enable)
SXE_REG_WRITE(hw, SXE_PFDTXGSWC, SXE_PFDTXGSWC_VT_LBEN);
- } else {
+ else
SXE_REG_WRITE(hw, SXE_PFDTXGSWC, 0);
- }
- return;
}
void sxe_hw_pool_rx_ring_drop_enable(struct sxe_hw *hw, u8 vf_idx,
@@ -3801,12 +3585,10 @@ void sxe_hw_pool_rx_ring_drop_enable(struct sxe_hw *hw, u8 vf_idx,
u32 qde = SXE_QDE_ENABLE;
u8 i;
- if (pf_vlan) {
+ if (pf_vlan)
qde |= SXE_QDE_HIDE_VLAN;
- }
- for (i = (vf_idx * ring_per_pool); i < ((vf_idx + 1) * ring_per_pool); i++)
- {
+ for (i = (vf_idx * ring_per_pool); i < ((vf_idx + 1) * ring_per_pool); i++) {
u32 value;
SXE_WRITE_FLUSH(hw);
@@ -3817,7 +3599,6 @@ void sxe_hw_pool_rx_ring_drop_enable(struct sxe_hw *hw, u8 vf_idx,
SXE_REG_WRITE(hw, SXE_QDE, value);
}
- return;
}
u32 sxe_hw_rx_pool_bitmap_get(struct sxe_hw *hw, u8 reg_idx)
@@ -3830,7 +3611,6 @@ void sxe_hw_rx_pool_bitmap_set(struct sxe_hw *hw,
{
SXE_REG_WRITE(hw, SXE_VFRE(reg_idx), bitmap);
- return;
}
u32 sxe_hw_tx_pool_bitmap_get(struct sxe_hw *hw, u8 reg_idx)
@@ -3843,14 +3623,12 @@ void sxe_hw_tx_pool_bitmap_set(struct sxe_hw *hw,
{
SXE_REG_WRITE(hw, SXE_VFTE(reg_idx), bitmap);
- return;
}
void sxe_hw_dcb_max_mem_window_set(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_RTTBCNRM, value);
- return;
}
void sxe_hw_dcb_tx_ring_rate_factor_set(struct sxe_hw *hw,
@@ -3859,7 +3637,6 @@ void sxe_hw_dcb_tx_ring_rate_factor_set(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_RTTDQSEL, ring_idx);
SXE_REG_WRITE(hw, SXE_RTTBCNRC, rate);
- return;
}
void sxe_hw_spoof_count_enable(struct sxe_hw *hw,
@@ -3871,7 +3648,6 @@ void sxe_hw_spoof_count_enable(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_VMECM(reg_idx), value);
- return;
}
void sxe_hw_pool_mac_anti_spoof_set(struct sxe_hw *hw,
@@ -3883,15 +3659,13 @@ void sxe_hw_pool_mac_anti_spoof_set(struct sxe_hw *hw,
value = SXE_REG_READ(hw, SXE_SPOOF(reg_index));
- if (status) {
+ if (status)
value |= BIT(bit_index);
- } else {
+ else
value &= ~BIT(bit_index);
- }
SXE_REG_WRITE(hw, SXE_SPOOF(reg_index), value);
- return;
}
static void sxe_hw_dcb_rx_up_tc_map_get(struct sxe_hw *hw, u8 *map)
@@ -3904,22 +3678,19 @@ static void sxe_hw_dcb_rx_up_tc_map_get(struct sxe_hw *hw, u8 *map)
(reg >> (i * SXE_RTRUP2TC_UP_SHIFT));
}
- return;
}
void sxe_hw_rx_drop_switch(struct sxe_hw *hw, u8 idx, bool is_enable)
{
u32 srrctl = SXE_REG_READ(hw, SXE_SRRCTL(idx));
- if (true == is_enable) {
+ if (true == is_enable)
srrctl |= SXE_SRRCTL_DROP_EN;
- } else {
+ else
srrctl &= ~SXE_SRRCTL_DROP_EN;
- }
SXE_REG_WRITE(hw, SXE_SRRCTL(idx), srrctl);
- return;
}
static void sxe_hw_pool_vlan_anti_spoof_set(struct sxe_hw *hw,
@@ -3931,15 +3702,13 @@ static void sxe_hw_pool_vlan_anti_spoof_set(struct sxe_hw *hw,
value = SXE_REG_READ(hw, SXE_SPOOF(reg_index));
- if (status) {
+ if (status)
value |= BIT(bit_index);
- } else {
+ else
value &= ~BIT(bit_index);
- }
SXE_REG_WRITE(hw, SXE_SPOOF(reg_index), value);
- return;
}
static void sxe_hw_vf_tx_desc_addr_clear(struct sxe_hw *hw,
@@ -3952,7 +3721,6 @@ static void sxe_hw_vf_tx_desc_addr_clear(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_PVFTDWBAH_N(ring_per_pool, vf_idx, i), 0);
}
- return;
}
static void sxe_hw_vf_tx_ring_disable(struct sxe_hw *hw,
@@ -3974,7 +3742,6 @@ static void sxe_hw_vf_tx_ring_disable(struct sxe_hw *hw,
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_dcb_rate_limiter_clear(struct sxe_hw *hw, u8 ring_max)
@@ -3987,7 +3754,6 @@ void sxe_hw_dcb_rate_limiter_clear(struct sxe_hw *hw, u8 ring_max)
}
SXE_WRITE_FLUSH(hw);
- return;
}
static void sxe_hw_tx_tph_update(struct sxe_hw *hw, u8 ring_idx, u8 cpu)
@@ -3996,12 +3762,11 @@ static void sxe_hw_tx_tph_update(struct sxe_hw *hw, u8 ring_idx, u8 cpu)
value <<= SXE_TPH_TXCTRL_CPUID_SHIFT;
- value |= SXE_TPH_TXCTRL_DESC_RRO_EN | \
- SXE_TPH_TXCTRL_DATA_RRO_EN | \
- SXE_TPH_TXCTRL_DESC_TPH_EN;
+ value |= (SXE_TPH_TXCTRL_DESC_RRO_EN |
+ SXE_TPH_TXCTRL_DATA_RRO_EN |
+ SXE_TPH_TXCTRL_DESC_TPH_EN);
SXE_REG_WRITE(hw, SXE_TPH_TXCTRL(ring_idx), value);
- return;
}
static void sxe_hw_rx_tph_update(struct sxe_hw *hw, u8 ring_idx, u8 cpu)
@@ -4010,29 +3775,26 @@ static void sxe_hw_rx_tph_update(struct sxe_hw *hw, u8 ring_idx, u8 cpu)
value <<= SXE_TPH_RXCTRL_CPUID_SHIFT;
- value |= SXE_TPH_RXCTRL_DESC_RRO_EN | \
- SXE_TPH_RXCTRL_DATA_TPH_EN | \
- SXE_TPH_RXCTRL_DESC_TPH_EN;
+ value |= (SXE_TPH_RXCTRL_DESC_RRO_EN |
+ SXE_TPH_RXCTRL_DATA_TPH_EN |
+ SXE_TPH_RXCTRL_DESC_TPH_EN);
SXE_REG_WRITE(hw, SXE_TPH_RXCTRL(ring_idx), value);
- return;
}
static void sxe_hw_tph_switch(struct sxe_hw *hw, bool is_enable)
{
- if (is_enable == true) {
+ if (is_enable == true)
SXE_REG_WRITE(hw, SXE_TPH_CTRL, SXE_TPH_CTRL_MODE_CB2);
- } else {
+ else
SXE_REG_WRITE(hw, SXE_TPH_CTRL, SXE_TPH_CTRL_DISABLE);
- }
- return;
}
static const struct sxe_dma_operations sxe_dma_ops = {
- .rx_dma_ctrl_init = sxe_hw_rx_dma_ctrl_init,
- .rx_ring_switch = sxe_hw_rx_ring_switch,
- .rx_ring_switch_not_polling = sxe_hw_rx_ring_switch_not_polling,
+ .rx_dma_ctrl_init = sxe_hw_rx_dma_ctrl_init,
+ .rx_ring_switch = sxe_hw_rx_ring_switch,
+ .rx_ring_switch_not_polling = sxe_hw_rx_ring_switch_not_polling,
.rx_ring_desc_configure = sxe_hw_rx_ring_desc_configure,
.rx_desc_thresh_set = sxe_hw_rx_desc_thresh_set,
.rx_rcv_ctl_configure = sxe_hw_rx_rcv_ctl_configure,
@@ -4049,7 +3811,7 @@ static const struct sxe_dma_operations sxe_dma_ops = {
.tx_desc_thresh_set = sxe_hw_tx_desc_thresh_set,
.tx_desc_wb_thresh_clear = sxe_hw_tx_desc_wb_thresh_clear,
.tx_ring_switch = sxe_hw_tx_ring_switch,
- .tx_ring_switch_not_polling = sxe_hw_tx_ring_switch_not_polling,
+ .tx_ring_switch_not_polling = sxe_hw_tx_ring_switch_not_polling,
.tx_pkt_buf_thresh_configure = sxe_hw_tx_pkt_buf_thresh_configure,
.tx_desc_ctrl_get = sxe_hw_tx_desc_ctrl_get,
.tx_ring_info_get = sxe_hw_tx_ring_info_get,
@@ -4084,9 +3846,9 @@ static const struct sxe_dma_operations sxe_dma_ops = {
.max_dcb_memory_window_set = sxe_hw_dcb_max_mem_window_set,
.spoof_count_enable = sxe_hw_spoof_count_enable,
- .vf_tx_ring_disable = sxe_hw_vf_tx_ring_disable,
- .all_ring_disable = sxe_hw_all_ring_disable,
- .tx_ring_tail_init = sxe_hw_tx_ring_tail_init,
+ .vf_tx_ring_disable = sxe_hw_vf_tx_ring_disable,
+ .all_ring_disable = sxe_hw_all_ring_disable,
+ .tx_ring_tail_init = sxe_hw_tx_ring_tail_init,
};
@@ -4099,16 +3861,15 @@ static void sxe_hw_ipsec_rx_sa_load(struct sxe_hw *hw, u16 idx,
reg &= SXE_RXTXIDX_IPS_EN;
reg |= type << SXE_RXIDX_TBL_SHIFT |
- idx << SXE_RXTXIDX_IDX_SHIFT |
- SXE_RXTXIDX_WRITE;
+ idx << SXE_RXTXIDX_IDX_SHIFT |
+ SXE_RXTXIDX_WRITE;
SXE_REG_WRITE(hw, SXE_IPSRXIDX, reg);
SXE_WRITE_FLUSH(hw);
- return;
}
static void sxe_hw_ipsec_rx_ip_store(struct sxe_hw *hw,
- __be32 *ip_addr, u8 ip_len, u8 ip_idx)
+ __be32 *ip_addr, u8 ip_len, u8 ip_idx)
{
u8 i;
@@ -4119,11 +3880,10 @@ static void sxe_hw_ipsec_rx_ip_store(struct sxe_hw *hw,
SXE_WRITE_FLUSH(hw);
sxe_hw_ipsec_rx_sa_load(hw, ip_idx, SXE_IPSEC_IP_TABLE);
- return;
}
static void sxe_hw_ipsec_rx_spi_store(struct sxe_hw *hw,
- __be32 spi, u8 ip_idx, u16 sa_idx)
+ __be32 spi, u8 ip_idx, u16 sa_idx)
{
SXE_REG_WRITE(hw, SXE_IPSRXSPI, (__force u32)cpu_to_le32((__force u32)spi));
@@ -4133,7 +3893,6 @@ static void sxe_hw_ipsec_rx_spi_store(struct sxe_hw *hw,
sxe_hw_ipsec_rx_sa_load(hw, sa_idx, SXE_IPSEC_SPI_TABLE);
- return;
}
static void sxe_hw_ipsec_rx_key_store(struct sxe_hw *hw,
@@ -4152,7 +3911,6 @@ static void sxe_hw_ipsec_rx_key_store(struct sxe_hw *hw,
sxe_hw_ipsec_rx_sa_load(hw, sa_idx, SXE_IPSEC_KEY_TABLE);
- return;
}
static void sxe_hw_ipsec_tx_sa_load(struct sxe_hw *hw, u16 idx)
@@ -4164,7 +3922,6 @@ static void sxe_hw_ipsec_tx_sa_load(struct sxe_hw *hw, u16 idx)
SXE_REG_WRITE(hw, SXE_IPSTXIDX, reg);
SXE_WRITE_FLUSH(hw);
- return;
}
static void sxe_hw_ipsec_tx_key_store(struct sxe_hw *hw, u32 *key,
@@ -4181,7 +3938,6 @@ static void sxe_hw_ipsec_tx_key_store(struct sxe_hw *hw, u32 *key,
sxe_hw_ipsec_tx_sa_load(hw, sa_idx);
- return;
}
static void sxe_hw_ipsec_sec_data_stop(struct sxe_hw *hw, bool is_linkup)
@@ -4200,9 +3956,8 @@ static void sxe_hw_ipsec_sec_data_stop(struct sxe_hw *hw, bool is_linkup)
tx_empty = SXE_REG_READ(hw, SXE_SECTXSTAT) & SXE_SECTXSTAT_SECTX_RDY;
rx_empty = SXE_REG_READ(hw, SXE_SECRXSTAT) & SXE_SECRXSTAT_SECRX_RDY;
- if (tx_empty && rx_empty) {
- goto l_out;
- }
+ if (tx_empty && rx_empty)
+ return;
if (!is_linkup) {
SXE_REG_WRITE(hw, SXE_LPBKCTRL, SXE_LPBKCTRL_EN);
@@ -4213,11 +3968,11 @@ static void sxe_hw_ipsec_sec_data_stop(struct sxe_hw *hw, bool is_linkup)
limit = 20;
do {
- mdelay(10);
- tx_empty = SXE_REG_READ(hw, SXE_SECTXSTAT) &
- SXE_SECTXSTAT_SECTX_RDY;
+ mdelay(10);
+ tx_empty = SXE_REG_READ(hw, SXE_SECTXSTAT) &
+ SXE_SECTXSTAT_SECTX_RDY;
rx_empty = SXE_REG_READ(hw, SXE_SECRXSTAT) &
- SXE_SECRXSTAT_SECRX_RDY;
+ SXE_SECRXSTAT_SECRX_RDY;
} while (!(tx_empty && rx_empty) && limit--);
if (!is_linkup) {
@@ -4226,8 +3981,6 @@ static void sxe_hw_ipsec_sec_data_stop(struct sxe_hw *hw, bool is_linkup)
SXE_WRITE_FLUSH(hw);
}
-l_out:
- return;
}
static void sxe_hw_ipsec_engine_start(struct sxe_hw *hw, bool is_linkup)
@@ -4252,7 +4005,6 @@ static void sxe_hw_ipsec_engine_start(struct sxe_hw *hw, bool is_linkup)
SXE_WRITE_FLUSH(hw);
- return;
}
static void sxe_hw_ipsec_engine_stop(struct sxe_hw *hw, bool is_linkup)
@@ -4273,18 +4025,17 @@ static void sxe_hw_ipsec_engine_stop(struct sxe_hw *hw, bool is_linkup)
reg |= SXE_SECRXCTRL_SECRX_DIS;
SXE_REG_WRITE(hw, SXE_SECRXCTRL, reg);
- SXE_REG_WRITE(hw, SXE_SECTXBUFFAF, 0x250);
+ SXE_REG_WRITE(hw, SXE_SECTXBUFFAF, 0x250);
- reg = SXE_REG_READ(hw, SXE_SECTXMINIFG);
- reg = (reg & 0xfffffff0) | 0x1;
- SXE_REG_WRITE(hw, SXE_SECTXMINIFG, reg);
+ reg = SXE_REG_READ(hw, SXE_SECTXMINIFG);
+ reg = (reg & 0xfffffff0) | 0x1;
+ SXE_REG_WRITE(hw, SXE_SECTXMINIFG, reg);
- SXE_REG_WRITE(hw, SXE_SECTXCTRL, SXE_SECTXCTRL_SECTX_DIS);
- SXE_REG_WRITE(hw, SXE_SECRXCTRL, SXE_SECRXCTRL_SECRX_DIS);
+ SXE_REG_WRITE(hw, SXE_SECTXCTRL, SXE_SECTXCTRL_SECTX_DIS);
+ SXE_REG_WRITE(hw, SXE_SECRXCTRL, SXE_SECRXCTRL_SECRX_DIS);
- SXE_WRITE_FLUSH(hw);
+ SXE_WRITE_FLUSH(hw);
- return;
}
bool sxe_hw_ipsec_offload_is_disable(struct sxe_hw *hw)
@@ -4294,7 +4045,7 @@ bool sxe_hw_ipsec_offload_is_disable(struct sxe_hw *hw)
bool ret = false;
if ((tx_dis & SXE_SECTXSTAT_SECTX_OFF_DIS) ||
- (rx_dis & SXE_SECRXSTAT_SECRX_OFF_DIS)) {
+ (rx_dis & SXE_SECRXSTAT_SECRX_OFF_DIS)) {
ret = true;
}
@@ -4306,7 +4057,6 @@ void sxe_hw_ipsec_sa_disable(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_IPSRXIDX, 0);
SXE_REG_WRITE(hw, SXE_IPSTXIDX, 0);
- return;
}
static const struct sxe_sec_operations sxe_sec_ops = {
@@ -4344,18 +4094,18 @@ void sxe_hw_stats_regs_clean(struct sxe_hw *hw)
SXE_REG_READ(hw, SXE_TXDGPC);
SXE_REG_READ(hw, SXE_TXDGBCH);
SXE_REG_READ(hw, SXE_TXDGBCL);
- SXE_REG_READ(hw,SXE_RXDDGPC);
+ SXE_REG_READ(hw, SXE_RXDDGPC);
SXE_REG_READ(hw, SXE_RXDDGBCH);
- SXE_REG_READ(hw,SXE_RXDDGBCL);
- SXE_REG_READ(hw,SXE_RXLPBKGPC);
+ SXE_REG_READ(hw, SXE_RXDDGBCL);
+ SXE_REG_READ(hw, SXE_RXLPBKGPC);
SXE_REG_READ(hw, SXE_RXLPBKGBCH);
- SXE_REG_READ(hw,SXE_RXLPBKGBCL);
- SXE_REG_READ(hw,SXE_RXDLPBKGPC);
+ SXE_REG_READ(hw, SXE_RXLPBKGBCL);
+ SXE_REG_READ(hw, SXE_RXDLPBKGPC);
SXE_REG_READ(hw, SXE_RXDLPBKGBCH);
- SXE_REG_READ(hw,SXE_RXDLPBKGBCL);
- SXE_REG_READ(hw,SXE_RXTPCIN);
- SXE_REG_READ(hw,SXE_RXTPCOUT);
- SXE_REG_READ(hw,SXE_RXPRDDC);
+ SXE_REG_READ(hw, SXE_RXDLPBKGBCL);
+ SXE_REG_READ(hw, SXE_RXTPCIN);
+ SXE_REG_READ(hw, SXE_RXTPCOUT);
+ SXE_REG_READ(hw, SXE_RXPRDDC);
SXE_REG_READ(hw, SXE_TXSWERR);
SXE_REG_READ(hw, SXE_TXSWITCH);
SXE_REG_READ(hw, SXE_TXREPEAT);
@@ -4382,9 +4132,9 @@ void sxe_hw_stats_regs_clean(struct sxe_hw *hw)
SXE_REG_READ(hw, SXE_RFC);
SXE_REG_READ(hw, SXE_ROC);
SXE_REG_READ(hw, SXE_RJC);
- for (i = 0; i < 8; i++) {
+ for (i = 0; i < 8; i++)
SXE_REG_READ(hw, SXE_PRCPF(i));
- }
+
SXE_REG_READ(hw, SXE_TORL);
SXE_REG_READ(hw, SXE_TORH);
SXE_REG_READ(hw, SXE_TPR);
@@ -4397,11 +4147,9 @@ void sxe_hw_stats_regs_clean(struct sxe_hw *hw)
SXE_REG_READ(hw, SXE_PTC1522);
SXE_REG_READ(hw, SXE_MPTC);
SXE_REG_READ(hw, SXE_BPTC);
- for (i = 0; i < 8; i++) {
+ for (i = 0; i < 8; i++)
SXE_REG_READ(hw, SXE_PFCT(i));
- }
- return;
}
static void sxe_hw_stats_seq_get(struct sxe_hw *hw, struct sxe_mac_stats *stats)
@@ -4414,8 +4162,8 @@ static void sxe_hw_stats_seq_get(struct sxe_hw *hw, struct sxe_mac_stats *stats)
#endif
for (i = 0; i < 8; i++) {
- stats->prcpf[i] += SXE_REG_READ(hw,SXE_PRCPF(i));
- tx_pfc_num = SXE_REG_READ(hw,SXE_PFCT(i));
+ stats->prcpf[i] += SXE_REG_READ(hw, SXE_PRCPF(i));
+ tx_pfc_num = SXE_REG_READ(hw, SXE_PFCT(i));
stats->pfct[i] += tx_pfc_num;
stats->total_tx_pause += tx_pfc_num;
}
@@ -4433,7 +4181,6 @@ static void sxe_hw_stats_seq_get(struct sxe_hw *hw, struct sxe_mac_stats *stats)
}
#endif
- return;
}
void sxe_hw_stats_seq_clean(struct sxe_hw *hw, struct sxe_mac_stats *stats)
@@ -4453,15 +4200,13 @@ void sxe_hw_stats_seq_clean(struct sxe_hw *hw, struct sxe_mac_stats *stats)
if (gotch != 0) {
LOG_INFO("GOTCH is not clear!\n");
}
-
for (i = 0; i < 8; i++) {
- stats->prcpf[i] += SXE_REG_READ(hw,SXE_PRCPF(i));
- tx_pfc_num = SXE_REG_READ(hw,SXE_PFCT(i));
+ stats->prcpf[i] += SXE_REG_READ(hw, SXE_PRCPF(i));
+ tx_pfc_num = SXE_REG_READ(hw, SXE_PFCT(i));
stats->pfct[i] += tx_pfc_num;
stats->total_tx_pause += tx_pfc_num;
}
- return;
}
void sxe_hw_stats_get(struct sxe_hw *hw, struct sxe_mac_stats *stats)
@@ -4497,20 +4242,20 @@ void sxe_hw_stats_get(struct sxe_hw *hw, struct sxe_mac_stats *stats)
stats->txdgbc += (((u64)SXE_REG_READ(hw, SXE_TXDGBCH) << 32) +
SXE_REG_READ(hw, SXE_TXDGBCL));
- stats->rxddpc += SXE_REG_READ(hw,SXE_RXDDGPC);
+ stats->rxddpc += SXE_REG_READ(hw, SXE_RXDDGPC);
stats->rxddbc += ((u64)SXE_REG_READ(hw, SXE_RXDDGBCH) << 32) +
- (SXE_REG_READ(hw,SXE_RXDDGBCL));
+ (SXE_REG_READ(hw, SXE_RXDDGBCL));
- stats->rxlpbkpc += SXE_REG_READ(hw,SXE_RXLPBKGPC);
+ stats->rxlpbkpc += SXE_REG_READ(hw, SXE_RXLPBKGPC);
stats->rxlpbkbc += ((u64)SXE_REG_READ(hw, SXE_RXLPBKGBCH) << 32) +
- (SXE_REG_READ(hw,SXE_RXLPBKGBCL));
+ (SXE_REG_READ(hw, SXE_RXLPBKGBCL));
- stats->rxdlpbkpc += SXE_REG_READ(hw,SXE_RXDLPBKGPC);
+ stats->rxdlpbkpc += SXE_REG_READ(hw, SXE_RXDLPBKGPC);
stats->rxdlpbkbc += ((u64)SXE_REG_READ(hw, SXE_RXDLPBKGBCH) << 32) +
- (SXE_REG_READ(hw,SXE_RXDLPBKGBCL));
- stats->rxtpcing += SXE_REG_READ(hw,SXE_RXTPCIN);
- stats->rxtpceng += SXE_REG_READ(hw,SXE_RXTPCOUT);
- stats->prddc += SXE_REG_READ(hw,SXE_RXPRDDC);
+ (SXE_REG_READ(hw, SXE_RXDLPBKGBCL));
+ stats->rxtpcing += SXE_REG_READ(hw, SXE_RXTPCIN);
+ stats->rxtpceng += SXE_REG_READ(hw, SXE_RXTPCOUT);
+ stats->prddc += SXE_REG_READ(hw, SXE_RXPRDDC);
stats->txswerr += SXE_REG_READ(hw, SXE_TXSWERR);
stats->txswitch += SXE_REG_READ(hw, SXE_TXSWITCH);
stats->txrepeat += SXE_REG_READ(hw, SXE_TXREPEAT);
@@ -4522,8 +4267,8 @@ void sxe_hw_stats_get(struct sxe_hw *hw, struct sxe_mac_stats *stats)
stats->dburxgdreecnt[i] += SXE_REG_READ(hw, SXE_DBUDREECNT(i));
rx_dbu_drop = SXE_REG_READ(hw, SXE_DBUDROFPCNT(i));
stats->dburxdrofpcnt[i] += rx_dbu_drop;
- stats->dbutxtcin[i] += SXE_REG_READ(hw,SXE_DBUDTTCICNT(i));
- stats->dbutxtcout[i] += SXE_REG_READ(hw,SXE_DBUDTTCOCNT(i));
+ stats->dbutxtcin[i] += SXE_REG_READ(hw, SXE_DBUDTTCICNT(i));
+ stats->dbutxtcout[i] += SXE_REG_READ(hw, SXE_DBUDTTCOCNT(i));
}
stats->fnavadd += (SXE_REG_READ(hw, SXE_FNAVUSTAT) & 0xFFFF);
@@ -4602,7 +4347,6 @@ void sxe_hw_stats_get(struct sxe_hw *hw, struct sxe_mac_stats *stats)
stats->gotc = stats->total_gotc;
#endif
- return;
}
static u32 sxe_hw_tx_packets_num_get(struct sxe_hw *hw)
@@ -4620,9 +4364,8 @@ static u32 sxe_hw_mac_stats_dump(struct sxe_hw *hw, u32 *regs_buff, u32 buf_size
u32 i;
u32 regs_num = buf_size / sizeof(u32);
- for (i = 0; i < regs_num; i++) {
+ for (i = 0; i < regs_num; i++)
regs_buff[i] = SXE_REG_READ(hw, mac_regs[i]);
- }
return i;
}
@@ -4649,11 +4392,10 @@ void sxe_hw_mbx_init(struct sxe_hw *hw)
hw->mbx.stats.rcv_msgs = 0;
hw->mbx.stats.send_msgs = 0;
- hw->mbx.stats.acks = 0;
- hw->mbx.stats.reqs = 0;
- hw->mbx.stats.rsts = 0;
+ hw->mbx.stats.acks = 0;
+ hw->mbx.stats.reqs = 0;
+ hw->mbx.stats.rsts = 0;
- return;
}
static bool sxe_hw_vf_irq_check(struct sxe_hw *hw, u32 mask, u32 index)
@@ -4752,7 +4494,7 @@ s32 sxe_hw_rcv_msg_from_vf(struct sxe_hw *hw, u32 *msg,
for (i = 0; i < msg_entry; i++) {
msg[i] = SXE_REG_READ(hw, (SXE_PFMBMEM(index) + (i << 2)));
LOG_DEBUG_BDF("vf_idx:%u read mbx mem[%u]:0x%x.\n",
- index, i, msg[i]);
+ index, i, msg[i]);
}
SXE_REG_WRITE(hw, SXE_PFMAILBOX(index), SXE_PFMAILBOX_ACK);
@@ -4788,16 +4530,15 @@ s32 sxe_hw_send_msg_to_vf(struct sxe_hw *hw, u32 *msg,
old = SXE_REG_READ(hw, (SXE_PFMBMEM(index)));
LOG_DEBUG_BDF("original send msg:0x%x. mbx mem[0]:0x%x\n", *msg, old);
- if (msg[0] & SXE_CTRL_MSG_MASK) {
+ if (msg[0] & SXE_CTRL_MSG_MASK)
msg[0] |= (old & SXE_MSGID_MASK);
- } else {
+ else
msg[0] |= (old & SXE_PFMSG_MASK);
- }
for (i = 0; i < msg_len; i++) {
SXE_REG_WRITE(hw, (SXE_PFMBMEM(index) + (i << 2)), msg[i]);
LOG_DEBUG_BDF("vf_idx:%u write mbx mem[%u]:0x%x.\n",
- index, i, msg[i]);
+ index, i, msg[i]);
}
SXE_REG_WRITE(hw, SXE_PFMAILBOX(index), SXE_PFMAILBOX_STS);
@@ -4811,14 +4552,12 @@ void sxe_hw_mbx_mem_clear(struct sxe_hw *hw, u8 vf_idx)
{
u8 msg_idx;
struct sxe_adapter *adapter = hw->adapter;
- for (msg_idx = 0; msg_idx < hw->mbx.msg_len; msg_idx++) {
+ for (msg_idx = 0; msg_idx < hw->mbx.msg_len; msg_idx++)
SXE_REG_WRITE_ARRAY(hw, SXE_PFMBMEM(vf_idx), msg_idx, 0);
- }
SXE_WRITE_FLUSH(hw);
LOG_INFO_BDF("vf_idx:%u clear mbx mem.\n", vf_idx);
- return;
}
static const struct sxe_mbx_operations sxe_mbx_ops = {
@@ -4838,7 +4577,6 @@ void sxe_hw_pcie_vt_mode_set(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_GCR_EXT, value);
- return;
}
static const struct sxe_pcie_operations sxe_pcie_ops = {
@@ -4857,9 +4595,8 @@ s32 sxe_hw_hdc_lock_get(struct sxe_hw *hw, u32 trylock)
for (i = 0; i < trylock; i++) {
val = SXE_REG_READ(hw, SXE_HDC_SW_LK) & SXE_HDC_SW_LK_BIT;
- if (!val) {
+ if (!val)
break;
- }
udelay(10);
}
@@ -4898,9 +4635,8 @@ void sxe_hw_hdc_lock_release(struct sxe_hw *hw, u32 retry_cnt)
hw->hdc.pf_lock_val = 0;
break;
}
- } while((retry_cnt--) > 0);
+ } while ((retry_cnt--) > 0);
- return;
}
void sxe_hw_hdc_fw_ov_clear(struct sxe_hw *hw)
@@ -4912,9 +4648,8 @@ bool sxe_hw_hdc_is_fw_over_set(struct sxe_hw *hw)
{
bool fw_ov = false;
- if (SXE_REG_READ(hw, SXE_HDC_FW_OV) & SXE_HDC_FW_OV_BIT) {
+ if (SXE_REG_READ(hw, SXE_HDC_FW_OV) & SXE_HDC_FW_OV_BIT)
fw_ov = true;
- }
return fw_ov;
}
@@ -4924,21 +4659,18 @@ void sxe_hw_hdc_packet_send_done(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_HDC_SW_OV, SXE_HDC_SW_OV_BIT);
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_hdc_packet_header_send(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_HDC_PACKET_HEAD0, value);
- return;
}
void sxe_hw_hdc_packet_data_dword_send(struct sxe_hw *hw,
u16 dword_index, u32 value)
{
SXE_WRITE_REG_ARRAY_32(hw, SXE_HDC_PACKET_DATA0, dword_index, value);
- return;
}
u32 sxe_hw_hdc_fw_ack_header_get(struct sxe_hw *hw)
@@ -4965,7 +4697,6 @@ u32 sxe_hw_hdc_fw_status_get(struct sxe_hw *hw)
void sxe_hw_hdc_drv_status_set(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_DRV_STATUS_REG, value);
- return;
}
u32 sxe_hw_hdc_channel_state_get(struct sxe_hw *hw)
@@ -4979,7 +4710,7 @@ u32 sxe_hw_hdc_channel_state_get(struct sxe_hw *hw)
return state;
}
-STATIC u32 sxe_hw_hdc_irq_event_get(struct sxe_hw *hw)
+static u32 sxe_hw_hdc_irq_event_get(struct sxe_hw *hw)
{
u32 status = SXE_REG_READ(hw, SXE_HDC_MSI_STATUS_REG);
struct sxe_adapter *adapter = hw->adapter;
@@ -4999,7 +4730,6 @@ static void sxe_hw_hdc_irq_event_clear(struct sxe_hw *hw, u32 event)
status &= ~event;
SXE_REG_WRITE(hw, SXE_HDC_MSI_STATUS_REG, status);
- return;
}
static void sxe_hw_hdc_resource_clean(struct sxe_hw *hw)
@@ -5008,33 +4738,31 @@ static void sxe_hw_hdc_resource_clean(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_HDC_SW_LK, 0x0);
SXE_REG_WRITE(hw, SXE_HDC_PACKET_HEAD0, 0x0);
- for (i = 0; i < SXE_HDC_DATA_LEN_MAX; i++) {
+ for (i = 0; i < SXE_HDC_DATA_LEN_MAX; i++)
SXE_WRITE_REG_ARRAY_32(hw, SXE_HDC_PACKET_DATA0, i, 0x0);
- }
- return;
}
static const struct sxe_hdc_operations sxe_hdc_ops = {
- .pf_lock_get = sxe_hw_hdc_lock_get,
- .pf_lock_release = sxe_hw_hdc_lock_release,
- .is_fw_over_set = sxe_hw_hdc_is_fw_over_set,
- .fw_ack_header_rcv = sxe_hw_hdc_fw_ack_header_get,
- .packet_send_done = sxe_hw_hdc_packet_send_done,
- .packet_header_send = sxe_hw_hdc_packet_header_send,
+ .pf_lock_get = sxe_hw_hdc_lock_get,
+ .pf_lock_release = sxe_hw_hdc_lock_release,
+ .is_fw_over_set = sxe_hw_hdc_is_fw_over_set,
+ .fw_ack_header_rcv = sxe_hw_hdc_fw_ack_header_get,
+ .packet_send_done = sxe_hw_hdc_packet_send_done,
+ .packet_header_send = sxe_hw_hdc_packet_header_send,
.packet_data_dword_send = sxe_hw_hdc_packet_data_dword_send,
.packet_data_dword_rcv = sxe_hw_hdc_packet_data_dword_rcv,
- .fw_status_get = sxe_hw_hdc_fw_status_get,
- .drv_status_set = sxe_hw_hdc_drv_status_set,
- .irq_event_get = sxe_hw_hdc_irq_event_get,
- .irq_event_clear = sxe_hw_hdc_irq_event_clear,
- .fw_ov_clear = sxe_hw_hdc_fw_ov_clear,
- .channel_state_get = sxe_hw_hdc_channel_state_get,
- .resource_clean = sxe_hw_hdc_resource_clean,
+ .fw_status_get = sxe_hw_hdc_fw_status_get,
+ .drv_status_set = sxe_hw_hdc_drv_status_set,
+ .irq_event_get = sxe_hw_hdc_irq_event_get,
+ .irq_event_clear = sxe_hw_hdc_irq_event_clear,
+ .fw_ov_clear = sxe_hw_hdc_fw_ov_clear,
+ .channel_state_get = sxe_hw_hdc_channel_state_get,
+ .resource_clean = sxe_hw_hdc_resource_clean,
};
#ifdef SXE_PHY_CONFIGURE
-#define SXE_MDIO_COMMAND_TIMEOUT 100
+#define SXE_MDIO_COMMAND_TIMEOUT 100
static s32 sxe_hw_phy_reg_write(struct sxe_hw *hw, s32 prtad, u32 reg_addr,
u32 device_type, u16 phy_data)
@@ -5056,9 +4784,9 @@ static s32 sxe_hw_phy_reg_write(struct sxe_hw *hw, s32 prtad, u32 reg_addr,
udelay(10);
command = SXE_REG_READ(hw, SXE_MSCA);
- if ((command & SXE_MSCA_MDI_CMD_ON_PROG) == 0) {
+ if ((command & SXE_MSCA_MDI_CMD_ON_PROG) == 0)
break;
- }
+
}
if ((command & SXE_MSCA_MDI_CMD_ON_PROG) != 0) {
@@ -5079,9 +4807,8 @@ static s32 sxe_hw_phy_reg_write(struct sxe_hw *hw, s32 prtad, u32 reg_addr,
udelay(10);
command = SXE_REG_READ(hw, SXE_MSCA);
- if ((command & SXE_MSCA_MDI_CMD_ON_PROG) == 0) {
+ if ((command & SXE_MSCA_MDI_CMD_ON_PROG) == 0)
break;
- }
}
if ((command & SXE_MSCA_MDI_CMD_ON_PROG) != 0) {
@@ -5112,9 +4839,8 @@ static s32 sxe_hw_phy_reg_read(struct sxe_hw *hw, s32 prtad, u32 reg_addr,
udelay(10);
command = SXE_REG_READ(hw, SXE_MSCA);
- if ((command & SXE_MSCA_MDI_CMD_ON_PROG) == 0) {
+ if ((command & SXE_MSCA_MDI_CMD_ON_PROG) == 0)
break;
- }
}
if ((command & SXE_MSCA_MDI_CMD_ON_PROG) != 0) {
@@ -5166,7 +4892,7 @@ static s32 sxe_hw_phy_id_get(struct sxe_hw *hw, u32 prtad, u32 *id)
ret = sxe_hw_phy_reg_read(hw, prtad, MDIO_DEVID1, MDIO_MMD_PMAPMD,
- &phy_id_low);
+ &phy_id_low);
if (ret) {
LOG_ERROR("get phy id upper 16 bits failed, prtad=%d\n", prtad);
@@ -5193,7 +4919,7 @@ s32 sxe_hw_phy_link_cap_get(struct sxe_hw *hw, u32 prtad, u32 *speed)
u16 speed_ability;
ret = hw->phy.ops->reg_read(hw, prtad, MDIO_SPEED, MDIO_MMD_PMAPMD,
- &speed_ability);
+ &speed_ability);
if (ret) {
*speed = 0;
LOG_ERROR("get phy link cap failed, ret=%d, prtad=%d\n",
@@ -5201,17 +4927,14 @@ s32 sxe_hw_phy_link_cap_get(struct sxe_hw *hw, u32 prtad, u32 *speed)
goto l_end;
}
- if (speed_ability & MDIO_SPEED_10G) {
+ if (speed_ability & MDIO_SPEED_10G)
*speed |= SXE_LINK_SPEED_10GB_FULL;
- }
- if (speed_ability & MDIO_PMA_SPEED_1000) {
+ if (speed_ability & MDIO_PMA_SPEED_1000)
*speed |= SXE_LINK_SPEED_1GB_FULL;
- }
- if (speed_ability & MDIO_PMA_SPEED_100) {
+ if (speed_ability & MDIO_PMA_SPEED_100)
*speed |= SXE_LINK_SPEED_100_FULL;
- }
l_end:
return ret;
@@ -5234,9 +4957,8 @@ static s32 sxe_hw_phy_ctrl_reset(struct sxe_hw *hw, u32 prtad)
msleep(100);
ret = sxe_hw_phy_reg_read(hw, prtad, MDIO_CTRL1,
MDIO_MMD_PHYXS, &ctrl);
- if (ret) {
+ if (ret)
goto l_end;
- }
if (!(ctrl & MDIO_CTRL1_RESET)) {
udelay(2);
@@ -5275,23 +4997,21 @@ void sxe_hw_ops_init(struct sxe_hw *hw)
hw->pcie.ops = &sxe_pcie_ops;
hw->hdc.ops = &sxe_hdc_ops;
#ifdef SXE_PHY_CONFIGURE
- hw->phy.ops = &sxe_phy_hw_ops;
+ hw->phy.ops = &sxe_phy_hw_ops;
#endif
hw->filter.mac.ops = &sxe_filter_mac_ops;
hw->filter.vlan.ops = &sxe_filter_vlan_ops;
- return;
}
u32 sxe_hw_rss_key_get_by_idx(struct sxe_hw *hw, u8 reg_idx)
{
u32 rss_key;
- if (reg_idx >= SXE_MAX_RSS_KEY_ENTRIES) {
+ if (reg_idx >= SXE_MAX_RSS_KEY_ENTRIES)
rss_key = 0;
- } else {
+ else
rss_key = SXE_REG_READ(hw, SXE_RSSRK(reg_idx));
- }
return rss_key;
}
@@ -5300,9 +5020,8 @@ bool sxe_hw_is_rss_enabled(struct sxe_hw *hw)
{
bool rss_enable = false;
u32 mrqc = SXE_REG_READ(hw, SXE_MRQC);
- if (mrqc & SXE_MRQC_RSSEN) {
+ if (mrqc & SXE_MRQC_RSSEN)
rss_enable = true;
- }
return rss_enable;
}
@@ -5318,15 +5037,28 @@ u32 sxe_hw_rss_field_get(struct sxe_hw *hw)
return (mrqc & SXE_RSS_FIELD_MASK);
}
-#ifdef SXE_DPDK
+#ifdef SXE_DPDK
#define SXE_TRAFFIC_CLASS_MAX 8
-#define SXE_MR_VLAN_MSB_REG_OFFSET 4
+#define SXE_MR_VLAN_MSB_REG_OFFSET 4
#define SXE_MR_VIRTUAL_POOL_MSB_REG_OFFSET 4
-#define SXE_MR_TYPE_MASK 0x0F
-#define SXE_MR_DST_POOL_OFFSET 8
+#define SXE_MR_TYPE_MASK 0x0F
+#define SXE_MR_DST_POOL_OFFSET 8
+
+void sxe_hw_crc_strip_config(struct sxe_hw *hw, bool keep_crc)
+{
+ u32 crcflag = SXE_REG_READ(hw, SXE_CRC_STRIP_REG);
+
+ if (keep_crc) {
+ crcflag |= SXE_KEEP_CRC_EN;
+ } else {
+ crcflag &= ~SXE_KEEP_CRC_EN;
+ }
+
+ SXE_REG_WRITE(hw, SXE_CRC_STRIP_REG, crcflag);
+}
void sxe_hw_rx_pkt_buf_size_set(struct sxe_hw *hw, u8 tc_idx, u16 pbsize)
{
@@ -5336,7 +5068,6 @@ void sxe_hw_rx_pkt_buf_size_set(struct sxe_hw *hw, u8 tc_idx, u16 pbsize)
SXE_REG_WRITE(hw, SXE_RXPBSIZE(tc_idx), rxpbsize);
sxe_hw_rx_pkt_buf_switch(hw, true);
- return;
}
void sxe_hw_dcb_vmdq_mq_configure(struct sxe_hw *hw, u8 num_pools)
@@ -5349,13 +5080,11 @@ void sxe_hw_dcb_vmdq_mq_configure(struct sxe_hw *hw, u8 num_pools)
pbsize = (u8)(SXE_RX_PKT_BUF_SIZE / nb_tcs);
- for (i = 0; i < nb_tcs; i++) {
+ for (i = 0; i < nb_tcs; i++)
sxe_hw_rx_pkt_buf_size_set(hw, i, pbsize);
- }
- for (i = nb_tcs; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
+ for (i = nb_tcs; i < ETH_DCB_NUM_USER_PRIORITIES; i++)
sxe_hw_rx_pkt_buf_size_set(hw, i, 0);
- }
mrqc = (num_pools == RTE_ETH_16_POOLS) ?
SXE_MRQC_VMDQRT8TCEN : SXE_MRQC_VMDQRT4TCEN;
@@ -5363,7 +5092,6 @@ void sxe_hw_dcb_vmdq_mq_configure(struct sxe_hw *hw, u8 num_pools)
SXE_REG_WRITE(hw, SXE_RTRPCS, SXE_RTRPCS_RRM);
- return;
}
static const struct sxe_reg_info sxe_regs_general_group[] = {
@@ -5468,9 +5196,8 @@ static u32 sxe_regs_group_count(const struct sxe_reg_info *regs)
int i = 0;
int count = 0;
- while (regs[i].count) {
+ while (regs[i].count)
count += regs[i++].count;
- }
return count;
};
@@ -5487,7 +5214,7 @@ static u32 sxe_hw_regs_group_read(struct sxe_hw *hw,
reg_buf[count + j] = SXE_REG_READ(hw,
regs[i].addr + j * regs[i].stride);
LOG_INFO("regs= %s, regs_addr=%x, regs_value=%04x\n",
- regs[i].name , regs[i].addr, reg_buf[count + j]);
+ regs[i].name, regs[i].addr, reg_buf[count + j]);
}
i++;
@@ -5504,9 +5231,8 @@ u32 sxe_hw_all_regs_group_num_get(void)
const struct sxe_reg_info *reg_group;
const struct sxe_reg_info **reg_set = sxe_regs_group;
- while ((reg_group = reg_set[i++])) {
+ while ((reg_group = reg_set[i++]))
count += sxe_regs_group_count(reg_group);
- }
return count;
}
@@ -5517,14 +5243,12 @@ void sxe_hw_all_regs_group_read(struct sxe_hw *hw, u32 *data)
const struct sxe_reg_info *reg_group;
const struct sxe_reg_info **reg_set = sxe_regs_group;
- while ((reg_group = reg_set[i++])) {
+ while ((reg_group = reg_set[i++]))
count += sxe_hw_regs_group_read(hw, reg_group, &data[count]);
- }
LOG_INFO("read regs cnt=%u, regs num=%u\n",
count, sxe_hw_all_regs_group_num_get());
- return;
}
static void sxe_hw_default_pool_configure(struct sxe_hw *hw,
@@ -5534,14 +5258,12 @@ static void sxe_hw_default_pool_configure(struct sxe_hw *hw,
u32 vt_ctl;
vt_ctl = SXE_VT_CTL_VT_ENABLE | SXE_VT_CTL_REPLEN;
- if (default_pool_enabled) {
+ if (default_pool_enabled)
vt_ctl |= (default_pool_idx << SXE_VT_CTL_POOL_SHIFT);
- } else {
+ else
vt_ctl |= SXE_VT_CTL_DIS_DEFPL;
- }
SXE_REG_WRITE(hw, SXE_VT_CTL, vt_ctl);
- return;
}
void sxe_hw_dcb_vmdq_default_pool_configure(struct sxe_hw *hw,
@@ -5549,31 +5271,27 @@ void sxe_hw_dcb_vmdq_default_pool_configure(struct sxe_hw *hw,
u8 default_pool_idx)
{
sxe_hw_default_pool_configure(hw, default_pool_enabled, default_pool_idx);
- return;
}
u32 sxe_hw_ring_irq_switch_get(struct sxe_hw *hw, u8 idx)
{
u32 mask;
- if (idx == 0) {
+ if (idx == 0)
mask = SXE_REG_READ(hw, SXE_EIMS_EX(0));
- } else {
+ else
mask = SXE_REG_READ(hw, SXE_EIMS_EX(1));
- }
return mask;
}
void sxe_hw_ring_irq_switch_set(struct sxe_hw *hw, u8 idx, u32 value)
{
- if (idx == 0) {
+ if (idx == 0)
SXE_REG_WRITE(hw, SXE_EIMS_EX(0), value);
- } else {
+ else
SXE_REG_WRITE(hw, SXE_EIMS_EX(1), value);
- }
- return;
}
void sxe_hw_dcb_vmdq_up_2_tc_configure(struct sxe_hw *hw,
@@ -5583,13 +5301,11 @@ void sxe_hw_dcb_vmdq_up_2_tc_configure(struct sxe_hw *hw,
u8 i;
up2tc = 0;
- for (i = 0; i < MAX_USER_PRIORITY; i++) {
+ for (i = 0; i < MAX_USER_PRIORITY; i++)
up2tc |= ((tc_arr[i] & 0x07) << (i * 3));
- }
SXE_REG_WRITE(hw, SXE_RTRUP2TC, up2tc);
- return;
}
u32 sxe_hw_uta_hash_table_get(struct sxe_hw *hw, u8 reg_idx)
@@ -5602,7 +5318,6 @@ void sxe_hw_uta_hash_table_set(struct sxe_hw *hw,
{
SXE_REG_WRITE(hw, SXE_UTA(reg_idx), value);
- return;
}
u32 sxe_hw_vlan_type_get(struct sxe_hw *hw)
@@ -5613,7 +5328,6 @@ u32 sxe_hw_vlan_type_get(struct sxe_hw *hw)
void sxe_hw_vlan_type_set(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_VLNCTRL, value);
- return;
}
void sxe_hw_dcb_vmdq_vlan_configure(struct sxe_hw *hw,
@@ -5626,9 +5340,8 @@ void sxe_hw_dcb_vmdq_vlan_configure(struct sxe_hw *hw,
vlanctrl |= SXE_VLNCTRL_VFE;
SXE_REG_WRITE(hw, SXE_VLNCTRL, vlanctrl);
- for (i = 0; i < SXE_VFT_TBL_SIZE; i++) {
+ for (i = 0; i < SXE_VFT_TBL_SIZE; i++)
SXE_REG_WRITE(hw, SXE_VFTA(i), 0xFFFFFFFF);
- }
SXE_REG_WRITE(hw, SXE_VFRE(0),
num_pools == RTE_ETH_16_POOLS ? 0xFFFF : 0xFFFFFFFF);
@@ -5636,13 +5349,11 @@ void sxe_hw_dcb_vmdq_vlan_configure(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_MPSAR_LOW(0), 0xFFFFFFFF);
SXE_REG_WRITE(hw, SXE_MPSAR_HIGH(0), 0xFFFFFFFF);
- return;
}
void sxe_hw_vlan_ext_type_set(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_EXVET, value);
- return;
}
u32 sxe_hw_txctl_vlan_type_get(struct sxe_hw *hw)
@@ -5653,7 +5364,6 @@ u32 sxe_hw_txctl_vlan_type_get(struct sxe_hw *hw)
void sxe_hw_txctl_vlan_type_set(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_DMATXCTL, value);
- return;
}
u32 sxe_hw_ext_vlan_get(struct sxe_hw *hw)
@@ -5664,13 +5374,11 @@ u32 sxe_hw_ext_vlan_get(struct sxe_hw *hw)
void sxe_hw_ext_vlan_set(struct sxe_hw *hw, u32 value)
{
SXE_REG_WRITE(hw, SXE_CTRL_EXT, value);
- return;
}
void sxe_hw_rxq_stat_map_set(struct sxe_hw *hw, u8 idx, u32 value)
{
SXE_REG_WRITE(hw, SXE_RQSMR(idx), value);
- return;
}
void sxe_hw_dcb_vmdq_pool_configure(struct sxe_hw *hw,
@@ -5682,13 +5390,11 @@ void sxe_hw_dcb_vmdq_pool_configure(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_VLVFB(pool_idx * 2), pools_map);
- return;
}
void sxe_hw_txq_stat_map_set(struct sxe_hw *hw, u8 idx, u32 value)
{
SXE_REG_WRITE(hw, SXE_TQSM(idx), value);
- return;
}
void sxe_hw_dcb_rx_configure(struct sxe_hw *hw, bool is_vt_on,
@@ -5746,14 +5452,12 @@ void sxe_hw_dcb_rx_configure(struct sxe_hw *hw, bool is_vt_on,
vlanctrl |= SXE_VLNCTRL_VFE;
SXE_REG_WRITE(hw, SXE_VLNCTRL, vlanctrl);
- for (i = 0; i < SXE_VFT_TBL_SIZE; i++) {
+ for (i = 0; i < SXE_VFT_TBL_SIZE; i++)
SXE_REG_WRITE(hw, SXE_VFTA(i), 0xFFFFFFFF);
- }
reg = SXE_RTRPCS_RRM | SXE_RTRPCS_RAC;
SXE_REG_WRITE(hw, SXE_RTRPCS, reg);
- return;
}
void sxe_hw_fc_status_get(struct sxe_hw *hw,
@@ -5762,19 +5466,16 @@ void sxe_hw_fc_status_get(struct sxe_hw *hw,
u32 flctrl;
flctrl = SXE_REG_READ(hw, SXE_FLCTRL);
- if (flctrl & (SXE_FCTRL_RFCE_PFC_EN | SXE_FCTRL_RFCE_LFC_EN)) {
+ if (flctrl & (SXE_FCTRL_RFCE_PFC_EN | SXE_FCTRL_RFCE_LFC_EN))
*rx_pause_on = true;
- } else {
+ else
*rx_pause_on = false;
- }
- if (flctrl & (SXE_FCTRL_TFCE_PFC_EN | SXE_FCTRL_TFCE_LFC_EN)) {
+ if (flctrl & (SXE_FCTRL_TFCE_PFC_EN | SXE_FCTRL_TFCE_LFC_EN))
*tx_pause_on = true;
- } else {
+ else
*tx_pause_on = false;
- }
- return;
}
void sxe_hw_fc_base_init(struct sxe_hw *hw)
@@ -5792,7 +5493,6 @@ void sxe_hw_fc_base_init(struct sxe_hw *hw)
}
hw->fc.send_xon = 1;
- return;
}
u32 sxe_hw_fc_tc_high_water_mark_get(struct sxe_hw *hw, u8 tc_idx)
@@ -5813,7 +5513,6 @@ u16 sxe_hw_fc_send_xon_get(struct sxe_hw *hw)
void sxe_hw_fc_send_xon_set(struct sxe_hw *hw, u16 send_xon)
{
hw->fc.send_xon = send_xon;
- return;
}
u16 sxe_hw_fc_pause_time_get(struct sxe_hw *hw)
@@ -5824,7 +5523,6 @@ u16 sxe_hw_fc_pause_time_get(struct sxe_hw *hw)
void sxe_hw_fc_pause_time_set(struct sxe_hw *hw, u16 pause_time)
{
hw->fc.pause_time = pause_time;
- return;
}
void sxe_hw_dcb_tx_configure(struct sxe_hw *hw, bool is_vt_on, u8 tc_num)
@@ -5835,15 +5533,13 @@ void sxe_hw_dcb_tx_configure(struct sxe_hw *hw, bool is_vt_on, u8 tc_num)
reg |= SXE_RTTDCS_ARBDIS;
SXE_REG_WRITE(hw, SXE_RTTDCS, reg);
- if (tc_num == 8) {
+ if (tc_num == 8)
reg = SXE_MTQC_RT_ENA | SXE_MTQC_8TC_8TQ;
- } else {
+ else
reg = SXE_MTQC_RT_ENA | SXE_MTQC_4TC_4TQ;
- }
- if (is_vt_on) {
+ if (is_vt_on)
reg |= SXE_MTQC_VT_ENA;
- }
SXE_REG_WRITE(hw, SXE_MTQC, reg);
@@ -5852,7 +5548,6 @@ void sxe_hw_dcb_tx_configure(struct sxe_hw *hw, bool is_vt_on, u8 tc_num)
SXE_REG_WRITE(hw, SXE_RTTDCS, reg);
- return;
}
void sxe_hw_rx_ip_checksum_offload_switch(struct sxe_hw *hw,
@@ -5861,36 +5556,31 @@ void sxe_hw_rx_ip_checksum_offload_switch(struct sxe_hw *hw,
u32 rxcsum;
rxcsum = SXE_REG_READ(hw, SXE_RXCSUM);
- if (is_on) {
+ if (is_on)
rxcsum |= SXE_RXCSUM_IPPCSE;
- } else {
+ else
rxcsum &= ~SXE_RXCSUM_IPPCSE;
- }
SXE_REG_WRITE(hw, SXE_RXCSUM, rxcsum);
- return;
}
void sxe_hw_rss_cap_switch(struct sxe_hw *hw, bool is_on)
{
u32 mrqc = SXE_REG_READ(hw, SXE_MRQC);
- if (is_on) {
+ if (is_on)
mrqc |= SXE_MRQC_RSSEN;
- } else {
+ else
mrqc &= ~SXE_MRQC_RSSEN;
- }
SXE_REG_WRITE(hw, SXE_MRQC, mrqc);
- return;
}
void sxe_hw_pool_xmit_enable(struct sxe_hw *hw, u16 reg_idx, u8 pool_num)
{
SXE_REG_WRITE(hw, SXE_VFTE(reg_idx),
pool_num == RTE_ETH_16_POOLS ? 0xFFFF : 0xFFFFFFFF);
- return;
}
void sxe_hw_rss_field_set(struct sxe_hw *hw, u32 rss_field)
@@ -5901,7 +5591,6 @@ void sxe_hw_rss_field_set(struct sxe_hw *hw, u32 rss_field)
mrqc |= rss_field;
SXE_REG_WRITE(hw, SXE_MRQC, mrqc);
- return;
}
static void sxe_hw_dcb_4tc_vmdq_off_stats_configure(struct sxe_hw *hw)
@@ -5910,44 +5599,38 @@ static void sxe_hw_dcb_4tc_vmdq_off_stats_configure(struct sxe_hw *hw)
u8 i;
for (i = 0; i < 32; i++) {
- if (i % 8 > 3) {
+ if (i % 8 > 3)
continue;
- }
reg = 0x01010101 * (i / 8);
SXE_REG_WRITE(hw, SXE_RQSMR(i), reg);
}
for (i = 0; i < 32; i++) {
- if (i < 16) {
+ if (i < 16)
reg = 0x00000000;
- } else if (i < 24) {
+ else if (i < 24)
reg = 0x01010101;
- } else if (i < 28) {
+ else if (i < 28)
reg = 0x02020202;
- } else {
+ else
reg = 0x03030303;
- }
SXE_REG_WRITE(hw, SXE_TQSM(i), reg);
}
- return;
}
static void sxe_hw_dcb_4tc_vmdq_on_stats_configure(struct sxe_hw *hw)
{
u8 i;
- for (i = 0; i < 32; i++) {
+ for (i = 0; i < 32; i++)
SXE_REG_WRITE(hw, SXE_RQSMR(i), 0x03020100);
- }
- for (i = 0; i < 32; i++) {
+ for (i = 0; i < 32; i++)
SXE_REG_WRITE(hw, SXE_TQSM(i), 0x03020100);
- }
- return;
}
void sxe_hw_rss_redir_tbl_set_by_idx(struct sxe_hw *hw,
@@ -5969,21 +5652,18 @@ u32 sxe_hw_rss_redir_tbl_get_by_idx(struct sxe_hw *hw, u16 reg_idx)
void sxe_hw_ptp_time_inc_stop(struct sxe_hw *hw)
{
SXE_REG_WRITE(hw, SXE_TIMINC, 0);
- return;
}
void sxe_hw_dcb_tc_stats_configure(struct sxe_hw *hw,
u8 tc_num, bool vmdq_active)
{
- if (tc_num == 8 && vmdq_active == false) {
+ if (tc_num == 8 && vmdq_active == false)
sxe_hw_dcb_8tc_vmdq_off_stats_configure(hw);
- } else if (tc_num == 4 && vmdq_active == false) {
+ else if (tc_num == 4 && vmdq_active == false)
sxe_hw_dcb_4tc_vmdq_off_stats_configure(hw);
- } else if (tc_num == 4 && vmdq_active == true) {
+ else if (tc_num == 4 && vmdq_active == true)
sxe_hw_dcb_4tc_vmdq_on_stats_configure(hw);
- }
- return;
}
void sxe_hw_ptp_timestamp_disable(struct sxe_hw *hw)
@@ -5997,7 +5677,6 @@ void sxe_hw_ptp_timestamp_disable(struct sxe_hw *hw)
~SXE_TSYNCRXCTL_REN));
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_mac_pool_clear(struct sxe_hw *hw, u8 rar_idx)
@@ -6007,14 +5686,12 @@ void sxe_hw_mac_pool_clear(struct sxe_hw *hw, u8 rar_idx)
if (rar_idx > SXE_UC_ENTRY_NUM_MAX) {
LOG_ERROR_BDF("rar_idx:%d invalid.(err:%d)\n",
rar_idx, SXE_ERR_PARAM);
- goto l_end;
+ return;
}
SXE_REG_WRITE(hw, SXE_MPSAR_LOW(rar_idx), 0);
SXE_REG_WRITE(hw, SXE_MPSAR_HIGH(rar_idx), 0);
-l_end:
- return;
}
void sxe_hw_vmdq_mq_configure(struct sxe_hw *hw)
@@ -6024,7 +5701,6 @@ void sxe_hw_vmdq_mq_configure(struct sxe_hw *hw)
mrqc = SXE_MRQC_VMDQEN;
SXE_REG_WRITE(hw, SXE_MRQC, mrqc);
- return;
}
void sxe_hw_vmdq_default_pool_configure(struct sxe_hw *hw,
@@ -6032,7 +5708,6 @@ void sxe_hw_vmdq_default_pool_configure(struct sxe_hw *hw,
u8 default_pool_idx)
{
sxe_hw_default_pool_configure(hw, default_pool_enabled, default_pool_idx);
- return;
}
void sxe_hw_vmdq_vlan_configure(struct sxe_hw *hw,
@@ -6045,24 +5720,20 @@ void sxe_hw_vmdq_vlan_configure(struct sxe_hw *hw,
vlanctrl |= SXE_VLNCTRL_VFE;
SXE_REG_WRITE(hw, SXE_VLNCTRL, vlanctrl);
- for (i = 0; i < SXE_VFT_TBL_SIZE; i++) {
+ for (i = 0; i < SXE_VFT_TBL_SIZE; i++)
SXE_REG_WRITE(hw, SXE_VFTA(i), 0xFFFFFFFF);
- }
SXE_REG_WRITE(hw, SXE_VFRE(0), 0xFFFFFFFF);
- if (num_pools == RTE_ETH_64_POOLS) {
+ if (num_pools == RTE_ETH_64_POOLS)
SXE_REG_WRITE(hw, SXE_VFRE(1), 0xFFFFFFFF);
- }
- for (i = 0; i < num_pools; i++) {
+ for (i = 0; i < num_pools; i++)
SXE_REG_WRITE(hw, SXE_VMOLR(i), rx_mode);
- }
SXE_REG_WRITE(hw, SXE_MPSAR_LOW(0), 0xFFFFFFFF);
SXE_REG_WRITE(hw, SXE_MPSAR_HIGH(0), 0xFFFFFFFF);
SXE_WRITE_FLUSH(hw);
- return;
}
u32 sxe_hw_pcie_vt_mode_get(struct sxe_hw *hw)
@@ -6082,7 +5753,6 @@ void sxe_rx_fc_threshold_set(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_FCRTH(i), high);
}
- return;
}
void sxe_hw_vmdq_pool_configure(struct sxe_hw *hw,
@@ -6101,19 +5771,16 @@ void sxe_hw_vmdq_pool_configure(struct sxe_hw *hw,
}
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_vmdq_loopback_configure(struct sxe_hw *hw)
{
u8 i;
SXE_REG_WRITE(hw, SXE_PFDTXGSWC, SXE_PFDTXGSWC_VT_LBEN);
- for (i = 0; i < SXE_VMTXSW_REGISTER_COUNT; i++) {
+ for (i = 0; i < SXE_VMTXSW_REGISTER_COUNT; i++)
SXE_REG_WRITE(hw, SXE_VMTXSW(i), 0xFFFFFFFF);
- }
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_tx_multi_queue_configure(struct sxe_hw *hw,
@@ -6145,7 +5812,7 @@ void sxe_hw_tx_multi_queue_configure(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_VFTE(1), UINT32_MAX);
for (queue_idx = 0; queue_idx < SXE_HW_TXRX_RING_NUM_MAX;
- queue_idx++) {
+ queue_idx++) {
SXE_REG_WRITE(hw, SXE_QDE,
(SXE_QDE_WRITE |
(queue_idx << SXE_QDE_IDX_SHIFT)));
@@ -6161,7 +5828,6 @@ void sxe_hw_tx_multi_queue_configure(struct sxe_hw *hw,
sxe_hw_dcb_arbiter_set(hw, true);
- return;
}
void sxe_hw_vf_queue_drop_enable(struct sxe_hw *hw, u8 vf_idx,
@@ -6170,8 +5836,7 @@ void sxe_hw_vf_queue_drop_enable(struct sxe_hw *hw, u8 vf_idx,
u32 value;
u8 i;
- for (i = (vf_idx * ring_per_pool); i < ((vf_idx + 1) * ring_per_pool); i++)
- {
+ for (i = (vf_idx * ring_per_pool); i < ((vf_idx + 1) * ring_per_pool); i++) {
value = SXE_QDE_ENABLE | SXE_QDE_WRITE;
SXE_WRITE_FLUSH(hw);
@@ -6180,7 +5845,6 @@ void sxe_hw_vf_queue_drop_enable(struct sxe_hw *hw, u8 vf_idx,
SXE_REG_WRITE(hw, SXE_QDE, value);
}
- return;
}
bool sxe_hw_vt_status(struct sxe_hw *hw)
@@ -6188,17 +5852,16 @@ bool sxe_hw_vt_status(struct sxe_hw *hw)
bool ret;
u32 vt_ctl = SXE_REG_READ(hw, SXE_VT_CTL);
- if (vt_ctl & SXE_VMD_CTL_POOL_EN) {
+ if (vt_ctl & SXE_VMD_CTL_POOL_EN)
ret = true;
- } else {
+ else
ret = false;
- }
return ret;
}
void sxe_hw_mirror_ctl_set(struct sxe_hw *hw, u8 rule_id,
- u8 mirror_type, u8 dst_pool, bool on)
+ u8 mirror_type, u8 dst_pool, bool on)
{
u32 mr_ctl;
@@ -6214,23 +5877,20 @@ void sxe_hw_mirror_ctl_set(struct sxe_hw *hw, u8 rule_id,
SXE_REG_WRITE(hw, SXE_MRCTL(rule_id), mr_ctl);
- return;
}
-void sxe_hw_mirror_virtual_pool_set(struct sxe_hw *hw, u8 rule_id,u32 lsb, u32 msb)
+void sxe_hw_mirror_virtual_pool_set(struct sxe_hw *hw, u8 rule_id, u32 lsb, u32 msb)
{
SXE_REG_WRITE(hw, SXE_VMRVM(rule_id), lsb);
SXE_REG_WRITE(hw, SXE_VMRVM(rule_id + SXE_MR_VIRTUAL_POOL_MSB_REG_OFFSET), msb);
- return;
}
-void sxe_hw_mirror_vlan_set(struct sxe_hw *hw, u8 rule_id,u32 lsb, u32 msb)
+void sxe_hw_mirror_vlan_set(struct sxe_hw *hw, u8 rule_id, u32 lsb, u32 msb)
{
SXE_REG_WRITE(hw, SXE_VMRVLAN(rule_id), lsb);
SXE_REG_WRITE(hw, SXE_VMRVLAN(rule_id + SXE_MR_VLAN_MSB_REG_OFFSET), msb);
- return;
}
void sxe_hw_mirror_rule_clear(struct sxe_hw *hw, u8 rule_id)
@@ -6243,7 +5903,6 @@ void sxe_hw_mirror_rule_clear(struct sxe_hw *hw, u8 rule_id)
SXE_REG_WRITE(hw, SXE_VMRVM(rule_id), 0);
SXE_REG_WRITE(hw, SXE_VMRVM(rule_id + SXE_MR_VIRTUAL_POOL_MSB_REG_OFFSET), 0);
- return;
}
#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_FILTER_CTRL
@@ -6266,28 +5925,29 @@ void sxe_hw_fivetuple_filter_add(struct rte_eth_dev *dev,
ftqf |= (u32)((filter->filter_info.priority &
SXE_FTQF_PRIORITY_MASK) << SXE_FTQF_PRIORITY_SHIFT);
- if (filter->filter_info.src_ip_mask == 0) {
+ if (filter->filter_info.src_ip_mask == 0)
mask &= SXE_FTQF_SOURCE_ADDR_MASK;
- }
- if (filter->filter_info.dst_ip_mask == 0) {
+
+ if (filter->filter_info.dst_ip_mask == 0)
mask &= SXE_FTQF_DEST_ADDR_MASK;
- }
- if (filter->filter_info.src_port_mask == 0) {
+
+ if (filter->filter_info.src_port_mask == 0)
mask &= SXE_FTQF_SOURCE_PORT_MASK;
- }
- if (filter->filter_info.dst_port_mask == 0) {
+
+ if (filter->filter_info.dst_port_mask == 0)
mask &= SXE_FTQF_DEST_PORT_MASK;
- }
- if (filter->filter_info.proto_mask == 0) {
+
+ if (filter->filter_info.proto_mask == 0)
mask &= SXE_FTQF_PROTOCOL_COMP_MASK;
- }
+
ftqf |= mask << SXE_FTQF_5TUPLE_MASK_SHIFT;
ftqf |= SXE_FTQF_POOL_MASK_EN;
ftqf |= SXE_FTQF_QUEUE_ENABLE;
LOG_DEBUG("add fivetuple filter, index[%u], src_ip[0x%x], dst_ip[0x%x]"
- "src_port[%u], dst_port[%u], ftqf[0x%x], queue[%u]", i, filter->filter_info.src_ip,
- filter->filter_info.dst_ip, filter->filter_info.src_port, filter->filter_info.dst_port,
+ "src_port[%u], dst_port[%u], ftqf[0x%x], queue[%u]", i,
+ filter->filter_info.src_ip, filter->filter_info.dst_ip,
+ filter->filter_info.src_port, filter->filter_info.dst_port,
ftqf, filter->queue);
SXE_REG_WRITE(hw, SXE_DAQF(i), filter->filter_info.dst_ip);
@@ -6299,7 +5959,6 @@ void sxe_hw_fivetuple_filter_add(struct rte_eth_dev *dev,
l34timir |= (u32)(filter->queue << SXE_L34T_IMIR_QUEUE_SHIFT);
SXE_REG_WRITE(hw, SXE_L34T_IMIR(i), l34timir);
- return;
}
void sxe_hw_fivetuple_filter_del(struct sxe_hw *hw, u16 reg_index)
@@ -6310,7 +5969,6 @@ void sxe_hw_fivetuple_filter_del(struct sxe_hw *hw, u16 reg_index)
SXE_REG_WRITE(hw, SXE_FTQF(reg_index), 0);
SXE_REG_WRITE(hw, SXE_L34T_IMIR(reg_index), 0);
- return;
}
void sxe_hw_ethertype_filter_add(struct sxe_hw *hw,
@@ -6329,7 +5987,6 @@ void sxe_hw_ethertype_filter_add(struct sxe_hw *hw,
SXE_REG_WRITE(hw, SXE_ETQS(reg_index), etqs);
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_ethertype_filter_del(struct sxe_hw *hw, u8 filter_type)
@@ -6338,7 +5995,6 @@ void sxe_hw_ethertype_filter_del(struct sxe_hw *hw, u8 filter_type)
SXE_REG_WRITE(hw, SXE_ETQS(filter_type), 0);
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_syn_filter_add(struct sxe_hw *hw, u16 queue, u8 priority)
@@ -6348,16 +6004,14 @@ void sxe_hw_syn_filter_add(struct sxe_hw *hw, u16 queue, u8 priority)
synqf = (u32)(((queue << SXE_SYN_FILTER_QUEUE_SHIFT) &
SXE_SYN_FILTER_QUEUE) | SXE_SYN_FILTER_ENABLE);
- if (priority) {
+ if (priority)
synqf |= SXE_SYN_FILTER_SYNQFP;
- } else {
+ else
synqf &= ~SXE_SYN_FILTER_SYNQFP;
- }
SXE_REG_WRITE(hw, SXE_SYNQF, synqf);
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_syn_filter_del(struct sxe_hw *hw)
@@ -6370,7 +6024,6 @@ void sxe_hw_syn_filter_del(struct sxe_hw *hw)
SXE_REG_WRITE(hw, SXE_SYNQF, synqf);
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_fnav_rx_pkt_buf_size_reset(struct sxe_hw *hw, u32 pbsize)
@@ -6378,11 +6031,9 @@ void sxe_hw_fnav_rx_pkt_buf_size_reset(struct sxe_hw *hw, u32 pbsize)
S32 i;
SXE_REG_WRITE(hw, SXE_RXPBSIZE(0), (SXE_REG_READ(hw, SXE_RXPBSIZE(0)) - pbsize));
- for (i = 1; i < 8; i++) {
+ for (i = 1; i < 8; i++)
SXE_REG_WRITE(hw, SXE_RXPBSIZE(i), 0);
- }
- return;
}
void sxe_hw_fnav_flex_mask_set(struct sxe_hw *hw, u16 flex_mask)
@@ -6390,12 +6041,10 @@ void sxe_hw_fnav_flex_mask_set(struct sxe_hw *hw, u16 flex_mask)
u32 fnavm;
fnavm = SXE_REG_READ(hw, SXE_FNAVM);
- if (flex_mask == UINT16_MAX) {
+ if (flex_mask == UINT16_MAX)
fnavm &= ~SXE_FNAVM_FLEX;
- }
SXE_REG_WRITE(hw, SXE_FNAVM, fnavm);
- return;
}
void sxe_hw_fnav_ipv6_mask_set(struct sxe_hw *hw, u16 src_mask, u16 dst_mask)
@@ -6405,7 +6054,6 @@ void sxe_hw_fnav_ipv6_mask_set(struct sxe_hw *hw, u16 src_mask, u16 dst_mask)
fnavipv6m = (dst_mask << 16) | src_mask;
SXE_REG_WRITE(hw, SXE_FNAVIP6M, ~fnavipv6m);
- return;
}
s32 sxe_hw_fnav_flex_offset_set(struct sxe_hw *hw, u16 offset)
@@ -6425,7 +6073,6 @@ s32 sxe_hw_fnav_flex_offset_set(struct sxe_hw *hw, u16 offset)
if (ret) {
LOG_ERROR("flow director signature poll time exceeded!\n");
}
-
return ret;
}
#endif
@@ -6450,9 +6097,9 @@ static void sxe_macsec_stop_data(struct sxe_hw *hw, bool link)
SXE_SECTXSTAT_SECTX_RDY;
r_rdy = SXE_REG_READ(hw, SXE_SECRXSTAT) &
SXE_SECRXSTAT_SECRX_RDY;
- if (t_rdy && r_rdy)
+ if (t_rdy && r_rdy) {
return;
-
+ }
if (!link) {
SXE_REG_WRITE(hw, SXE_LPBKCTRL, 0x1);
@@ -6474,13 +6121,11 @@ static void sxe_macsec_stop_data(struct sxe_hw *hw, bool link)
SXE_WRITE_FLUSH(hw);
}
- return;
}
void sxe_hw_rx_queue_mode_set(struct sxe_hw *hw, u32 mrqc)
{
SXE_REG_WRITE(hw, SXE_MRQC, mrqc);
- return;
}
void sxe_hw_macsec_enable(struct sxe_hw *hw, bool is_up, u32 tx_mode,
@@ -6527,7 +6172,6 @@ void sxe_hw_macsec_enable(struct sxe_hw *hw, bool is_up, u32 tx_mode,
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_macsec_disable(struct sxe_hw *hw, bool is_up)
@@ -6555,7 +6199,6 @@ void sxe_hw_macsec_disable(struct sxe_hw *hw, bool is_up)
SXE_REG_WRITE(hw, SXE_SECRXCTRL, SXE_SECRXCTRL_SECRX_DIS);
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_macsec_txsc_set(struct sxe_hw *hw, u32 scl, u32 sch)
@@ -6564,7 +6207,6 @@ void sxe_hw_macsec_txsc_set(struct sxe_hw *hw, u32 scl, u32 sch)
SXE_REG_WRITE(hw, SXE_LSECTXSCH, sch);
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_macsec_rxsc_set(struct sxe_hw *hw, u32 scl, u32 sch, u16 pi)
@@ -6577,7 +6219,6 @@ void sxe_hw_macsec_rxsc_set(struct sxe_hw *hw, u32 scl, u32 sch, u16 pi)
SXE_REG_WRITE(hw, SXE_LSECRXSCH, reg);
SXE_WRITE_FLUSH(hw);
- return;
}
@@ -6594,9 +6235,9 @@ void sxe_hw_macsec_tx_sa_configure(struct sxe_hw *hw, u8 sa_idx,
SXE_WRITE_FLUSH(hw);
SXE_REG_WRITE(hw, SXE_LSECTXPN(sa_idx), pn);
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < 4; i++)
SXE_REG_WRITE(hw, SXE_LSECTXKEY(sa_idx, i), keys[i]);
- }
+
SXE_WRITE_FLUSH(hw);
reg = SXE_REG_READ(hw, SXE_LSECTXSA);
@@ -6613,7 +6254,6 @@ void sxe_hw_macsec_tx_sa_configure(struct sxe_hw *hw, u8 sa_idx,
}
SXE_WRITE_FLUSH(hw);
- return;
}
void sxe_hw_macsec_rx_sa_configure(struct sxe_hw *hw, u8 sa_idx,
@@ -6632,16 +6272,15 @@ void sxe_hw_macsec_rx_sa_configure(struct sxe_hw *hw, u8 sa_idx,
SXE_REG_WRITE(hw, SXE_LSECRXPN(sa_idx), pn);
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < 4; i++)
SXE_REG_WRITE(hw, SXE_LSECRXKEY(sa_idx, i), keys[i]);
- }
+
SXE_WRITE_FLUSH(hw);
reg = ((an << SXE_LSECRXSA_AN_SHIFT) & SXE_LSECRXSA_AN_MASK) | SXE_LSECRXSA_SAV;
SXE_REG_WRITE(hw, SXE_LSECRXSA(sa_idx), reg);
SXE_WRITE_FLUSH(hw);
- return;
}
-
-#endif
-#endif
+
+#endif
+#endif
@@ -5,7 +5,7 @@
#ifndef __SXE_HW_H__
#define __SXE_HW_H__
-#if defined (__KERNEL__) || defined (SXE_KERNEL_TEST)
+#if defined(__KERNEL__) || defined(SXE_KERNEL_TEST)
#include <linux/types.h>
#include <linux/kernel.h>
#else
@@ -20,17 +20,17 @@
#include "sxe_regs.h"
-#if defined (__KERNEL__) || defined (SXE_KERNEL_TEST)
+#if defined(__KERNEL__) || defined(SXE_KERNEL_TEST)
#define SXE_PRIU64 "llu"
#define SXE_PRIX64 "llx"
#define SXE_PRID64 "lld"
-#define SXE_RMB() rmb()
+#define SXE_RMB() rmb() /* verify reading before check ****/
#else
#define SXE_PRIU64 PRIu64
#define SXE_PRIX64 PRIx64
#define SXE_PRID64 PRId64
-#define SXE_RMB() rte_rmb()
+#define SXE_RMB() rte_rmb()
#endif
struct sxe_hw;
@@ -40,29 +40,29 @@ struct sxe_fc_info;
#define SXE_MAC_ADDR_LEN 6
#define SXE_QUEUE_STATS_MAP_REG_NUM 32
-#define SXE_FC_DEFAULT_HIGH_WATER_MARK 0x80
-#define SXE_FC_DEFAULT_LOW_WATER_MARK 0x40
+#define SXE_FC_DEFAULT_HIGH_WATER_MARK 0x80
+#define SXE_FC_DEFAULT_LOW_WATER_MARK 0x40
#define SXE_MC_ADDR_EXTRACT_MASK (0xFFF)
-#define SXE_MC_ADDR_SHIFT (5)
-#define SXE_MC_ADDR_REG_MASK (0x7F)
-#define SXE_MC_ADDR_BIT_MASK (0x1F)
+#define SXE_MC_ADDR_SHIFT (5)
+#define SXE_MC_ADDR_REG_MASK (0x7F)
+#define SXE_MC_ADDR_BIT_MASK (0x1F)
#define SXE_TXTS_POLL_CHECK 3
#define SXE_TXTS_POLL 5
#define SXE_TIME_TO_NS(ns, sec) (((u64)(ns)) + (u64)(((u64)(sec)) * NSEC_PER_SEC))
enum sxe_strict_prio_type {
- PRIO_NONE = 0,
- PRIO_GROUP,
- PRIO_LINK
+ PRIO_NONE = 0,
+ PRIO_GROUP,
+ PRIO_LINK
};
enum sxe_mc_filter_type {
- SXE_MC_FILTER_TYPE0 = 0,
- SXE_MC_FILTER_TYPE1,
- SXE_MC_FILTER_TYPE2,
- SXE_MC_FILTER_TYPE3
+ SXE_MC_FILTER_TYPE0 = 0,
+ SXE_MC_FILTER_TYPE1,
+ SXE_MC_FILTER_TYPE2,
+ SXE_MC_FILTER_TYPE3
};
#define SXE_POOLS_NUM_MAX 64
@@ -84,57 +84,57 @@ enum sxe_mc_filter_type {
#define SXE_VF_NUM_16 16
#define SXE_VF_NUM_32 32
-#define SXE_TX_DESC_EOP_MASK 0x01000000
-#define SXE_TX_DESC_RS_MASK 0x08000000
-#define SXE_TX_DESC_STAT_DD 0x00000001
-#define SXE_TX_DESC_CMD (SXE_TX_DESC_EOP_MASK | SXE_TX_DESC_RS_MASK)
-#define SXE_TX_DESC_TYPE_DATA 0x00300000
-#define SXE_TX_DESC_DEXT 0x20000000
-#define SXE_TX_DESC_IFCS 0x02000000
-#define SXE_TX_DESC_VLE 0x40000000
-#define SXE_TX_DESC_TSTAMP 0x00080000
-#define SXE_TX_DESC_FLAGS (SXE_TX_DESC_TYPE_DATA | \
+#define SXE_TX_DESC_EOP_MASK 0x01000000
+#define SXE_TX_DESC_RS_MASK 0x08000000
+#define SXE_TX_DESC_STAT_DD 0x00000001
+#define SXE_TX_DESC_CMD (SXE_TX_DESC_EOP_MASK | SXE_TX_DESC_RS_MASK)
+#define SXE_TX_DESC_TYPE_DATA 0x00300000
+#define SXE_TX_DESC_DEXT 0x20000000
+#define SXE_TX_DESC_IFCS 0x02000000
+#define SXE_TX_DESC_VLE 0x40000000
+#define SXE_TX_DESC_TSTAMP 0x00080000
+#define SXE_TX_DESC_FLAGS (SXE_TX_DESC_TYPE_DATA | \
SXE_TX_DESC_IFCS | \
SXE_TX_DESC_DEXT| \
SXE_TX_DESC_EOP_MASK)
-#define SXE_TXD_DTYP_CTXT 0x00200000
-#define SXE_TXD_DCMD_TSE 0x80000000
-#define SXE_TXD_MAC_LINKSEC 0x00040000
-#define SXE_TXD_MAC_1588 0x00080000
-#define SXE_TX_DESC_PAYLEN_SHIFT 14
-#define SXE_TX_OUTERIPCS_SHIFT 17
+#define SXE_TXD_DTYP_CTXT 0x00200000
+#define SXE_TXD_DCMD_TSE 0x80000000
+#define SXE_TXD_MAC_LINKSEC 0x00040000
+#define SXE_TXD_MAC_1588 0x00080000
+#define SXE_TX_DESC_PAYLEN_SHIFT 14
+#define SXE_TX_OUTERIPCS_SHIFT 17
#define SXE_TX_POPTS_IXSM 0x01
#define SXE_TX_POPTS_TXSM 0x02
-#define SXE_TXD_POPTS_SHIFT 8
+#define SXE_TXD_POPTS_SHIFT 8
#define SXE_TXD_POPTS_IXSM (SXE_TX_POPTS_IXSM << SXE_TXD_POPTS_SHIFT)
#define SXE_TXD_POPTS_TXSM (SXE_TX_POPTS_TXSM << SXE_TXD_POPTS_SHIFT)
#define SXE_TXD_POPTS_IPSEC (0x00000400)
-#define SXE_TX_CTXTD_DTYP_CTXT 0x00200000
-#define SXE_TX_CTXTD_TUCMD_IPV6 0x00000000
-#define SXE_TX_CTXTD_TUCMD_IPV4 0x00000400
-#define SXE_TX_CTXTD_TUCMD_L4T_UDP 0x00000000
-#define SXE_TX_CTXTD_TUCMD_L4T_TCP 0x00000800
-#define SXE_TX_CTXTD_TUCMD_L4T_SCTP 0x00001000
-#define SXE_TX_CTXTD_TUCMD_L4T_RSV 0x00001800
-#define SXE_TX_CTXTD_TUCMD_IPSEC_TYPE_ESP 0x00002000
-#define SXE_TX_CTXTD_TUCMD_IPSEC_ENCRYPT_EN 0x00004000
-
-#define SXE_TX_CTXTD_L4LEN_SHIFT 8
-#define SXE_TX_CTXTD_MSS_SHIFT 16
-#define SXE_TX_CTXTD_MACLEN_SHIFT 9
-#define SXE_TX_CTXTD_VLAN_SHIFT 16
-#define SXE_TX_CTXTD_VLAN_MASK 0xffff0000
-#define SXE_TX_CTXTD_MACLEN_MASK 0x0000fE00
-#define SXE_TX_CTXTD_OUTER_IPLEN_SHIFT 16
-#define SXE_TX_CTXTD_TUNNEL_LEN_SHIFT 24
-
-#define SXE_VLAN_TAG_SIZE 4
-
-#define SXE_RSS_KEY_SIZE (40)
-#define SXE_MAX_RSS_KEY_ENTRIES (10)
-#define SXE_MAX_RETA_ENTRIES (128)
+#define SXE_TX_CTXTD_DTYP_CTXT 0x00200000
+#define SXE_TX_CTXTD_TUCMD_IPV6 0x00000000
+#define SXE_TX_CTXTD_TUCMD_IPV4 0x00000400
+#define SXE_TX_CTXTD_TUCMD_L4T_UDP 0x00000000
+#define SXE_TX_CTXTD_TUCMD_L4T_TCP 0x00000800
+#define SXE_TX_CTXTD_TUCMD_L4T_SCTP 0x00001000
+#define SXE_TX_CTXTD_TUCMD_L4T_RSV 0x00001800
+#define SXE_TX_CTXTD_TUCMD_IPSEC_TYPE_ESP 0x00002000
+#define SXE_TX_CTXTD_TUCMD_IPSEC_ENCRYPT_EN 0x00004000
+
+#define SXE_TX_CTXTD_L4LEN_SHIFT 8
+#define SXE_TX_CTXTD_MSS_SHIFT 16
+#define SXE_TX_CTXTD_MACLEN_SHIFT 9
+#define SXE_TX_CTXTD_VLAN_SHIFT 16
+#define SXE_TX_CTXTD_VLAN_MASK 0xffff0000
+#define SXE_TX_CTXTD_MACLEN_MASK 0x0000fE00
+#define SXE_TX_CTXTD_OUTER_IPLEN_SHIFT 16
+#define SXE_TX_CTXTD_TUNNEL_LEN_SHIFT 24
+
+#define SXE_VLAN_TAG_SIZE 4
+
+#define SXE_RSS_KEY_SIZE (40)
+#define SXE_MAX_RSS_KEY_ENTRIES (10)
+#define SXE_MAX_RETA_ENTRIES (128)
#define SXE_TIMINC_IV_NS_SHIFT 8
#define SXE_TIMINC_INCPD_SHIFT 24
@@ -142,49 +142,49 @@ enum sxe_mc_filter_type {
(((incpd) << SXE_TIMINC_INCPD_SHIFT) | \
((iv_ns) << SXE_TIMINC_IV_NS_SHIFT) | (iv_sns))
-#define PBA_STRATEGY_EQUAL (0)
-#define PBA_STRATEGY_WEIGHTED (1)
-#define SXE_PKG_BUF_NUM_MAX (8)
+#define PBA_STRATEGY_EQUAL (0)
+#define PBA_STRATEGY_WEIGHTED (1)
+#define SXE_PKG_BUF_NUM_MAX (8)
#define SXE_HW_TXRX_RING_NUM_MAX 128
#define SXE_VMDQ_DCB_NUM_QUEUES SXE_HW_TXRX_RING_NUM_MAX
-#define SXE_RX_PKT_BUF_SIZE (512)
+#define SXE_RX_PKT_BUF_SIZE (512)
#define SXE_UC_ENTRY_NUM_MAX 128
#define SXE_HW_TX_NONE_MODE_Q_NUM 64
-#define SXE_MBX_MSG_NUM 16
+#define SXE_MBX_MSG_NUM 16
#define SXE_MBX_RETRY_INTERVAL 500
-#define SXE_MBX_RETRY_COUNT 2000
+#define SXE_MBX_RETRY_COUNT 2000
#define SXE_VF_UC_ENTRY_NUM_MAX 10
#define SXE_VF_MC_ENTRY_NUM_MAX 30
#define SXE_UTA_ENTRY_NUM_MAX 128
#define SXE_MTA_ENTRY_NUM_MAX 128
-#define SXE_HASH_UC_NUM_MAX 4096
+#define SXE_HASH_UC_NUM_MAX 4096
-#define SXE_MAC_ADDR_EXTRACT_MASK (0xFFF)
-#define SXE_MAC_ADDR_SHIFT (5)
-#define SXE_MAC_ADDR_REG_MASK (0x7F)
-#define SXE_MAC_ADDR_BIT_MASK (0x1F)
+#define SXE_MAC_ADDR_EXTRACT_MASK (0xFFF)
+#define SXE_MAC_ADDR_SHIFT (5)
+#define SXE_MAC_ADDR_REG_MASK (0x7F)
+#define SXE_MAC_ADDR_BIT_MASK (0x1F)
-#define SXE_VFT_TBL_SIZE (128)
-#define SXE_VLAN_ID_SHIFT (5)
-#define SXE_VLAN_ID_REG_MASK (0x7F)
-#define SXE_VLAN_ID_BIT_MASK (0x1F)
+#define SXE_VFT_TBL_SIZE (128)
+#define SXE_VLAN_ID_SHIFT (5)
+#define SXE_VLAN_ID_REG_MASK (0x7F)
+#define SXE_VLAN_ID_BIT_MASK (0x1F)
-#define SXE_TX_PBSIZE_MAX 0x00028000
-#define SXE_TX_PKT_SIZE_MAX 0xA
-#define SXE_NODCB_TX_PKT_SIZE_MAX 0x14
+#define SXE_TX_PBSIZE_MAX 0x00028000
+#define SXE_TX_PKT_SIZE_MAX 0xA
+#define SXE_NODCB_TX_PKT_SIZE_MAX 0x14
#define SXE_RING_ENABLE_WAIT_LOOP 10
-#define VFTA_BLOCK_SIZE 8
-#define VF_BLOCK_BITS (32)
+#define VFTA_BLOCK_SIZE 8
+#define VF_BLOCK_BITS (32)
#define SXE_MAX_MAC_HDR_LEN 127
#define SXE_MAX_NETWORK_HDR_LEN 511
#define SXE_MAC_ADDR_LEN 6
-#define SXE_FNAV_BUCKET_HASH_KEY 0x3DAD14E2
+#define SXE_FNAV_BUCKET_HASH_KEY 0x3DAD14E2
#define SXE_FNAV_SAMPLE_HASH_KEY 0x174D3614
#define SXE_SAMPLE_COMMON_HASH_KEY \
(SXE_FNAV_BUCKET_HASH_KEY & SXE_FNAV_SAMPLE_HASH_KEY)
@@ -202,11 +202,11 @@ enum sxe_mc_filter_type {
#define SXE_SAMPLE_VLAN_MASK 0xEFFF
#define SXE_SAMPLE_FLEX_BYTES_MASK 0xFFFF
-#define SXE_FNAV_INIT_DONE_POLL 10
-#define SXE_FNAV_DROP_QUEUE 127
+#define SXE_FNAV_INIT_DONE_POLL 10
+#define SXE_FNAV_DROP_QUEUE 127
-#define MAX_TRAFFIC_CLASS 8
-#define DEF_TRAFFIC_CLASS 1
+#define MAX_TRAFFIC_CLASS 8
+#define DEF_TRAFFIC_CLASS 1
#define SXE_LINK_SPEED_UNKNOWN 0
#define SXE_LINK_SPEED_10_FULL 0x0002
@@ -245,176 +245,176 @@ enum sxe_sample_type {
};
enum {
- SXE_DIAG_TEST_PASSED = 0,
- SXE_DIAG_TEST_BLOCKED = 1,
- SXE_DIAG_STATS_REG_TEST_ERR = 2,
- SXE_DIAG_REG_PATTERN_TEST_ERR = 3,
- SXE_DIAG_CHECK_REG_TEST_ERR = 4,
- SXE_DIAG_DISABLE_IRQ_TEST_ERR = 5,
- SXE_DIAG_ENABLE_IRQ_TEST_ERR = 6,
+ SXE_DIAG_TEST_PASSED = 0,
+ SXE_DIAG_TEST_BLOCKED = 1,
+ SXE_DIAG_STATS_REG_TEST_ERR = 2,
+ SXE_DIAG_REG_PATTERN_TEST_ERR = 3,
+ SXE_DIAG_CHECK_REG_TEST_ERR = 4,
+ SXE_DIAG_DISABLE_IRQ_TEST_ERR = 5,
+ SXE_DIAG_ENABLE_IRQ_TEST_ERR = 6,
SXE_DIAG_DISABLE_OTHER_IRQ_TEST_ERR = 7,
- SXE_DIAG_TX_RING_CONFIGURE_ERR = 8,
- SXE_DIAG_RX_RING_CONFIGURE_ERR = 9,
- SXE_DIAG_ALLOC_SKB_ERR = 10,
- SXE_DIAG_LOOPBACK_SEND_TEST_ERR = 11,
- SXE_DIAG_LOOPBACK_RECV_TEST_ERR = 12,
+ SXE_DIAG_TX_RING_CONFIGURE_ERR = 8,
+ SXE_DIAG_RX_RING_CONFIGURE_ERR = 9,
+ SXE_DIAG_ALLOC_SKB_ERR = 10,
+ SXE_DIAG_LOOPBACK_SEND_TEST_ERR = 11,
+ SXE_DIAG_LOOPBACK_RECV_TEST_ERR = 12,
};
-#define SXE_RXD_STAT_DD 0x01
-#define SXE_RXD_STAT_EOP 0x02
-#define SXE_RXD_STAT_FLM 0x04
-#define SXE_RXD_STAT_VP 0x08
-#define SXE_RXDADV_NEXTP_MASK 0x000FFFF0
+#define SXE_RXD_STAT_DD 0x01
+#define SXE_RXD_STAT_EOP 0x02
+#define SXE_RXD_STAT_FLM 0x04
+#define SXE_RXD_STAT_VP 0x08
+#define SXE_RXDADV_NEXTP_MASK 0x000FFFF0
#define SXE_RXDADV_NEXTP_SHIFT 0x00000004
-#define SXE_RXD_STAT_UDPCS 0x10
-#define SXE_RXD_STAT_L4CS 0x20
-#define SXE_RXD_STAT_IPCS 0x40
-#define SXE_RXD_STAT_PIF 0x80
-#define SXE_RXD_STAT_CRCV 0x100
-#define SXE_RXD_STAT_OUTERIPCS 0x100
-#define SXE_RXD_STAT_VEXT 0x200
-#define SXE_RXD_STAT_UDPV 0x400
-#define SXE_RXD_STAT_DYNINT 0x800
-#define SXE_RXD_STAT_LLINT 0x800
-#define SXE_RXD_STAT_TSIP 0x08000
-#define SXE_RXD_STAT_TS 0x10000
-#define SXE_RXD_STAT_SECP 0x20000
-#define SXE_RXD_STAT_LB 0x40000
-#define SXE_RXD_STAT_ACK 0x8000
-#define SXE_RXD_ERR_CE 0x01
-#define SXE_RXD_ERR_LE 0x02
-#define SXE_RXD_ERR_PE 0x08
-#define SXE_RXD_ERR_OSE 0x10
-#define SXE_RXD_ERR_USE 0x20
-#define SXE_RXD_ERR_TCPE 0x40
-#define SXE_RXD_ERR_IPE 0x80
-#define SXE_RXDADV_ERR_MASK 0xfff00000
-#define SXE_RXDADV_ERR_SHIFT 20
-#define SXE_RXDADV_ERR_OUTERIPER 0x04000000
-#define SXE_RXDADV_ERR_FCEOFE 0x80000000
-#define SXE_RXDADV_ERR_FCERR 0x00700000
-#define SXE_RXDADV_ERR_FNAV_LEN 0x00100000
-#define SXE_RXDADV_ERR_FNAV_DROP 0x00200000
-#define SXE_RXDADV_ERR_FNAV_COLL 0x00400000
-#define SXE_RXDADV_ERR_HBO 0x00800000
-#define SXE_RXDADV_ERR_CE 0x01000000
-#define SXE_RXDADV_ERR_LE 0x02000000
-#define SXE_RXDADV_ERR_PE 0x08000000
-#define SXE_RXDADV_ERR_OSE 0x10000000
-#define SXE_RXDADV_ERR_IPSEC_INV_PROTOCOL 0x08000000
-#define SXE_RXDADV_ERR_IPSEC_INV_LENGTH 0x10000000
+#define SXE_RXD_STAT_UDPCS 0x10
+#define SXE_RXD_STAT_L4CS 0x20
+#define SXE_RXD_STAT_IPCS 0x40
+#define SXE_RXD_STAT_PIF 0x80
+#define SXE_RXD_STAT_CRCV 0x100
+#define SXE_RXD_STAT_OUTERIPCS 0x100
+#define SXE_RXD_STAT_VEXT 0x200
+#define SXE_RXD_STAT_UDPV 0x400
+#define SXE_RXD_STAT_DYNINT 0x800
+#define SXE_RXD_STAT_LLINT 0x800
+#define SXE_RXD_STAT_TSIP 0x08000
+#define SXE_RXD_STAT_TS 0x10000
+#define SXE_RXD_STAT_SECP 0x20000
+#define SXE_RXD_STAT_LB 0x40000
+#define SXE_RXD_STAT_ACK 0x8000
+#define SXE_RXD_ERR_CE 0x01
+#define SXE_RXD_ERR_LE 0x02
+#define SXE_RXD_ERR_PE 0x08
+#define SXE_RXD_ERR_OSE 0x10
+#define SXE_RXD_ERR_USE 0x20
+#define SXE_RXD_ERR_TCPE 0x40
+#define SXE_RXD_ERR_IPE 0x80
+#define SXE_RXDADV_ERR_MASK 0xfff00000
+#define SXE_RXDADV_ERR_SHIFT 20
+#define SXE_RXDADV_ERR_OUTERIPER 0x04000000
+#define SXE_RXDADV_ERR_FCEOFE 0x80000000
+#define SXE_RXDADV_ERR_FCERR 0x00700000
+#define SXE_RXDADV_ERR_FNAV_LEN 0x00100000
+#define SXE_RXDADV_ERR_FNAV_DROP 0x00200000
+#define SXE_RXDADV_ERR_FNAV_COLL 0x00400000
+#define SXE_RXDADV_ERR_HBO 0x00800000
+#define SXE_RXDADV_ERR_CE 0x01000000
+#define SXE_RXDADV_ERR_LE 0x02000000
+#define SXE_RXDADV_ERR_PE 0x08000000
+#define SXE_RXDADV_ERR_OSE 0x10000000
+#define SXE_RXDADV_ERR_IPSEC_INV_PROTOCOL 0x08000000
+#define SXE_RXDADV_ERR_IPSEC_INV_LENGTH 0x10000000
#define SXE_RXDADV_ERR_IPSEC_AUTH_FAILED 0x18000000
-#define SXE_RXDADV_ERR_USE 0x20000000
-#define SXE_RXDADV_ERR_L4E 0x40000000
-#define SXE_RXDADV_ERR_IPE 0x80000000
-#define SXE_RXD_VLAN_ID_MASK 0x0FFF
-#define SXE_RXD_PRI_MASK 0xE000
-#define SXE_RXD_PRI_SHIFT 13
-#define SXE_RXD_CFI_MASK 0x1000
-#define SXE_RXD_CFI_SHIFT 12
-#define SXE_RXDADV_LROCNT_MASK 0x001E0000
-#define SXE_RXDADV_LROCNT_SHIFT 17
-
-#define SXE_RXDADV_STAT_DD SXE_RXD_STAT_DD
-#define SXE_RXDADV_STAT_EOP SXE_RXD_STAT_EOP
-#define SXE_RXDADV_STAT_FLM SXE_RXD_STAT_FLM
-#define SXE_RXDADV_STAT_VP SXE_RXD_STAT_VP
-#define SXE_RXDADV_STAT_MASK 0x000fffff
-#define SXE_RXDADV_STAT_TS 0x00010000
-#define SXE_RXDADV_STAT_SECP 0x00020000
-
-#define SXE_RXDADV_PKTTYPE_NONE 0x00000000
-#define SXE_RXDADV_PKTTYPE_IPV4 0x00000010
-#define SXE_RXDADV_PKTTYPE_IPV4_EX 0x00000020
-#define SXE_RXDADV_PKTTYPE_IPV6 0x00000040
-#define SXE_RXDADV_PKTTYPE_IPV6_EX 0x00000080
-#define SXE_RXDADV_PKTTYPE_TCP 0x00000100
-#define SXE_RXDADV_PKTTYPE_UDP 0x00000200
-#define SXE_RXDADV_PKTTYPE_SCTP 0x00000400
-#define SXE_RXDADV_PKTTYPE_NFS 0x00000800
-#define SXE_RXDADV_PKTTYPE_VXLAN 0x00000800
-#define SXE_RXDADV_PKTTYPE_TUNNEL 0x00010000
-#define SXE_RXDADV_PKTTYPE_IPSEC_ESP 0x00001000
-#define SXE_RXDADV_PKTTYPE_IPSEC_AH 0x00002000
-#define SXE_RXDADV_PKTTYPE_LINKSEC 0x00004000
-#define SXE_RXDADV_PKTTYPE_ETQF 0x00008000
-#define SXE_RXDADV_PKTTYPE_ETQF_MASK 0x00000070
-#define SXE_RXDADV_PKTTYPE_ETQF_SHIFT 4
+#define SXE_RXDADV_ERR_USE 0x20000000
+#define SXE_RXDADV_ERR_L4E 0x40000000
+#define SXE_RXDADV_ERR_IPE 0x80000000
+#define SXE_RXD_VLAN_ID_MASK 0x0FFF
+#define SXE_RXD_PRI_MASK 0xE000
+#define SXE_RXD_PRI_SHIFT 13
+#define SXE_RXD_CFI_MASK 0x1000
+#define SXE_RXD_CFI_SHIFT 12
+#define SXE_RXDADV_LROCNT_MASK 0x001E0000
+#define SXE_RXDADV_LROCNT_SHIFT 17
+
+#define SXE_RXDADV_STAT_DD SXE_RXD_STAT_DD
+#define SXE_RXDADV_STAT_EOP SXE_RXD_STAT_EOP
+#define SXE_RXDADV_STAT_FLM SXE_RXD_STAT_FLM
+#define SXE_RXDADV_STAT_VP SXE_RXD_STAT_VP
+#define SXE_RXDADV_STAT_MASK 0x000fffff
+#define SXE_RXDADV_STAT_TS 0x00010000
+#define SXE_RXDADV_STAT_SECP 0x00020000
+
+#define SXE_RXDADV_PKTTYPE_NONE 0x00000000
+#define SXE_RXDADV_PKTTYPE_IPV4 0x00000010
+#define SXE_RXDADV_PKTTYPE_IPV4_EX 0x00000020
+#define SXE_RXDADV_PKTTYPE_IPV6 0x00000040
+#define SXE_RXDADV_PKTTYPE_IPV6_EX 0x00000080
+#define SXE_RXDADV_PKTTYPE_TCP 0x00000100
+#define SXE_RXDADV_PKTTYPE_UDP 0x00000200
+#define SXE_RXDADV_PKTTYPE_SCTP 0x00000400
+#define SXE_RXDADV_PKTTYPE_NFS 0x00000800
+#define SXE_RXDADV_PKTTYPE_VXLAN 0x00000800
+#define SXE_RXDADV_PKTTYPE_TUNNEL 0x00010000
+#define SXE_RXDADV_PKTTYPE_IPSEC_ESP 0x00001000
+#define SXE_RXDADV_PKTTYPE_IPSEC_AH 0x00002000
+#define SXE_RXDADV_PKTTYPE_LINKSEC 0x00004000
+#define SXE_RXDADV_PKTTYPE_ETQF 0x00008000
+#define SXE_RXDADV_PKTTYPE_ETQF_MASK 0x00000070
+#define SXE_RXDADV_PKTTYPE_ETQF_SHIFT 4
struct sxe_mac_stats {
- u64 crcerrs;
- u64 errbc;
- u64 rlec;
- u64 prc64;
- u64 prc127;
- u64 prc255;
- u64 prc511;
- u64 prc1023;
- u64 prc1522;
- u64 gprc;
- u64 bprc;
- u64 mprc;
- u64 gptc;
- u64 gorc;
- u64 gotc;
- u64 ruc;
- u64 rfc;
- u64 roc;
- u64 rjc;
- u64 tor;
- u64 tpr;
- u64 tpt;
- u64 ptc64;
- u64 ptc127;
- u64 ptc255;
- u64 ptc511;
- u64 ptc1023;
- u64 ptc1522;
- u64 mptc;
- u64 bptc;
- u64 qprc[16];
- u64 qptc[16];
- u64 qbrc[16];
- u64 qbtc[16];
- u64 qprdc[16];
- u64 dburxtcin[8];
- u64 dburxtcout[8];
- u64 dburxgdreecnt[8];
- u64 dburxdrofpcnt[8];
- u64 dbutxtcin[8];
- u64 dbutxtcout[8];
- u64 rxdgpc;
- u64 rxdgbc;
- u64 rxddpc;
- u64 rxddbc;
- u64 rxtpcing;
- u64 rxtpceng;
- u64 rxlpbkpc;
- u64 rxlpbkbc;
- u64 rxdlpbkpc;
- u64 rxdlpbkbc;
- u64 prddc;
- u64 txdgpc;
- u64 txdgbc;
- u64 txswerr;
- u64 txswitch;
- u64 txrepeat;
- u64 txdescerr;
-
- u64 fnavadd;
- u64 fnavrmv;
- u64 fnavadderr;
- u64 fnavrmverr;
- u64 fnavmatch;
- u64 fnavmiss;
- u64 hw_rx_no_dma_resources;
- u64 prcpf[8];
- u64 pfct[8];
- u64 mpc[8];
-
- u64 total_tx_pause;
- u64 total_gptc;
- u64 total_gotc;
+ u64 crcerrs;
+ u64 errbc;
+ u64 rlec;
+ u64 prc64;
+ u64 prc127;
+ u64 prc255;
+ u64 prc511;
+ u64 prc1023;
+ u64 prc1522;
+ u64 gprc;
+ u64 bprc;
+ u64 mprc;
+ u64 gptc;
+ u64 gorc;
+ u64 gotc;
+ u64 ruc;
+ u64 rfc;
+ u64 roc;
+ u64 rjc;
+ u64 tor;
+ u64 tpr;
+ u64 tpt;
+ u64 ptc64;
+ u64 ptc127;
+ u64 ptc255;
+ u64 ptc511;
+ u64 ptc1023;
+ u64 ptc1522;
+ u64 mptc;
+ u64 bptc;
+ u64 qprc[16];
+ u64 qptc[16];
+ u64 qbrc[16];
+ u64 qbtc[16];
+ u64 qprdc[16];
+ u64 dburxtcin[8];
+ u64 dburxtcout[8];
+ u64 dburxgdreecnt[8];
+ u64 dburxdrofpcnt[8];
+ u64 dbutxtcin[8];
+ u64 dbutxtcout[8];
+ u64 rxdgpc;
+ u64 rxdgbc;
+ u64 rxddpc;
+ u64 rxddbc;
+ u64 rxtpcing;
+ u64 rxtpceng;
+ u64 rxlpbkpc;
+ u64 rxlpbkbc;
+ u64 rxdlpbkpc;
+ u64 rxdlpbkbc;
+ u64 prddc;
+ u64 txdgpc;
+ u64 txdgbc;
+ u64 txswerr;
+ u64 txswitch;
+ u64 txrepeat;
+ u64 txdescerr;
+
+ u64 fnavadd;
+ u64 fnavrmv;
+ u64 fnavadderr;
+ u64 fnavrmverr;
+ u64 fnavmatch;
+ u64 fnavmiss;
+ u64 hw_rx_no_dma_resources;
+ u64 prcpf[8];
+ u64 pfct[8];
+ u64 mpc[8];
+
+ u64 total_tx_pause;
+ u64 total_gptc;
+ u64 total_gotc;
};
#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_FILTER_CTRL
@@ -440,16 +440,16 @@ struct sxe_fivetuple_filter_info {
};
struct sxe_fivetuple_node_info {
- u16 index;
- u16 queue;
+ u16 index;
+ u16 queue;
struct sxe_fivetuple_filter_info filter_info;
};
#endif
union sxe_fnav_rule_info {
struct {
- u8 vm_pool;
- u8 flow_type;
+ u8 vm_pool;
+ u8 flow_type;
__be16 vlan_id;
__be32 dst_ip[4];
__be32 src_ip[4];
@@ -480,21 +480,21 @@ void sxe_hw_ops_init(struct sxe_hw *hw);
struct sxe_reg_info {
- u32 addr;
- u32 count;
- u32 stride;
- const s8 *name;
+ u32 addr;
+ u32 count;
+ u32 stride;
+ const s8 *name;
};
struct sxe_setup_operations {
- s32 (*reset)(struct sxe_hw *);
- void (*pf_rst_done_set)(struct sxe_hw *);
- void (*no_snoop_disable)(struct sxe_hw *);
- u32 (*reg_read)(struct sxe_hw *, u32);
- void (*reg_write)(struct sxe_hw *, u32, u32);
- void (*regs_dump)(struct sxe_hw *);
- void (*regs_flush)(struct sxe_hw *);
- s32 (*regs_test)(struct sxe_hw *);
+ s32 (*reset)(struct sxe_hw *hw);
+ void (*pf_rst_done_set)(struct sxe_hw *hw);
+ void (*no_snoop_disable)(struct sxe_hw *hw);
+ u32 (*reg_read)(struct sxe_hw *hw, u32 reg);
+ void (*reg_write)(struct sxe_hw *hw, u32 reg, u32 val);
+ void (*regs_dump)(struct sxe_hw *hw);
+ void (*regs_flush)(struct sxe_hw *hw);
+ s32 (*regs_test)(struct sxe_hw *hw);
};
struct sxe_hw_setup {
@@ -503,20 +503,22 @@ struct sxe_hw_setup {
struct sxe_irq_operations {
u32 (*pending_irq_read_clear)(struct sxe_hw *hw);
- void (*pending_irq_write_clear)(struct sxe_hw * hw, u32 value);
+ void (*pending_irq_write_clear)(struct sxe_hw *hw, u32 value);
void (*irq_general_reg_set)(struct sxe_hw *hw, u32 value);
u32 (*irq_general_reg_get)(struct sxe_hw *hw);
void (*ring_irq_auto_disable)(struct sxe_hw *hw, bool is_misx);
void (*set_eitrsel)(struct sxe_hw *hw, u32 value);
- void (*ring_irq_interval_set)(struct sxe_hw *hw, u16 irq_idx, u32 interval);
- void (*event_irq_interval_set)(struct sxe_hw * hw, u16 irq_idx, u32 value);
+ void (*ring_irq_interval_set)(struct sxe_hw *hw, u16 irq_idx,
+ u32 interval);
+ void (*event_irq_interval_set)(struct sxe_hw *hw, u16 irq_idx,
+ u32 value);
void (*event_irq_auto_clear_set)(struct sxe_hw *hw, u32 value);
void (*ring_irq_map)(struct sxe_hw *hw, bool is_tx,
- u16 reg_idx, u16 irq_idx);
+ u16 reg_idx, u16 irq_idx);
void (*event_irq_map)(struct sxe_hw *hw, u8 offset, u16 irq_idx);
- void (*ring_irq_enable)(struct sxe_hw * hw, u64 qmask);
- u32 (*irq_cause_get)(struct sxe_hw * hw);
- void (*event_irq_trigger)(struct sxe_hw * hw);
+ void (*ring_irq_enable)(struct sxe_hw *hw, u64 qmask);
+ u32 (*irq_cause_get)(struct sxe_hw *hw);
+ void (*event_irq_trigger)(struct sxe_hw *hw);
void (*ring_irq_trigger)(struct sxe_hw *hw, u64 eics);
void (*specific_irq_disable)(struct sxe_hw *hw, u32 value);
void (*specific_irq_enable)(struct sxe_hw *hw, u32 value);
@@ -530,26 +532,26 @@ struct sxe_irq_info {
};
struct sxe_mac_operations {
- bool (*link_up_1g_check)(struct sxe_hw *);
- bool (*link_state_is_up)(struct sxe_hw *);
- u32 (*link_speed_get)(struct sxe_hw *);
- void (*link_speed_set)(struct sxe_hw *, u32 speed);
- void (*pad_enable)(struct sxe_hw *);
- s32 (*fc_enable)(struct sxe_hw *);
- void (*crc_configure)(struct sxe_hw *);
- void (*loopback_switch)(struct sxe_hw *, bool);
+ bool (*link_up_1g_check)(struct sxe_hw *hw);
+ bool (*link_state_is_up)(struct sxe_hw *hw);
+ u32 (*link_speed_get)(struct sxe_hw *hw);
+ void (*link_speed_set)(struct sxe_hw *hw, u32 speed);
+ void (*pad_enable)(struct sxe_hw *hw);
+ s32 (*fc_enable)(struct sxe_hw *hw);
+ void (*crc_configure)(struct sxe_hw *hw);
+ void (*loopback_switch)(struct sxe_hw *hw, bool val);
void (*txrx_enable)(struct sxe_hw *hw);
- void (*max_frame_set)(struct sxe_hw *, u32);
- u32 (*max_frame_get)(struct sxe_hw *);
- void (*fc_autoneg_localcap_set)(struct sxe_hw *);
- void (*fc_tc_high_water_mark_set)(struct sxe_hw *, u8, u32);
- void (*fc_tc_low_water_mark_set)(struct sxe_hw *, u8, u32);
- void (*fc_param_init)(struct sxe_hw *);
- enum sxe_fc_mode (*fc_current_mode_get)(struct sxe_hw *);
- enum sxe_fc_mode (*fc_requested_mode_get)(struct sxe_hw *);
- void (*fc_requested_mode_set)(struct sxe_hw *, enum sxe_fc_mode);
- bool (*is_fc_autoneg_disabled)(struct sxe_hw *);
- void (*fc_autoneg_disable_set)(struct sxe_hw *, bool);
+ void (*max_frame_set)(struct sxe_hw *hw, u32 val);
+ u32 (*max_frame_get)(struct sxe_hw *hw);
+ void (*fc_autoneg_localcap_set)(struct sxe_hw *hw);
+ void (*fc_tc_high_water_mark_set)(struct sxe_hw *hw, u8 tc_idx, u32 val);
+ void (*fc_tc_low_water_mark_set)(struct sxe_hw *hw, u8 tc_idx, u32 val);
+ void (*fc_param_init)(struct sxe_hw *hw);
+ enum sxe_fc_mode (*fc_current_mode_get)(struct sxe_hw *hw);
+ enum sxe_fc_mode (*fc_requested_mode_get)(struct sxe_hw *hw);
+ void (*fc_requested_mode_set)(struct sxe_hw *hw, enum sxe_fc_mode e);
+ bool (*is_fc_autoneg_disabled)(struct sxe_hw *hw);
+ void (*fc_autoneg_disable_set)(struct sxe_hw *hw, bool val);
};
#define SXE_FLAGS_DOUBLE_RESET_REQUIRED 0x01
@@ -562,25 +564,26 @@ struct sxe_mac_info {
};
struct sxe_filter_mac_operations {
- u32 (*rx_mode_get)(struct sxe_hw *);
- void (*rx_mode_set)(struct sxe_hw *, u32);
- u32 (*pool_rx_mode_get)(struct sxe_hw *, u16);
- void (*pool_rx_mode_set)(struct sxe_hw *, u32, u16);
- void (*rx_lro_enable) (struct sxe_hw *, bool);
- void (*rx_udp_frag_checksum_disable) (struct sxe_hw *);
- s32 (*uc_addr_add)(struct sxe_hw *, u32, u8 *, u32);
- s32 (*uc_addr_del)(struct sxe_hw *, u32);
- void (*uc_addr_clear)(struct sxe_hw *);
+ u32 (*rx_mode_get)(struct sxe_hw *hw);
+ void (*rx_mode_set)(struct sxe_hw *hw, u32 filter_ctrl);
+ u32 (*pool_rx_mode_get)(struct sxe_hw *hw, u16 idx);
+ void (*pool_rx_mode_set)(struct sxe_hw *hw, u32 vmolr, u16 idx);
+ void (*rx_lro_enable)(struct sxe_hw *hw, bool is_enable);
+ void (*rx_udp_frag_checksum_disable)(struct sxe_hw *hw);
+ s32 (*uc_addr_add)(struct sxe_hw *hw, u32 rar_idx,
+ u8 *addr, u32 pool_idx);
+ s32 (*uc_addr_del)(struct sxe_hw *hw, u32 idx);
+ void (*uc_addr_clear)(struct sxe_hw *hw);
void (*mta_hash_table_set)(struct sxe_hw *hw, u8 index, u32 value);
void (*mta_hash_table_update)(struct sxe_hw *hw, u8 reg_idx, u8 bit_idx);
void (*fc_mac_addr_set)(struct sxe_hw *hw, u8 *mac_addr);
- void (*mc_filter_enable)(struct sxe_hw *);
+ void (*mc_filter_enable)(struct sxe_hw *hw);
void (*mc_filter_disable)(struct sxe_hw *hw);
- void (*rx_nfs_filter_disable)(struct sxe_hw *);
- void (*ethertype_filter_set)(struct sxe_hw *, u8, u32);
+ void (*rx_nfs_filter_disable)(struct sxe_hw *hw);
+ void (*ethertype_filter_set)(struct sxe_hw *hw, u8 filter_type, u32 val);
void (*vt_ctrl_configure)(struct sxe_hw *hw, u8 num_vfs);
@@ -600,16 +603,17 @@ struct sxe_filter_mac {
};
struct sxe_filter_vlan_operations {
- u32 (*pool_filter_read)(struct sxe_hw *, u16);
- void (*pool_filter_write)(struct sxe_hw *, u16, u32);
- u32 (*pool_filter_bitmap_read)(struct sxe_hw *, u16);
- void (*pool_filter_bitmap_write)(struct sxe_hw *, u16, u32);
- void (*filter_array_write)(struct sxe_hw *, u16, u32);
- u32 (*filter_array_read)(struct sxe_hw *, u16);
- void (*filter_array_clear)(struct sxe_hw *);
- void (*filter_switch)(struct sxe_hw *,bool);
- void (*untagged_pkts_rcv_switch)(struct sxe_hw *, u32, bool);
- s32 (*filter_configure)(struct sxe_hw *, u32, u32, bool, bool);
+ u32 (*pool_filter_read)(struct sxe_hw *hw, u16 reg_idx);
+ void (*pool_filter_write)(struct sxe_hw *hw, u16 reg_idx, u32 val);
+ u32 (*pool_filter_bitmap_read)(struct sxe_hw *hw, u16 reg_idx);
+ void (*pool_filter_bitmap_write)(struct sxe_hw *hw, u16 reg_idx, u32 val);
+ void (*filter_array_write)(struct sxe_hw *hw, u16 reg_idx, u32 val);
+ u32 (*filter_array_read)(struct sxe_hw *hw, u16 reg_idx);
+ void (*filter_array_clear)(struct sxe_hw *hw);
+ void (*filter_switch)(struct sxe_hw *hw, bool enable);
+ void (*untagged_pkts_rcv_switch)(struct sxe_hw *hw, u32 vf, bool accept);
+ s32 (*filter_configure)(struct sxe_hw *hw, u32 vid, u32 pool,
+ bool vlan_on, bool vlvf_bypass);
};
struct sxe_filter_vlan {
@@ -622,55 +626,63 @@ struct sxe_filter_info {
};
struct sxe_dbu_operations {
- void (*rx_pkt_buf_size_configure)(struct sxe_hw *, u8, u32, u16);
- void (*rx_pkt_buf_switch)(struct sxe_hw *, bool);
- void (*rx_multi_ring_configure)(struct sxe_hw *, u8, bool, bool);
- void (*rss_key_set_all)(struct sxe_hw *, u32 *);
- void (*rss_redir_tbl_set_all)(struct sxe_hw *, u8 *);
- void (*rx_cap_switch_on)(struct sxe_hw *);
- void (*rss_hash_pkt_type_set)(struct sxe_hw *, u32);
- void (*rss_hash_pkt_type_update)(struct sxe_hw *, u32);
- void (*rss_rings_used_set)(struct sxe_hw *, u32, u16, u16);
- void (*lro_ack_switch)(struct sxe_hw *, bool);
- void (*vf_rx_switch)(struct sxe_hw *, u32, u32, bool);
-
- s32 (*fnav_mode_init)(struct sxe_hw *, u32, u32);
- s32 (*fnav_specific_rule_mask_set)(struct sxe_hw *,
- union sxe_fnav_rule_info *);
- s32 (*fnav_specific_rule_add)(struct sxe_hw *,
- union sxe_fnav_rule_info *,
- u16, u8);
- s32 (*fnav_specific_rule_del)(struct sxe_hw *,
- union sxe_fnav_rule_info *, u16);
- s32 (*fnav_sample_hash_cmd_get)(struct sxe_hw *,
- u8, u32, u8, u64 *);
+ void (*rx_pkt_buf_size_configure)(struct sxe_hw *hw, u8 num_pb,
+ u32 headroom, u16 strategy);
+ void (*rx_pkt_buf_switch)(struct sxe_hw *hw, bool is_on);
+ void (*rx_multi_ring_configure)(struct sxe_hw *hw, u8 tcs,
+ bool is_4q, bool sriov_enable);
+ void (*rss_key_set_all)(struct sxe_hw *hw, u32 *rss_key);
+ void (*rss_redir_tbl_set_all)(struct sxe_hw *hw, u8 *redir_tbl);
+ void (*rx_cap_switch_on)(struct sxe_hw *hw);
+ void (*rss_hash_pkt_type_set)(struct sxe_hw *hw, u32 version);
+ void (*rss_hash_pkt_type_update)(struct sxe_hw *hw, u32 version);
+ void (*rss_rings_used_set)(struct sxe_hw *hw, u32 rss_num,
+ u16 pool, u16 pf_offset);
+ void (*lro_ack_switch)(struct sxe_hw *hw, bool is_on);
+ void (*vf_rx_switch)(struct sxe_hw *hw, u32 reg_offset,
+ u32 vf_index, bool is_off);
+
+ s32 (*fnav_mode_init)(struct sxe_hw *hw, u32 fnavctrl, u32 fnav_mode);
+ s32 (*fnav_specific_rule_mask_set)(struct sxe_hw *hw,
+ union sxe_fnav_rule_info *mask);
+ s32 (*fnav_specific_rule_add)(struct sxe_hw *hw,
+ union sxe_fnav_rule_info *input,
+ u16 soft_id, u8 queue);
+ s32 (*fnav_specific_rule_del)(struct sxe_hw *hw,
+ union sxe_fnav_rule_info *input, u16 soft_id);
+ s32 (*fnav_sample_hash_cmd_get)(struct sxe_hw *hw,
+ u8 flow_type, u32 hash_value,
+ u8 queue, u64 *hash_cmd);
void (*fnav_sample_stats_reinit)(struct sxe_hw *hw);
void (*fnav_sample_hash_set)(struct sxe_hw *hw, u64 hash);
- s32 (*fnav_single_sample_rule_del)(struct sxe_hw *,u32);
-
- void (*ptp_init)(struct sxe_hw *);
- void (*ptp_freq_adjust)(struct sxe_hw *, u32);
- void (*ptp_systime_init)(struct sxe_hw *);
- u64 (*ptp_systime_get)(struct sxe_hw *);
- void (*ptp_tx_timestamp_get)(struct sxe_hw *, u32 *ts_sec, u32 *ts_ns);
- void (*ptp_timestamp_mode_set)(struct sxe_hw *, bool, u32, u32);
- void (*ptp_rx_timestamp_clear)(struct sxe_hw *);
- u64 (*ptp_rx_timestamp_get)(struct sxe_hw *);
- bool (*ptp_is_rx_timestamp_valid)(struct sxe_hw *);
- void (*ptp_timestamp_enable)(struct sxe_hw *);
-
- void (*tx_pkt_buf_switch)(struct sxe_hw *, bool);
+ s32 (*fnav_single_sample_rule_del)(struct sxe_hw *hw, u32 hash);
+
+ void (*ptp_init)(struct sxe_hw *hw);
+ void (*ptp_freq_adjust)(struct sxe_hw *hw, u32 adj_freq);
+ void (*ptp_systime_init)(struct sxe_hw *hw);
+ u64 (*ptp_systime_get)(struct sxe_hw *hw);
+ void (*ptp_tx_timestamp_get)(struct sxe_hw *hw, u32 *ts_sec, u32 *ts_ns);
+ void (*ptp_timestamp_mode_set)(struct sxe_hw *hw, bool is_l2,
+ u32 tsctl, u32 tses);
+ void (*ptp_rx_timestamp_clear)(struct sxe_hw *hw);
+ u64 (*ptp_rx_timestamp_get)(struct sxe_hw *hw);
+ bool (*ptp_is_rx_timestamp_valid)(struct sxe_hw *hw);
+ void (*ptp_timestamp_enable)(struct sxe_hw *hw);
+
+ void (*tx_pkt_buf_switch)(struct sxe_hw *hw, bool is_on);
void (*dcb_tc_rss_configure)(struct sxe_hw *hw, u16 rss_i);
- void (*tx_pkt_buf_size_configure)(struct sxe_hw *, u8);
+ void (*tx_pkt_buf_size_configure)(struct sxe_hw *hw, u8 num_pb);
- void (*rx_cap_switch_off)(struct sxe_hw *);
- u32 (*rx_pkt_buf_size_get)(struct sxe_hw *, u8);
+ void (*rx_cap_switch_off)(struct sxe_hw *hw);
+ u32 (*rx_pkt_buf_size_get)(struct sxe_hw *hw, u8 pb);
void (*rx_func_switch_on)(struct sxe_hw *hw);
- void (*tx_ring_disable)(struct sxe_hw *, u8, unsigned long);
- void (*rx_ring_disable)(struct sxe_hw *, u8, unsigned long);
+ void (*tx_ring_disable)(struct sxe_hw *hw, u8 reg_idx,
+ unsigned long timeout);
+ void (*rx_ring_disable)(struct sxe_hw *hw, u8 reg_idx,
+ unsigned long timeout);
u32 (*tx_dbu_fc_status_get)(struct sxe_hw *hw);
};
@@ -681,44 +693,50 @@ struct sxe_dbu_info {
struct sxe_dma_operations {
- void (*rx_dma_ctrl_init)(struct sxe_hw *, bool);
- void (*rx_ring_disable)(struct sxe_hw *, u8);
- void (*rx_ring_switch)(struct sxe_hw *, u8, bool);
- void (*rx_ring_switch_not_polling)(struct sxe_hw *, u8, bool);
- void (*rx_ring_desc_configure)(struct sxe_hw *, u32, u64, u8);
- void (*rx_desc_thresh_set)(struct sxe_hw *, u8);
- void (*rx_rcv_ctl_configure)(struct sxe_hw *, u8, u32, u32);
- void (*rx_lro_ctl_configure)(struct sxe_hw *, u8, u32);
- u32 (*rx_desc_ctrl_get)(struct sxe_hw *, u8);
- void (*rx_dma_lro_ctl_set)(struct sxe_hw *);
- void (*rx_drop_switch)(struct sxe_hw *, u8, bool);
+ void (*rx_dma_ctrl_init)(struct sxe_hw *hw);
+ void (*rx_ring_disable)(struct sxe_hw *hw, u8 ring_idx);
+ void (*rx_ring_switch)(struct sxe_hw *hw, u8 reg_idx, bool is_on);
+ void (*rx_ring_switch_not_polling)(struct sxe_hw *hw, u8 reg_idx,
+ bool is_on);
+ void (*rx_ring_desc_configure)(struct sxe_hw *hw, u32 desc_mem_len,
+ u64 desc_dma_addr, u8 reg_idx);
+ void (*rx_desc_thresh_set)(struct sxe_hw *hw, u8 reg_idx);
+ void (*rx_rcv_ctl_configure)(struct sxe_hw *hw, u8 reg_idx,
+ u32 header_buf_len, u32 pkg_buf_len);
+ void (*rx_lro_ctl_configure)(struct sxe_hw *hw, u8 reg_idx, u32 max_desc);
+ u32 (*rx_desc_ctrl_get)(struct sxe_hw *hw, u8 reg_idx);
+ void (*rx_dma_lro_ctl_set)(struct sxe_hw *hw);
+ void (*rx_drop_switch)(struct sxe_hw *hw, u8 idx, bool is_enable);
void (*rx_tph_update)(struct sxe_hw *hw, u8 ring_idx, u8 cpu);
- void (*tx_enable)(struct sxe_hw *);
- void (*tx_multi_ring_configure)(struct sxe_hw *, u8, u16, bool, u16);
- void (*tx_ring_desc_configure)(struct sxe_hw *, u32, u64, u8);
- void (*tx_desc_thresh_set)(struct sxe_hw *, u8, u32, u32, u32);
- void (*tx_ring_switch)(struct sxe_hw *, u8, bool);
- void (*tx_ring_switch_not_polling)(struct sxe_hw *, u8, bool);
- void (*tx_pkt_buf_thresh_configure)(struct sxe_hw *, u8, bool);
- u32 (*tx_desc_ctrl_get)(struct sxe_hw *, u8);
- void (*tx_ring_info_get)(struct sxe_hw *, u8, u32 *, u32 *);
- void (*tx_desc_wb_thresh_clear)(struct sxe_hw *, u8);
-
- void (*vlan_tag_strip_switch)(struct sxe_hw *, u16, bool);
- void (*tx_vlan_tag_set)(struct sxe_hw *, u16, u16, u32);
- void (*tx_vlan_tag_clear)(struct sxe_hw *, u32);
+ void (*tx_enable)(struct sxe_hw *hw);
+ void (*tx_multi_ring_configure)(struct sxe_hw *hw, u8 tcs, u16 pool_mask,
+ bool sriov_enable, u16 max_txq);
+ void (*tx_ring_desc_configure)(struct sxe_hw *hw, u32 desc_mem_len,
+ u64 desc_dma_addr, u8 reg_idx);
+ void (*tx_desc_thresh_set)(struct sxe_hw *hw, u8 reg_idx, u32 wb_thresh,
+ u32 host_thresh, u32 prefech_thresh);
+ void (*tx_ring_switch)(struct sxe_hw *hw, u8 reg_idx, bool is_on);
+ void (*tx_ring_switch_not_polling)(struct sxe_hw *hw, u8 reg_idx, bool is_on);
+ void (*tx_pkt_buf_thresh_configure)(struct sxe_hw *hw, u8 num_pb, bool dcb_enable);
+ u32 (*tx_desc_ctrl_get)(struct sxe_hw *hw, u8 reg_idx);
+ void (*tx_ring_info_get)(struct sxe_hw *hw, u8 idx, u32 *head, u32 *tail);
+ void (*tx_desc_wb_thresh_clear)(struct sxe_hw *hw, u8 reg_idx);
+
+ void (*vlan_tag_strip_switch)(struct sxe_hw *hw, u16 reg_index, bool is_enable);
+ void (*tx_vlan_tag_set)(struct sxe_hw *hw, u16 vid, u16 qos, u32 vf);
+ void (*tx_vlan_tag_clear)(struct sxe_hw *hw, u32 vf);
void (*tx_tph_update)(struct sxe_hw *hw, u8 ring_idx, u8 cpu);
void (*tph_switch)(struct sxe_hw *hw, bool is_enable);
void (*dcb_rx_bw_alloc_configure)(struct sxe_hw *hw,
- u16 *refill,
- u16 *max,
- u8 *bwg_id,
- u8 *prio_type,
- u8 *prio_tc,
- u8 max_priority);
+ u16 *refill,
+ u16 *max,
+ u8 *bwg_id,
+ u8 *prio_type,
+ u8 *prio_tc,
+ u8 max_priority);
void (*dcb_tx_desc_bw_alloc_configure)(struct sxe_hw *hw,
u16 *refill,
u16 *max,
@@ -766,7 +784,8 @@ struct sxe_dma_info {
struct sxe_sec_operations {
void (*ipsec_rx_ip_store)(struct sxe_hw *hw, __be32 *ip_addr, u8 ip_len, u8 ip_idx);
void (*ipsec_rx_spi_store)(struct sxe_hw *hw, __be32 spi, u8 ip_idx, u16 idx);
- void (*ipsec_rx_key_store)(struct sxe_hw *hw, u32 *key, u8 key_len, u32 salt, u32 mode, u16 idx);
+ void (*ipsec_rx_key_store)(struct sxe_hw *hw, u32 *key, u8 key_len,
+ u32 salt, u32 mode, u16 idx);
void (*ipsec_tx_key_store)(struct sxe_hw *hw, u32 *key, u8 key_len, u32 salt, u16 idx);
void (*ipsec_sec_data_stop)(struct sxe_hw *hw, bool is_linkup);
void (*ipsec_engine_start)(struct sxe_hw *hw, bool is_linkup);
@@ -780,12 +799,12 @@ struct sxe_sec_info {
};
struct sxe_stat_operations {
- void (*stats_clear)(struct sxe_hw *);
- void (*stats_get)(struct sxe_hw *, struct sxe_mac_stats *);
+ void (*stats_clear)(struct sxe_hw *hw);
+ void (*stats_get)(struct sxe_hw *hw, struct sxe_mac_stats *st);
u32 (*tx_packets_num_get)(struct sxe_hw *hw);
u32 (*unsecurity_packets_num_get)(struct sxe_hw *hw);
- u32 (*mac_stats_dump)(struct sxe_hw *, u32 *, u32);
+ u32 (*mac_stats_dump)(struct sxe_hw *hw, u32 *regs_buff, u32 buf_size);
u32 (*tx_dbu_to_mac_stats)(struct sxe_hw *hw);
};
@@ -807,20 +826,20 @@ struct sxe_mbx_operations {
};
struct sxe_mbx_stats {
- u32 send_msgs;
- u32 rcv_msgs;
+ u32 send_msgs;
+ u32 rcv_msgs;
- u32 reqs;
- u32 acks;
- u32 rsts;
+ u32 reqs;
+ u32 acks;
+ u32 rsts;
};
struct sxe_mbx_info {
- const struct sxe_mbx_operations *ops;
- struct sxe_mbx_stats stats;
- u32 retry;
- u32 interval;
- u32 msg_len;
+ const struct sxe_mbx_operations *ops;
+ struct sxe_mbx_stats stats;
+ u32 retry;
+ u32 interval;
+ u32 msg_len;
};
struct sxe_pcie_operations {
@@ -828,7 +847,7 @@ struct sxe_pcie_operations {
};
struct sxe_pcie_info {
- const struct sxe_pcie_operations *ops;
+ const struct sxe_pcie_operations *ops;
};
enum sxe_hw_state {
@@ -845,40 +864,41 @@ enum sxe_fc_mode {
};
struct sxe_fc_info {
- u32 high_water[MAX_TRAFFIC_CLASS];
- u32 low_water[MAX_TRAFFIC_CLASS];
- u16 pause_time;
- bool strict_ieee;
- bool disable_fc_autoneg;
- u16 send_xon;
- enum sxe_fc_mode current_mode;
- enum sxe_fc_mode requested_mode;
+ u32 high_water[MAX_TRAFFIC_CLASS];
+ u32 low_water[MAX_TRAFFIC_CLASS];
+ u16 pause_time;
+ bool strict_ieee;
+ bool disable_fc_autoneg;
+ u16 send_xon;
+ enum sxe_fc_mode current_mode;
+ enum sxe_fc_mode requested_mode;
};
struct sxe_fc_nego_mode {
- u32 adv_sym;
- u32 adv_asm;
- u32 lp_sym;
- u32 lp_asm;
+ u32 adv_sym;
+ u32 adv_asm;
+ u32 lp_sym;
+ u32 lp_asm;
};
struct sxe_hdc_operations {
- s32 (*pf_lock_get)(struct sxe_hw *, u32);
- void (*pf_lock_release)(struct sxe_hw *, u32);
- bool (*is_fw_over_set)(struct sxe_hw *);
- u32 (*fw_ack_header_rcv)(struct sxe_hw *);
- void (*packet_send_done)(struct sxe_hw *);
- void (*packet_header_send)(struct sxe_hw *, u32);
- void (*packet_data_dword_send)(struct sxe_hw *, u16, u32);
- u32 (*packet_data_dword_rcv)(struct sxe_hw *, u16);
- u32 (*fw_status_get)(struct sxe_hw *);
- void (*drv_status_set)(struct sxe_hw *, u32);
- u32 (*irq_event_get)(struct sxe_hw *);
- void (*irq_event_clear)(struct sxe_hw *, u32);
- void (*fw_ov_clear)(struct sxe_hw *);
- u32 (*channel_state_get)(struct sxe_hw *);
- void (*resource_clean)(struct sxe_hw *);
+ s32 (*pf_lock_get)(struct sxe_hw *hw, u32 trylock);
+ void (*pf_lock_release)(struct sxe_hw *hw, u32 retry_cnt);
+ bool (*is_fw_over_set)(struct sxe_hw *hw);
+ u32 (*fw_ack_header_rcv)(struct sxe_hw *hw);
+ void (*packet_send_done)(struct sxe_hw *hw);
+ void (*packet_header_send)(struct sxe_hw *hw, u32 value);
+ void (*packet_data_dword_send)(struct sxe_hw *hw,
+ u16 dword_index, u32 value);
+ u32 (*packet_data_dword_rcv)(struct sxe_hw *hw, u16 dword_index);
+ u32 (*fw_status_get)(struct sxe_hw *hw);
+ void (*drv_status_set)(struct sxe_hw *hw, u32 value);
+ u32 (*irq_event_get)(struct sxe_hw *hw);
+ void (*irq_event_clear)(struct sxe_hw *hw, u32 event);
+ void (*fw_ov_clear)(struct sxe_hw *hw);
+ u32 (*channel_state_get)(struct sxe_hw *hw);
+ void (*resource_clean)(struct sxe_hw *hw);
};
struct sxe_hdc_info {
@@ -901,29 +921,29 @@ struct sxe_phy_reg_info {
};
struct sxe_hw {
- u8 __iomem *reg_base_addr;
+ u8 __iomem *reg_base_addr;
void *adapter;
void *priv;
- unsigned long state;
+ unsigned long state;
void (*fault_handle)(void *priv);
u32 (*reg_read)(const volatile void *reg);
void (*reg_write)(u32 value, volatile void *reg);
- struct sxe_hw_setup setup;
- struct sxe_irq_info irq;
- struct sxe_mac_info mac;
- struct sxe_filter_info filter;
- struct sxe_dbu_info dbu;
- struct sxe_dma_info dma;
- struct sxe_sec_info sec;
- struct sxe_stat_info stat;
+ struct sxe_hw_setup setup;
+ struct sxe_irq_info irq;
+ struct sxe_mac_info mac;
+ struct sxe_filter_info filter;
+ struct sxe_dbu_info dbu;
+ struct sxe_dma_info dma;
+ struct sxe_sec_info sec;
+ struct sxe_stat_info stat;
struct sxe_fc_info fc;
- struct sxe_mbx_info mbx;
- struct sxe_pcie_info pcie;
- struct sxe_hdc_info hdc;
- struct sxe_phy_reg_info phy;
+ struct sxe_mbx_info mbx;
+ struct sxe_pcie_info pcie;
+ struct sxe_hdc_info hdc;
+ struct sxe_phy_reg_info phy;
};
u16 sxe_mac_reg_num_get(void);
@@ -951,7 +971,6 @@ static inline void sxe_hw_fault_handle_init(struct sxe_hw *hw,
hw->priv = priv;
hw->fault_handle = handle;
- return;
}
static inline void sxe_hw_reg_handle_init(struct sxe_hw *hw,
@@ -961,10 +980,11 @@ static inline void sxe_hw_reg_handle_init(struct sxe_hw *hw,
hw->reg_read = read;
hw->reg_write = write;
- return;
}
-#ifdef SXE_DPDK
+#ifdef SXE_DPDK
+
+void sxe_hw_crc_strip_config(struct sxe_hw *hw, bool keep_crc);
void sxe_hw_stats_seq_clean(struct sxe_hw *hw, struct sxe_mac_stats *stats);
@@ -1117,12 +1137,12 @@ void sxe_hw_rss_field_set(struct sxe_hw *hw, u32 rss_field);
void sxe_hw_rss_redir_tbl_set_all(struct sxe_hw *hw, u8 *redir_tbl);
-u32 sxe_hw_rss_redir_tbl_get_by_idx(struct sxe_hw *hw, u16);
+u32 sxe_hw_rss_redir_tbl_get_by_idx(struct sxe_hw *hw, u16 reg_idx);
void sxe_hw_rss_redir_tbl_set_by_idx(struct sxe_hw *hw,
u16 reg_idx, u32 value);
-void sxe_hw_rx_dma_ctrl_init(struct sxe_hw *hw, bool crc_strip_on);
+void sxe_hw_rx_dma_ctrl_init(struct sxe_hw *hw);
void sxe_hw_mac_max_frame_set(struct sxe_hw *hw, u32 max_frame);
@@ -1291,12 +1311,12 @@ void sxe_hw_dcb_tc_stats_configure(struct sxe_hw *hw,
u8 tc_count, bool vmdq_active);
void sxe_hw_dcb_rx_bw_alloc_configure(struct sxe_hw *hw,
- u16 *refill,
- u16 *max,
- u8 *bwg_id,
- u8 *prio_type,
- u8 *prio_tc,
- u8 max_priority);
+ u16 *refill,
+ u16 *max,
+ u8 *bwg_id,
+ u8 *prio_type,
+ u8 *prio_tc,
+ u8 max_priority);
void sxe_hw_dcb_tx_desc_bw_alloc_configure(struct sxe_hw *hw,
u16 *refill,
@@ -1411,12 +1431,12 @@ s32 sxe_hw_vlvf_slot_find(struct sxe_hw *hw, u32 vlan, bool vlvf_bypass);
u32 sxe_hw_vlan_pool_filter_read(struct sxe_hw *hw, u16 reg_index);
-void sxe_hw_mirror_vlan_set(struct sxe_hw *hw, u8 idx,u32 lsb, u32 msb);
+void sxe_hw_mirror_vlan_set(struct sxe_hw *hw, u8 idx, u32 lsb, u32 msb);
-void sxe_hw_mirror_virtual_pool_set(struct sxe_hw *hw, u8 idx,u32 lsb, u32 msb);
+void sxe_hw_mirror_virtual_pool_set(struct sxe_hw *hw, u8 idx, u32 lsb, u32 msb);
void sxe_hw_mirror_ctl_set(struct sxe_hw *hw, u8 rule_id,
- u8 mirror_type, u8 dst_pool, bool on);
+ u8 mirror_type, u8 dst_pool, bool on);
void sxe_hw_mirror_rule_clear(struct sxe_hw *hw, u8 rule_id);
@@ -1470,7 +1490,7 @@ void sxe_hw_syn_filter_add(struct sxe_hw *hw, u16 queue, u8 priority);
void sxe_hw_syn_filter_del(struct sxe_hw *hw);
void sxe_hw_rss_key_set_all(struct sxe_hw *hw, u32 *rss_key);
-#endif
+#endif
void sxe_hw_fnav_enable(struct sxe_hw *hw, u32 fnavctrl);
@@ -1493,7 +1513,7 @@ void sxe_hw_rss_redir_tbl_reg_write(struct sxe_hw *hw,
u32 sxe_hw_fnav_port_mask_get(__be16 src_port_mask, __be16 dst_port_mask);
s32 sxe_hw_fnav_specific_rule_mask_set(struct sxe_hw *hw,
- union sxe_fnav_rule_info *input_mask);
+ union sxe_fnav_rule_info *input_mask);
s32 sxe_hw_vlan_filter_configure(struct sxe_hw *hw,
u32 vid, u32 pool,
@@ -1501,5 +1521,5 @@ s32 sxe_hw_vlan_filter_configure(struct sxe_hw *hw,
void sxe_hw_ptp_systime_init(struct sxe_hw *hw);
-#endif
+#endif
#endif
@@ -11,9 +11,9 @@
#include "sxe_types.h"
-#define LOG_FILE_NAME_LEN 256
-#define LOG_FILE_PATH "/var/log/"
-#define LOG_FILE_PREFIX "sxepmd.log"
+#define LOG_FILE_NAME_LEN 256
+#define LOG_FILE_PATH "/var/log/"
+#define LOG_FILE_PREFIX "sxepmd.log"
extern s32 sxe_log_init;
extern s32 sxe_log_rx;
@@ -36,9 +36,9 @@ extern s32 sxe_log_hw;
gettimeofday(&tv, NULL); \
td = localtime(&tv.tv_sec); \
strftime(log_time, sizeof(log_time), "%Y-%m-%d-%H:%M:%S", td); \
- } while(0)
+ } while (0)
-#define filename_printf(x) strrchr((x),'/')?strrchr((x),'/')+1:(x)
+#define filename_printf(x) (strrchr((x), '/')?strrchr((x), '/')+1:(x))
#ifdef SXE_DPDK_DEBUG
#define PMD_LOG_DEBUG(logtype, fmt, ...) \
@@ -50,7 +50,7 @@ extern s32 sxe_log_hw;
"DEBUG", log_time, pthread_self(), \
filename_printf(__FILE__), __LINE__, \
__func__, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define PMD_LOG_INFO(logtype, fmt, ...) \
do { \
@@ -61,7 +61,7 @@ extern s32 sxe_log_hw;
"INFO", log_time, pthread_self(), \
filename_printf(__FILE__), __LINE__, \
__func__, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define PMD_LOG_NOTICE(logtype, fmt, ...) \
do { \
@@ -72,7 +72,7 @@ extern s32 sxe_log_hw;
"NOTICE", log_time, pthread_self(), \
filename_printf(__FILE__), __LINE__, \
__func__, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define PMD_LOG_WARN(logtype, fmt, ...) \
do { \
@@ -83,7 +83,7 @@ extern s32 sxe_log_hw;
"WARN", log_time, pthread_self(), \
filename_printf(__FILE__), __LINE__, \
__func__, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define PMD_LOG_ERR(logtype, fmt, ...) \
do { \
@@ -94,7 +94,7 @@ extern s32 sxe_log_hw;
"ERR", log_time, pthread_self(), \
filename_printf(__FILE__), __LINE__, \
__func__, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define PMD_LOG_CRIT(logtype, fmt, ...) \
do { \
@@ -105,7 +105,7 @@ extern s32 sxe_log_hw;
"CRIT", log_time, pthread_self(), \
filename_printf(__FILE__), __LINE__, \
__func__, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define PMD_LOG_ALERT(logtype, fmt, ...) \
do { \
@@ -116,7 +116,7 @@ extern s32 sxe_log_hw;
"ALERT", log_time, pthread_self(), \
filename_printf(__FILE__), __LINE__, \
__func__, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define PMD_LOG_EMERG(logtype, fmt, ...) \
do { \
@@ -127,56 +127,40 @@ extern s32 sxe_log_hw;
"EMERG", log_time, pthread_self(), \
filename_printf(__FILE__), __LINE__, \
__func__, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#else
#define PMD_LOG_DEBUG(logtype, fmt, ...) \
- do { \
rte_log(RTE_LOG_DEBUG, logtype, "%s(): " \
- fmt "\n", __func__, ##__VA_ARGS__); \
- } while(0)
+ fmt "\n", __func__, ##__VA_ARGS__)
#define PMD_LOG_INFO(logtype, fmt, ...) \
- do { \
rte_log(RTE_LOG_INFO, logtype, "%s(): " \
- fmt "\n", __func__, ##__VA_ARGS__); \
- } while(0)
+ fmt "\n", __func__, ##__VA_ARGS__)
#define PMD_LOG_NOTICE(logtype, fmt, ...) \
- do { \
rte_log(RTE_LOG_NOTICE, logtype, "%s(): " \
- fmt "\n", __func__, ##__VA_ARGS__); \
- } while(0)
+ fmt "\n", __func__, ##__VA_ARGS__)
#define PMD_LOG_WARN(logtype, fmt, ...) \
- do { \
rte_log(RTE_LOG_WARNING, logtype, "%s(): " \
- fmt "\n", __func__, ##__VA_ARGS__); \
- } while(0)
+ fmt "\n", __func__, ##__VA_ARGS__)
#define PMD_LOG_ERR(logtype, fmt, ...) \
- do { \
rte_log(RTE_LOG_ERR, logtype, "%s(): " \
- fmt "\n", __func__, ##__VA_ARGS__); \
- } while(0)
+ fmt "\n", __func__, ##__VA_ARGS__)
#define PMD_LOG_CRIT(logtype, fmt, ...) \
- do { \
rte_log(RTE_LOG_CRIT, logtype, "%s(): " \
- fmt "\n", __func__, ##__VA_ARGS__); \
- } while(0)
+ fmt "\n", __func__, ##__VA_ARGS__)
#define PMD_LOG_ALERT(logtype, fmt, ...) \
- do { \
rte_log(RTE_LOG_ALERT, logtype, "%s(): " \
- fmt "\n", __func__, ##__VA_ARGS__); \
- } while(0)
+ fmt "\n", __func__, ##__VA_ARGS__)
#define PMD_LOG_EMERG(logtype, fmt, ...) \
- do { \
rte_log(RTE_LOG_EMERG, logtype, "%s(): " \
- fmt "\n", __func__, ##__VA_ARGS__); \
- } while(0)
+ fmt "\n", __func__, ##__VA_ARGS__)
#endif
@@ -184,54 +168,38 @@ extern s32 sxe_log_hw;
#ifdef SXE_DPDK_DEBUG
#define LOG_DEBUG(fmt, ...) \
- do { \
- PMD_LOG_DEBUG(DRV, fmt, ##__VA_ARGS__); \
- } while(0)
+ PMD_LOG_DEBUG(DRV, fmt, ##__VA_ARGS__)
#define LOG_INFO(fmt, ...) \
- do { \
- PMD_LOG_INFO(DRV, fmt, ##__VA_ARGS__); \
- } while(0)
+ PMD_LOG_INFO(DRV, fmt, ##__VA_ARGS__)
#define LOG_WARN(fmt, ...) \
- do { \
- PMD_LOG_WARN(DRV, fmt, ##__VA_ARGS__); \
- } while(0)
+ PMD_LOG_WARN(DRV, fmt, ##__VA_ARGS__)
#define LOG_ERROR(fmt, ...) \
- do { \
- PMD_LOG_ERR(DRV, fmt, ##__VA_ARGS__); \
- } while(0)
+ PMD_LOG_ERR(DRV, fmt, ##__VA_ARGS__)
#define LOG_DEBUG_BDF(fmt, ...) \
- do { \
- PMD_LOG_DEBUG(HW, "[%s]" fmt, adapter->name, ##__VA_ARGS__); \
- } while(0)
+ PMD_LOG_DEBUG(HW, "[%s]" fmt, adapter->name, ##__VA_ARGS__)
#define LOG_INFO_BDF(fmt, ...) \
- do { \
- PMD_LOG_INFO(HW, "[%s]" fmt, adapter->name, ##__VA_ARGS__); \
- } while(0)
+ PMD_LOG_INFO(HW, "[%s]" fmt, adapter->name, ##__VA_ARGS__)
#define LOG_WARN_BDF(fmt, ...) \
- do { \
- PMD_LOG_WARN(HW, "[%s]" fmt, adapter->name, ##__VA_ARGS__); \
- } while(0)
+ PMD_LOG_WARN(HW, "[%s]" fmt, adapter->name, ##__VA_ARGS__)
#define LOG_ERROR_BDF(fmt, ...) \
- do { \
- PMD_LOG_ERR(HW, "[%s]" fmt, adapter->name, ##__VA_ARGS__); \
- } while(0)
+ PMD_LOG_ERR(HW, "[%s]" fmt, adapter->name, ##__VA_ARGS__)
#else
#define LOG_DEBUG(fmt, ...)
#define LOG_INFO(fmt, ...)
#define LOG_WARN(fmt, ...)
#define LOG_ERROR(fmt, ...)
-#define LOG_DEBUG_BDF(fmt, ...) do { UNUSED(adapter); } while(0)
-#define LOG_INFO_BDF(fmt, ...) do { UNUSED(adapter); } while(0)
-#define LOG_WARN_BDF(fmt, ...) do { UNUSED(adapter); } while(0)
-#define LOG_ERROR_BDF(fmt, ...) do { UNUSED(adapter); } while(0)
+#define LOG_DEBUG_BDF(fmt, ...) UNUSED(adapter)
+#define LOG_INFO_BDF(fmt, ...) UNUSED(adapter)
+#define LOG_WARN_BDF(fmt, ...) UNUSED(adapter)
+#define LOG_ERROR_BDF(fmt, ...) UNUSED(adapter)
#endif
#ifdef SXE_DPDK_DEBUG
@@ -239,61 +207,61 @@ extern s32 sxe_log_hw;
do { \
UNUSED(adapter); \
LOG_DEBUG_BDF(fmt, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define LOG_DEV_INFO(fmt, ...) \
do { \
UNUSED(adapter); \
LOG_INFO_BDF(fmt, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define LOG_DEV_WARN(fmt, ...) \
do { \
UNUSED(adapter); \
LOG_WARN_BDF(fmt, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define LOG_DEV_ERR(fmt, ...) \
do { \
UNUSED(adapter); \
LOG_ERROR_BDF(fmt, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define LOG_MSG_DEBUG(msglvl, fmt, ...) \
do { \
UNUSED(adapter); \
LOG_DEBUG_BDF(fmt, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define LOG_MSG_INFO(msglvl, fmt, ...) \
do { \
UNUSED(adapter); \
LOG_INFO_BDF(fmt, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define LOG_MSG_WARN(msglvl, fmt, ...) \
do { \
UNUSED(adapter); \
LOG_WARN_BDF(fmt, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#define LOG_MSG_ERR(msglvl, fmt, ...) \
do { \
UNUSED(adapter); \
LOG_ERROR_BDF(fmt, ##__VA_ARGS__); \
- } while(0)
+ } while (0)
#else
-#define LOG_DEV_DEBUG(fmt, ...) do { UNUSED(adapter); } while(0)
-#define LOG_DEV_INFO(fmt, ...) do { UNUSED(adapter); } while(0)
-#define LOG_DEV_WARN(fmt, ...) do { UNUSED(adapter); } while(0)
-#define LOG_DEV_ERR(fmt, ...) do { UNUSED(adapter); } while(0)
-#define LOG_MSG_DEBUG(msglvl, fmt, ...) do { UNUSED(adapter); } while(0)
-#define LOG_MSG_INFO(msglvl, fmt, ...) do { UNUSED(adapter); } while(0)
-#define LOG_MSG_WARN(msglvl, fmt, ...) do { UNUSED(adapter); } while(0)
-#define LOG_MSG_ERR(msglvl, fmt, ...) do { UNUSED(adapter); } while(0)
+#define LOG_DEV_DEBUG(fmt, ...) UNUSED(adapter)
+#define LOG_DEV_INFO(fmt, ...) UNUSED(adapter)
+#define LOG_DEV_WARN(fmt, ...) UNUSED(adapter)
+#define LOG_DEV_ERR(fmt, ...) UNUSED(adapter)
+#define LOG_MSG_DEBUG(msglvl, fmt, ...) UNUSED(adapter)
+#define LOG_MSG_INFO(msglvl, fmt, ...) UNUSED(adapter)
+#define LOG_MSG_WARN(msglvl, fmt, ...) UNUSED(adapter)
+#define LOG_MSG_ERR(msglvl, fmt, ...) UNUSED(adapter)
#endif
void sxe_log_stream_init(void);
-#endif
+#endif
@@ -30,18 +30,17 @@ u64 __sxe_rx_port_offload_capa_get(struct rte_eth_dev *dev)
rx_offload_capa = RTE_ETH_RX_OFFLOAD_IPV4_CKSUM |
RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
RTE_ETH_RX_OFFLOAD_TCP_CKSUM |
- RTE_ETH_RX_OFFLOAD_KEEP_CRC |
+ RTE_ETH_RX_OFFLOAD_KEEP_CRC |
#ifdef DEV_RX_JUMBO_FRAME
DEV_RX_OFFLOAD_JUMBO_FRAME |
#endif
RTE_ETH_RX_OFFLOAD_VLAN_FILTER |
- RTE_ETH_RX_OFFLOAD_VLAN_EXTEND |
+ RTE_ETH_RX_OFFLOAD_VLAN_EXTEND |
RTE_ETH_RX_OFFLOAD_SCATTER |
RTE_ETH_RX_OFFLOAD_RSS_HASH;
- if (!RTE_ETH_DEV_SRIOV(dev).active) {
+ if (!RTE_ETH_DEV_SRIOV(dev).active)
rx_offload_capa |= RTE_ETH_RX_OFFLOAD_TCP_LRO;
- }
return rx_offload_capa;
}
@@ -57,7 +56,7 @@ u64 __sxe_tx_port_offload_capa_get(struct rte_eth_dev *dev)
RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
RTE_ETH_TX_OFFLOAD_TCP_CKSUM |
RTE_ETH_TX_OFFLOAD_SCTP_CKSUM |
- RTE_ETH_TX_OFFLOAD_TCP_TSO |
+ RTE_ETH_TX_OFFLOAD_TCP_TSO |
RTE_ETH_TX_OFFLOAD_MULTI_SEGS |
RTE_ETH_TX_OFFLOAD_MACSEC_INSERT;
@@ -46,7 +46,6 @@ static void sxe_tx_queues_clear(struct rte_eth_dev *dev)
}
}
- return;
}
static void sxe_rx_queues_clear(struct rte_eth_dev *dev, bool rx_batch_alloc_allowed)
@@ -62,7 +61,6 @@ static void sxe_rx_queues_clear(struct rte_eth_dev *dev, bool rx_batch_alloc_all
}
}
- return;
}
s32 __rte_cold __sxe_rx_queue_setup(struct rx_setup *rx_setup, bool is_vf)
@@ -90,7 +88,7 @@ s32 __rte_cold __sxe_rx_queue_setup(struct rx_setup *rx_setup, bool is_vf)
if (desc_num % SXE_RX_DESC_RING_ALIGN != 0 ||
(desc_num > SXE_MAX_RING_DESC) ||
(desc_num < SXE_MIN_RING_DESC)) {
- PMD_LOG_ERR(INIT, "desc_num %u error",desc_num);
+ PMD_LOG_ERR(INIT, "desc_num %u error", desc_num);
ret = -EINVAL;
goto l_end;
}
@@ -115,11 +113,10 @@ s32 __rte_cold __sxe_rx_queue_setup(struct rx_setup *rx_setup, bool is_vf)
rxq->reg_idx = (u16)((RTE_ETH_DEV_SRIOV(dev).active == 0) ?
queue_idx : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + queue_idx);
rxq->port_id = dev->data->port_id;
- if (dev->data->dev_conf.rxmode.offloads & RTE_ETH_RX_OFFLOAD_KEEP_CRC) {
+ if (dev->data->dev_conf.rxmode.offloads & RTE_ETH_RX_OFFLOAD_KEEP_CRC)
rxq->crc_len = RTE_ETHER_CRC_LEN;
- } else {
+ else
rxq->crc_len = 0;
- }
rxq->drop_en = rx_conf->rx_drop_en;
rxq->deferred_start = rx_conf->rx_deferred_start;
@@ -140,13 +137,12 @@ s32 __rte_cold __sxe_rx_queue_setup(struct rx_setup *rx_setup, bool is_vf)
memset(rx_mz->addr, 0, SXE_RX_RING_SIZE);
- if (is_vf) {
+ if (is_vf)
rxq->rdt_reg_addr = (volatile u32 *)(rx_setup->reg_base_addr +
SXE_VFRDT(rxq->reg_idx));
- } else {
+ else
rxq->rdt_reg_addr = (volatile u32 *)(rx_setup->reg_base_addr +
SXE_RDT(rxq->reg_idx));
- }
rxq->base_addr = rx_mz->iova;
@@ -160,9 +156,8 @@ s32 __rte_cold __sxe_rx_queue_setup(struct rx_setup *rx_setup, bool is_vf)
}
len = desc_num;
- if (*rx_setup->rx_batch_alloc_allowed) {
+ if (*rx_setup->rx_batch_alloc_allowed)
len += RTE_PMD_SXE_MAX_RX_BURST;
- }
rxq->buffer_ring = rte_zmalloc_socket("rxq->sw_ring",
sizeof(struct sxe_rx_buffer) * len,
@@ -186,21 +181,21 @@ s32 __rte_cold __sxe_rx_queue_setup(struct rx_setup *rx_setup, bool is_vf)
}
PMD_LOG_DEBUG(INIT, "buffer_ring=%p sc_buffer_ring=%p desc_ring=%p "
- "dma_addr=0x%"SXE_PRIX64,
- rxq->buffer_ring, rxq->sc_buffer_ring, rxq->desc_ring,
- rxq->base_addr);
+ "dma_addr=0x%"SXE_PRIX64,
+ rxq->buffer_ring, rxq->sc_buffer_ring, rxq->desc_ring,
+ rxq->base_addr);
#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_SIMD
if (!rte_is_power_of_2(desc_num)) {
PMD_LOG_DEBUG(INIT, "queue[%d] doesn't meet Vector Rx "
- "preconditions - canceling the feature for "
- "the whole port[%d]",
- rxq->queue_id, rxq->port_id);
- if (is_vf) {
+ "preconditions - canceling the feature for "
+ "the whole port[%d]",
+ rxq->queue_id, rxq->port_id);
+ if (is_vf)
vf_adapter->rx_vec_allowed = false;
- } else {
+ else
pf_adapter->rx_vec_allowed = false;
- }
+
} else {
sxe_rxq_vec_setup(rxq);
}
@@ -245,29 +240,29 @@ int __rte_cold __sxe_tx_queue_setup(struct tx_setup *tx_setup, bool is_vf)
goto l_end;
}
- txq->ops = sxe_tx_default_ops_get();
- txq->ring_depth = ring_depth;
- txq->queue_idx = tx_queue_id;
- txq->port_id = dev->data->port_id;
- txq->pthresh = tx_conf->tx_thresh.pthresh;
- txq->hthresh = tx_conf->tx_thresh.hthresh;
- txq->wthresh = tx_conf->tx_thresh.wthresh;
- txq->rs_thresh = rs_thresh;
- txq->free_thresh = free_thresh;
+ txq->ops = sxe_tx_default_ops_get();
+ txq->ring_depth = ring_depth;
+ txq->queue_idx = tx_queue_id;
+ txq->port_id = dev->data->port_id;
+ txq->pthresh = tx_conf->tx_thresh.pthresh;
+ txq->hthresh = tx_conf->tx_thresh.hthresh;
+ txq->wthresh = tx_conf->tx_thresh.wthresh;
+ txq->rs_thresh = rs_thresh;
+ txq->free_thresh = free_thresh;
txq->tx_deferred_start = tx_conf->tx_deferred_start;
- txq->reg_idx = (u16)((RTE_ETH_DEV_SRIOV(dev).active == 0) ?
+ txq->reg_idx = (u16)((RTE_ETH_DEV_SRIOV(dev).active == 0) ?
tx_queue_id : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + tx_queue_id);
- txq->offloads = tx_conf->offloads | dev->data->dev_conf.txmode.offloads;
+ txq->offloads = tx_conf->offloads | dev->data->dev_conf.txmode.offloads;
- if (is_vf) {
- txq->tdt_reg_addr = (volatile u32 *)(tx_setup->reg_base_addr + SXE_VFTDT(txq->reg_idx));
- } else {
- txq->tdt_reg_addr = (u32 *)(tx_setup->reg_base_addr + SXE_TDT(txq->reg_idx));
- }
+ if (is_vf)
+ txq->tdt_reg_addr = (volatile u32 *)(tx_setup->reg_base_addr +
+ SXE_VFTDT(txq->reg_idx));
+ else
+ txq->tdt_reg_addr = (u32 *)(tx_setup->reg_base_addr +
+ SXE_TDT(txq->reg_idx));
PMD_LOG_INFO(INIT, "buffer_ring=%p desc_ring=%p dma_addr=0x%"PRIx64,
- txq->buffer_ring, txq->desc_ring,
- (long unsigned int)txq->base_addr);
+ txq->buffer_ring, txq->desc_ring, (u64)txq->base_addr);
sxe_tx_function_set(dev, txq);
txq->ops->init(txq);
@@ -294,7 +289,6 @@ void __sxe_rx_queue_info_get(struct rte_eth_dev *dev, u16 queue_id,
qinfo->conf.rx_deferred_start = rxq->deferred_start;
qinfo->conf.offloads = rxq->offloads;
- return;
}
void __sxe_tx_queue_info_get(struct rte_eth_dev *dev, u16 queue_id,
@@ -313,23 +307,22 @@ void __sxe_tx_queue_info_get(struct rte_eth_dev *dev, u16 queue_id,
q_info->conf.offloads = txq->offloads;
q_info->conf.tx_deferred_start = txq->tx_deferred_start;
- return;
}
s32 __sxe_tx_done_cleanup(void *tx_queue, u32 free_cnt)
{
int ret;
struct sxe_tx_queue *txq = (struct sxe_tx_queue *)tx_queue;
- if (txq->offloads == 0 && \
+ if (txq->offloads == 0 &&
txq->rs_thresh >= RTE_PMD_SXE_MAX_TX_BURST) {
#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_SIMD
if (txq->rs_thresh <= RTE_SXE_MAX_TX_FREE_BUF_SZ &&
#ifndef DPDK_19_11_6
- rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_128 &&
+ rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_128 &&
#endif
- (rte_eal_process_type() != RTE_PROC_PRIMARY ||
- txq->buffer_ring_vec != NULL)) {
- ret = sxe_tx_done_cleanup_vec(txq, free_cnt);
+ (rte_eal_process_type() != RTE_PROC_PRIMARY ||
+ txq->buffer_ring_vec != NULL)) {
+ ret = sxe_tx_done_cleanup_vec(txq, free_cnt);
} else{
ret = sxe_tx_done_cleanup_simple(txq, free_cnt);
}
@@ -357,7 +350,7 @@ s32 __rte_cold __sxe_rx_queue_mbufs_alloc(struct sxe_rx_queue *rxq)
if (mbuf == NULL) {
PMD_LOG_ERR(DRV, "rx mbuf alloc failed queue_id=%u",
- (unsigned) rxq->queue_id);
+ (u16)rxq->queue_id);
ret = -ENOMEM;
goto l_end;
}
@@ -386,7 +379,6 @@ void __rte_cold __sxe_rx_queue_free(struct sxe_rx_queue *rxq)
rte_memzone_free(rxq->mz);
rte_free(rxq);
}
- return;
}
void __rte_cold __sxe_tx_queue_free(struct sxe_tx_queue *txq)
@@ -398,7 +390,6 @@ void __rte_cold __sxe_tx_queue_free(struct sxe_tx_queue *txq)
rte_free(txq);
}
- return;
}
void __rte_cold __sxe_txrx_queues_clear(struct rte_eth_dev *dev, bool rx_batch_alloc_allowed)
@@ -409,12 +400,11 @@ void __rte_cold __sxe_txrx_queues_clear(struct rte_eth_dev *dev, bool rx_batch_a
sxe_rx_queues_clear(dev, rx_batch_alloc_allowed);
- return;
}
void __sxe_queues_free(struct rte_eth_dev *dev)
{
- unsigned i;
+ unsigned int i;
PMD_INIT_FUNC_TRACE();
@@ -430,10 +420,10 @@ void __sxe_queues_free(struct rte_eth_dev *dev)
}
dev->data->nb_tx_queues = 0;
- return;
}
-void __sxe_secondary_proc_init(struct rte_eth_dev *eth_dev, bool rx_batch_alloc_allowed, bool *rx_vec_allowed)
+void __sxe_secondary_proc_init(struct rte_eth_dev *eth_dev,
+ bool rx_batch_alloc_allowed, bool *rx_vec_allowed)
{
struct sxe_tx_queue *txq;
if (eth_dev->data->tx_queues) {
@@ -441,10 +431,9 @@ void __sxe_secondary_proc_init(struct rte_eth_dev *eth_dev, bool rx_batch_alloc_
sxe_tx_function_set(eth_dev, txq);
} else {
PMD_LOG_NOTICE(INIT, "No TX queues configured yet. "
- "Using default TX function.");
+ "Using default TX function.");
}
sxe_rx_function_set(eth_dev, rx_batch_alloc_allowed, rx_vec_allowed);
- return;
}
@@ -15,9 +15,9 @@
#define RTE_PMD_SXE_MAX_RX_BURST 32
enum sxe_ctxt_num {
- SXE_CTXT_DESC_0 = 0,
- SXE_CTXT_DESC_1 = 1,
- SXE_CTXT_DESC_NUM = 2,
+ SXE_CTXT_DESC_0 = 0,
+ SXE_CTXT_DESC_1 = 1,
+ SXE_CTXT_DESC_NUM = 2,
};
struct rx_setup {
@@ -42,7 +42,7 @@ struct tx_setup {
union sxe_tx_data_desc {
struct {
- __le64 buffer_addr;
+ __le64 buffer_addr;
__le32 cmd_type_len;
__le32 olinfo_status;
} read;
@@ -63,142 +63,142 @@ struct sxe_rx_queue_stats {
union sxe_rx_data_desc {
struct {
- __le64 pkt_addr;
- __le64 hdr_addr;
+ __le64 pkt_addr;
+ __le64 hdr_addr;
} read;
struct {
struct {
union {
__le32 data;
struct {
- __le16 pkt_info;
- __le16 hdr_info;
+ __le16 pkt_info;
+ __le16 hdr_info;
} hs_rss;
} lo_dword;
union {
- __le32 rss;
+ __le32 rss;
struct {
- __le16 ip_id;
- __le16 csum;
+ __le16 ip_id;
+ __le16 csum;
} csum_ip;
} hi_dword;
} lower;
struct {
- __le32 status_error;
- __le16 length;
- __le16 vlan;
+ __le32 status_error;
+ __le16 length;
+ __le16 vlan;
} upper;
} wb;
- };
+};
struct sxe_tx_buffer {
- struct rte_mbuf *mbuf;
- u16 next_id;
- u16 last_id;
+ struct rte_mbuf *mbuf;
+ u16 next_id;
+ u16 last_id;
};
#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_SIMD
struct sxe_tx_buffer_vec {
- struct rte_mbuf *mbuf;
+ struct rte_mbuf *mbuf;
};
#endif
union sxe_tx_offload {
u64 data[2];
struct {
- u64 l2_len:7;
- u64 l3_len:9;
- u64 l4_len:8;
- u64 tso_segsz:16;
- u64 vlan_tci:16;
-
- u64 outer_l3_len:8;
- u64 outer_l2_len:8;
+ u64 l2_len:7;
+ u64 l3_len:9;
+ u64 l4_len:8;
+ u64 tso_segsz:16;
+ u64 vlan_tci:16;
+
+ u64 outer_l3_len:8;
+ u64 outer_l2_len:8;
};
};
struct sxe_ctxt_info {
- u64 flags;
+ u64 flags;
union sxe_tx_offload tx_offload;
union sxe_tx_offload tx_offload_mask;
};
struct sxe_tx_queue {
volatile union sxe_tx_data_desc *desc_ring;
- u64 base_addr;
+ u64 base_addr;
#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_SIMD
union {
- struct sxe_tx_buffer *buffer_ring;
- struct sxe_tx_buffer_vec *buffer_ring_vec;
+ struct sxe_tx_buffer *buffer_ring;
+ struct sxe_tx_buffer_vec *buffer_ring_vec;
};
#else
- struct sxe_tx_buffer *buffer_ring;
+ struct sxe_tx_buffer *buffer_ring;
#endif
- volatile u32 *tdt_reg_addr;
- u16 ring_depth;
- u16 next_to_use;
- u16 free_thresh;
-
- u16 rs_thresh;
-
- u16 desc_used_num;
- u16 next_to_clean;
- u16 desc_free_num;
- u16 next_dd;
- u16 next_rs;
- u16 queue_idx;
- u16 reg_idx;
- u16 port_id;
- u8 pthresh;
- u8 hthresh;
-
- u8 wthresh;
- u64 offloads;
- u32 ctx_curr;
- struct sxe_ctxt_info ctx_cache[SXE_CTXT_DESC_NUM];
- const struct sxe_txq_ops *ops;
- u8 tx_deferred_start;
+ volatile u32 *tdt_reg_addr;
+ u16 ring_depth;
+ u16 next_to_use;
+ u16 free_thresh;
+
+ u16 rs_thresh;
+
+ u16 desc_used_num;
+ u16 next_to_clean;
+ u16 desc_free_num;
+ u16 next_dd;
+ u16 next_rs;
+ u16 queue_idx;
+ u16 reg_idx;
+ u16 port_id;
+ u8 pthresh;
+ u8 hthresh;
+
+ u8 wthresh;
+ u64 offloads;
+ u32 ctx_curr;
+ struct sxe_ctxt_info ctx_cache[SXE_CTXT_DESC_NUM];
+ const struct sxe_txq_ops *ops;
+ u8 tx_deferred_start;
const struct rte_memzone *mz;
};
struct sxe_rx_queue {
- struct rte_mempool *mb_pool;
- volatile union sxe_rx_data_desc *desc_ring;
- u64 base_addr;
- volatile u32 *rdt_reg_addr;
- struct sxe_rx_buffer *buffer_ring;
- struct sxe_rx_buffer *sc_buffer_ring;
+ struct rte_mempool *mb_pool;
+ volatile union sxe_rx_data_desc *desc_ring;
+ u64 base_addr;
+ volatile u32 *rdt_reg_addr;
+ struct sxe_rx_buffer *buffer_ring;
+ struct sxe_rx_buffer *sc_buffer_ring;
#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_SIMD
- struct rte_mbuf *pkt_first_seg;
- struct rte_mbuf *pkt_last_seg;
- u64 mbuf_init_value;
- u8 is_using_sse;
+ struct rte_mbuf *pkt_first_seg;
+ struct rte_mbuf *pkt_last_seg;
+ u64 mbuf_init_value;
+ u8 is_using_sse;
#if defined(RTE_ARCH_X86) || defined(RTE_ARCH_ARM)
- u16 realloc_num;
- u16 realloc_start;
+ u16 realloc_num;
+ u16 realloc_start;
#endif
#endif
- u16 ring_depth;
- u16 processing_idx;
- u16 hold_num;
- u16 completed_pkts_num;
- u16 next_ret_pkg;
- u16 batch_alloc_trigger;
-
- u16 batch_alloc_size;
- u16 queue_id;
- u16 reg_idx;
- u16 pkt_type_mask;
- u16 port_id;
- u8 crc_len;
- u8 drop_en;
- u8 deferred_start;
- u64 vlan_flags;
- u64 offloads;
- struct rte_mbuf fake_mbuf;
+ u16 ring_depth;
+ u16 processing_idx;
+ u16 hold_num;
+ u16 completed_pkts_num;
+ u16 next_ret_pkg;
+ u16 batch_alloc_trigger;
+
+ u16 batch_alloc_size;
+ u16 queue_id;
+ u16 reg_idx;
+ u16 pkt_type_mask;
+ u16 port_id;
+ u8 crc_len;
+ u8 drop_en;
+ u8 deferred_start;
+ u64 vlan_flags;
+ u64 offloads;
+ struct rte_mbuf fake_mbuf;
struct rte_mbuf *completed_ring[RTE_PMD_SXE_MAX_RX_BURST * 2];
const struct rte_memzone *mz;
- struct sxe_rx_queue_stats rx_stats;
+ struct sxe_rx_queue_stats rx_stats;
};
struct sxe_txq_ops {
@@ -231,6 +231,7 @@ void __rte_cold __sxe_txrx_queues_clear(struct rte_eth_dev *dev, bool rx_batch_a
void __sxe_queues_free(struct rte_eth_dev *dev);
-void __sxe_secondary_proc_init(struct rte_eth_dev *eth_dev, bool rx_batch_alloc_allowed, bool *rx_vec_allowed);
+void __sxe_secondary_proc_init(struct rte_eth_dev *eth_dev,
+ bool rx_batch_alloc_allowed, bool *rx_vec_allowed);
#endif
@@ -39,23 +39,23 @@ static inline void sxe_rx_resource_prefetch(u16 next_idx,
rte_sxe_prefetch(&buf_ring[next_idx]);
}
- return;
}
-void __rte_cold __sxe_rx_function_set(struct rte_eth_dev *dev, bool rx_batch_alloc_allowed, bool *rx_vec_allowed)
+void __rte_cold __sxe_rx_function_set(struct rte_eth_dev *dev,
+ bool rx_batch_alloc_allowed, bool *rx_vec_allowed)
{
#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_SIMD
u16 i, is_using_sse;
if (sxe_rx_vec_condition_check(dev) ||
- !rx_batch_alloc_allowed
+ !rx_batch_alloc_allowed
#ifndef DPDK_19_11_6
|| rte_vect_get_max_simd_bitwidth() < RTE_VECT_SIMD_128
#endif
) {
PMD_LOG_DEBUG(INIT, "Port[%d] doesn't meet Vector Rx "
- "preconditions", dev->data->port_id);
+ "preconditions", dev->data->port_id);
*rx_vec_allowed = false;
}
#else
@@ -76,24 +76,31 @@ void __rte_cold __sxe_rx_function_set(struct rte_eth_dev *dev, bool rx_batch_all
#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_SIMD
if (*rx_vec_allowed) {
PMD_LOG_DEBUG(INIT, "Using Vector Scattered Rx "
- "callback (port=%d).",
- dev->data->port_id);
+ "callback (port=%d).",
+ dev->data->port_id);
dev->rx_pkt_burst = sxe_scattered_pkts_vec_recv;
- } else
+
#endif
+
+#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_SIMD
+
+ } else if (rx_batch_alloc_allowed) {
+#else
if (rx_batch_alloc_allowed) {
+#endif
+
PMD_LOG_DEBUG(INIT, "Using a Scattered with bulk "
"allocation callback (port=%d).",
- dev->data->port_id);
+ dev->data->port_id);
dev->rx_pkt_burst = sxe_batch_alloc_lro_pkts_recv;
} else {
PMD_LOG_DEBUG(INIT, "Using Regular (non-vector, "
- "single allocation) "
- "Scattered Rx callback "
- "(port=%d).",
- dev->data->port_id);
+ "single allocation) "
+ "Scattered Rx callback "
+ "(port=%d).",
+ dev->data->port_id);
dev->rx_pkt_burst = sxe_single_alloc_lro_pkts_recv;
}
@@ -101,17 +108,17 @@ void __rte_cold __sxe_rx_function_set(struct rte_eth_dev *dev, bool rx_batch_all
#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_SIMD
else if (*rx_vec_allowed) {
PMD_LOG_DEBUG(INIT, "Vector rx enabled, please make sure RX "
- "burst size no less than %d (port=%d).",
- SXE_DESCS_PER_LOOP,
- dev->data->port_id);
+ "burst size no less than %d (port=%d).",
+ SXE_DESCS_PER_LOOP,
+ dev->data->port_id);
dev->rx_pkt_burst = sxe_pkts_vec_recv;
}
#endif
else if (rx_batch_alloc_allowed) {
PMD_LOG_DEBUG(INIT, "Rx Burst Bulk Alloc Preconditions are "
- "satisfied. Rx Burst Bulk Alloc function "
- "will be used on port=%d.",
+ "satisfied. Rx Burst Bulk Alloc function "
+ "will be used on port=%d.",
dev->data->port_id);
dev->rx_pkt_burst = sxe_batch_alloc_pkts_recv;
@@ -136,7 +143,6 @@ void __rte_cold __sxe_rx_function_set(struct rte_eth_dev *dev, bool rx_batch_all
}
#endif
- return;
}
#if defined DPDK_20_11_5 || defined DPDK_19_11_6
@@ -156,9 +162,8 @@ s32 __sxe_rx_descriptor_done(void *rx_queue, u16 offset)
}
index = rxq->processing_idx + offset;
- if (index >= rxq->ring_depth) {
+ if (index >= rxq->ring_depth)
index -= rxq->ring_depth;
- }
desc = &rxq->desc_ring[index];
is_done = !!(desc->wb.upper.status_error &
@@ -198,17 +203,15 @@ s32 __sxe_rx_descriptor_status(void *rx_queue, u16 offset)
}
desc = rxq->processing_idx + offset;
- if (desc >= rxq->ring_depth) {
+ if (desc >= rxq->ring_depth)
desc -= rxq->ring_depth;
- }
status = &rxq->desc_ring[desc].wb.upper.status_error;
- if (*status & rte_cpu_to_le_32(SXE_RXDADV_STAT_DD)) {
+ if (*status & rte_cpu_to_le_32(SXE_RXDADV_STAT_DD))
ret = RTE_ETH_RX_DESC_DONE;
- }
l_end:
- LOG_DEBUG("rx queue[%u] get desc status=%d\n",rxq->queue_id, ret);
+ LOG_DEBUG("rx queue[%u] get desc status=%d\n", rxq->queue_id, ret);
return ret;
}
@@ -234,23 +237,22 @@ u16 __sxe_pkts_recv(void *rx_queue, struct rte_mbuf **rx_pkts,
while (done_num < pkts_num) {
cur_desc = &desc_ring[processing_idx];
staterr = cur_desc->wb.upper.status_error;
- if (!(staterr & rte_cpu_to_le_32(SXE_RXDADV_STAT_DD))) {
+ if (!(staterr & rte_cpu_to_le_32(SXE_RXDADV_STAT_DD)))
break;
- }
rxd = *cur_desc;
LOG_DEBUG("port_id=%u queue_id=%u processing_idx=%u "
"staterr=0x%08x pkt_len=%u",
- (unsigned) rxq->port_id, (unsigned) rxq->queue_id,
- (unsigned) processing_idx, (unsigned) staterr,
- (unsigned) rte_le_to_cpu_16(rxd.wb.upper.length));
+ (unsigned int)rxq->port_id, (unsigned int) rxq->queue_id,
+ (unsigned int)processing_idx, (unsigned int) staterr,
+ (unsigned int)rte_le_to_cpu_16(rxd.wb.upper.length));
new_mb = rte_mbuf_raw_alloc(rxq->mb_pool);
if (new_mb == NULL) {
LOG_ERROR("RX mbuf alloc failed port_id=%u "
- "queue_id=%u", (unsigned) rxq->port_id,
- (unsigned) rxq->queue_id);
+ "queue_id=%u", (unsigned int) rxq->port_id,
+ (unsigned int) rxq->queue_id);
rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++;
break;
}
@@ -258,9 +260,8 @@ u16 __sxe_pkts_recv(void *rx_queue, struct rte_mbuf **rx_pkts,
hold_num++;
cur_buf = &buff_ring[processing_idx];
processing_idx++;
- if (processing_idx == rxq->ring_depth) {
+ if (processing_idx == rxq->ring_depth)
processing_idx = 0;
- }
sxe_rx_resource_prefetch(processing_idx, buff_ring, desc_ring);
@@ -293,9 +294,9 @@ u16 __sxe_pkts_recv(void *rx_queue, struct rte_mbuf **rx_pkts,
if (hold_num > rxq->batch_alloc_size) {
LOG_DEBUG("port_id=%u queue_id=%u rx_tail=%u "
"num_hold=%u num_done=%u",
- (unsigned) rxq->port_id, (unsigned) rxq->queue_id,
- (unsigned) processing_idx, (unsigned) hold_num,
- (unsigned) done_num);
+ (unsigned int)rxq->port_id, (unsigned int)rxq->queue_id,
+ (unsigned int)processing_idx, (unsigned int)hold_num,
+ (unsigned int)done_num);
processing_idx = (u16)((processing_idx == 0) ?
(rxq->ring_depth - 1) : (processing_idx - 1));
SXE_PCI_REG_WC_WRITE(rxq->rdt_reg_addr, processing_idx);
@@ -308,7 +309,7 @@ u16 __sxe_pkts_recv(void *rx_queue, struct rte_mbuf **rx_pkts,
const u32 *__sxe_dev_supported_ptypes_get(struct rte_eth_dev *dev)
{
- const u32 * ptypes = NULL;
+ const u32 *ptypes = NULL;
static const u32 ptypes_arr[] = {
RTE_PTYPE_L2_ETHER,
RTE_PTYPE_L3_IPV4,
@@ -337,7 +338,7 @@ const u32 *__sxe_dev_supported_ptypes_get(struct rte_eth_dev *dev)
#if defined SXE_DPDK_L4_FEATURES && defined SXE_DPDK_SIMD
#if defined(RTE_ARCH_X86)
if (dev->rx_pkt_burst == sxe_pkts_vec_recv ||
- dev->rx_pkt_burst == sxe_scattered_pkts_vec_recv) {
+ dev->rx_pkt_burst == sxe_scattered_pkts_vec_recv) {
ptypes = ptypes_arr;
}
#endif
@@ -7,7 +7,8 @@
#include "sxe_dpdk_version.h"
-void __rte_cold __sxe_rx_function_set(struct rte_eth_dev *dev, bool rx_batch_alloc_allowed, bool *rx_vec_allowed);
+void __rte_cold __sxe_rx_function_set(struct rte_eth_dev *dev,
+ bool rx_batch_alloc_allowed, bool *rx_vec_allowed);
#if defined DPDK_20_11_5 || defined DPDK_19_11_6
s32 __sxe_rx_descriptor_done(void *rx_queue, u16 offset);
@@ -33,15 +33,13 @@ int __sxe_tx_descriptor_status(void *tx_queue, u16 offset)
desc_idx = ((desc_idx + txq->rs_thresh - 1) / txq->rs_thresh) * txq->rs_thresh;
if (desc_idx >= txq->ring_depth) {
desc_idx -= txq->ring_depth;
- if (desc_idx >= txq->ring_depth) {
+ if (desc_idx >= txq->ring_depth)
desc_idx -= txq->ring_depth;
- }
}
status = &txq->desc_ring[desc_idx].wb.status;
- if (*status & rte_cpu_to_le_32(SXE_TX_DESC_STAT_DD)) {
+ if (*status & rte_cpu_to_le_32(SXE_TX_DESC_STAT_DD))
ret = RTE_ETH_TX_DESC_DONE;
- }
l_end:
return ret;
@@ -18,7 +18,7 @@
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
-typedef uint64_t u64;
+typedef uint64_t u64;
typedef char s8;
typedef int16_t s16;
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (C), 2022, Linkdata Technology Co., Ltd.
*/
-#if defined (__KERNEL__) || defined (SXE_KERNEL_TEST)
+#if defined(__KERNEL__) || defined(SXE_KERNEL_TEST)
#include <linux/etherdevice.h>
#include "sxevf_hw.h"
@@ -12,7 +12,7 @@
#include "sxevf_ring.h"
#include "sxevf.h"
#include "sxevf_rx_proc.h"
-#else
+#else
#include "sxe_errno.h"
#include "sxe_logs.h"
#include "sxe_dpdk_version.h"
@@ -28,37 +28,33 @@ struct sxevf_adapter;
#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
#define DMA_MASK_NONE 0x0ULL
-#define SXEVF_REG_READ_CNT 5
+#define SXEVF_REG_READ_CNT 5
-#define SXE_REG_READ_FAIL 0xffffffffU
+#define SXE_REG_READ_FAIL 0xffffffffU
-#define SXEVF_RING_WAIT_LOOP (100)
-#define SXEVF_MAX_RX_DESC_POLL (10)
+#define SXEVF_RING_WAIT_LOOP (100)
+#define SXEVF_MAX_RX_DESC_POLL (10)
-#define SXEVF_REG_READ(hw, addr) sxevf_reg_read(hw, addr)
+#define SXEVF_REG_READ(hw, addr) sxevf_reg_read(hw, addr)
#define SXEVF_REG_WRITE(hw, reg, value) sxevf_reg_write(hw, reg, value)
#define SXEVF_WRITE_FLUSH(a) sxevf_reg_read(a, SXE_VFSTATUS)
-#ifndef SXE_DPDK
+#ifndef SXE_DPDK
void sxevf_hw_fault_handle(struct sxevf_hw *hw)
{
struct sxevf_adapter *adapter = hw->adapter;
- if (test_bit(SXEVF_HW_FAULT, &hw->state)) {
- goto l_ret;
- }
+ if (test_bit(SXEVF_HW_FAULT, &hw->state))
+ return;
set_bit(SXEVF_HW_FAULT, &hw->state);
LOG_DEV_ERR("sxe nic hw fault\n");
- if ((hw->fault_handle != NULL) && (hw->priv != NULL) ) {
+ if ((hw->fault_handle != NULL) && (hw->priv != NULL))
hw->fault_handle(hw->priv);
- }
-l_ret:
- return;
}
static void sxevf_hw_fault_check(struct sxevf_hw *hw, u32 reg)
@@ -68,32 +64,27 @@ static void sxevf_hw_fault_check(struct sxevf_hw *hw, u32 reg)
struct sxevf_adapter *adapter = hw->adapter;
u8 i;
- if (reg == SXE_VFSTATUS) {
+ if (reg == SXE_VFSTATUS)
sxevf_hw_fault_handle(hw);
- return;
- }
for (i = 0; i < SXEVF_REG_READ_CNT; i++) {
value = hw->reg_read(base_addr + SXE_VFSTATUS);
- if (value != SXEVF_REG_READ_FAIL) {
+ if (value != SXEVF_REG_READ_FAIL)
break;
- }
mdelay(20);
}
LOG_INFO_BDF("retry done i:%d value:0x%x\n", i, value);
- if (value == SXEVF_REG_READ_FAIL) {
+ if (value == SXEVF_REG_READ_FAIL)
sxevf_hw_fault_handle(hw);
- }
- return;
}
-STATIC u32 sxevf_reg_read(struct sxevf_hw *hw, u32 reg)
+static u32 sxevf_reg_read(struct sxevf_hw *hw, u32 reg)
{
u32 value;
u8 __iomem *base_addr = hw->reg_base_addr;
@@ -105,7 +96,7 @@ STATIC u32 sxevf_reg_read(struct sxevf_hw *hw, u32 reg)
}
value = hw->reg_read(base_addr + reg);
- if (unlikely(SXEVF_REG_READ_FAIL == value)) {
+ if (unlikely(value == SXEVF_REG_READ_FAIL)) {
LOG_ERROR_BDF("reg[0x%x] read failed, value=%#x\n", reg, value);
sxevf_hw_fault_check(hw, reg);
}
@@ -114,29 +105,26 @@ STATIC u32 sxevf_reg_read(struct sxevf_hw *hw, u32 reg)
return value;
}
-STATIC void sxevf_reg_write(struct sxevf_hw *hw, u32 reg, u32 value)
+static void sxevf_reg_write(struct sxevf_hw *hw, u32 reg, u32 value)
{
u8 __iomem *base_addr = hw->reg_base_addr;
- if (sxevf_is_hw_fault(hw)) {
- goto l_ret;
- }
+ if (sxevf_is_hw_fault(hw))
+ return;
hw->reg_write(value, base_addr + reg);
-l_ret:
- return;
}
-#else
+#else
-STATIC u32 sxevf_reg_read(struct sxevf_hw *hw, u32 reg)
+static u32 sxevf_reg_read(struct sxevf_hw *hw, u32 reg)
{
u32 i, value;
u8 __iomem *base_addr = hw->reg_base_addr;
value = rte_le_to_cpu_32(rte_read32(base_addr + reg));
- if (unlikely(SXEVF_REG_READ_FAIL == value)) {
+ if (unlikely(value == SXEVF_REG_READ_FAIL)) {
for (i = 0; i < SXEVF_REG_READ_CNT; i++) {
LOG_ERROR("reg[0x%x] read failed, value=%#x\n",
reg, value);
@@ -154,13 +142,12 @@ STATIC u32 sxevf_reg_read(struct sxevf_hw *hw, u32 reg)
return value;
}
-STATIC void sxevf_reg_write(struct sxevf_hw *hw, u32 reg, u32 value)
+static void sxevf_reg_write(struct sxevf_hw *hw, u32 reg, u32 value)
{
u8 __iomem *base_addr = hw->reg_base_addr;
rte_write32((rte_cpu_to_le_32(value)), (base_addr + reg));
- return;
}
#endif
@@ -190,7 +177,6 @@ void sxevf_hw_stop(struct sxevf_hw *hw)
}
}
- return;
}
void sxevf_msg_write(struct sxevf_hw *hw, u8 index, u32 msg)
@@ -201,7 +187,6 @@ void sxevf_msg_write(struct sxevf_hw *hw, u8 index, u32 msg)
LOG_DEBUG_BDF("index:%u write mbx mem:0x%x.\n", index, msg);
- return;
}
u32 sxevf_msg_read(struct sxevf_hw *hw, u8 index)
@@ -222,21 +207,18 @@ u32 sxevf_mailbox_read(struct sxevf_hw *hw)
void sxevf_mailbox_write(struct sxevf_hw *hw, u32 value)
{
SXEVF_REG_WRITE(hw, SXE_VFMAILBOX, value);
- return;
}
void sxevf_pf_req_irq_trigger(struct sxevf_hw *hw)
{
SXEVF_REG_WRITE(hw, SXE_VFMAILBOX, SXE_VFMAILBOX_REQ);
- return;
}
void sxevf_pf_ack_irq_trigger(struct sxevf_hw *hw)
{
SXEVF_REG_WRITE(hw, SXE_VFMAILBOX, SXE_VFMAILBOX_ACK);
- return;
}
void sxevf_event_irq_map(struct sxevf_hw *hw, u16 vector)
@@ -252,14 +234,12 @@ void sxevf_event_irq_map(struct sxevf_hw *hw, u16 vector)
SXEVF_REG_WRITE(hw, SXE_VFIVAR_MISC, ivar);
- return;
}
void sxevf_specific_irq_enable(struct sxevf_hw *hw, u32 value)
{
SXEVF_REG_WRITE(hw, SXE_VFEIMS, value);
- return;
}
void sxevf_irq_enable(struct sxevf_hw *hw, u32 mask)
@@ -267,7 +247,6 @@ void sxevf_irq_enable(struct sxevf_hw *hw, u32 mask)
SXEVF_REG_WRITE(hw, SXE_VFEIAM, mask);
SXEVF_REG_WRITE(hw, SXE_VFEIMS, mask);
- return;
}
void sxevf_irq_disable(struct sxevf_hw *hw)
@@ -277,7 +256,6 @@ void sxevf_irq_disable(struct sxevf_hw *hw)
SXEVF_WRITE_FLUSH(hw);
- return;
}
void sxevf_hw_ring_irq_map(struct sxevf_hw *hw, bool is_tx, u16 hw_ring_idx, u16 vector)
@@ -295,7 +273,6 @@ void sxevf_hw_ring_irq_map(struct sxevf_hw *hw, bool is_tx, u16 hw_ring_idx, u16
SXEVF_REG_WRITE(hw, SXE_VFIVAR(hw_ring_idx >> 1), ivar);
- return;
}
void sxevf_ring_irq_interval_set(struct sxevf_hw *hw, u16 irq_idx, u32 interval)
@@ -306,40 +283,36 @@ void sxevf_ring_irq_interval_set(struct sxevf_hw *hw, u16 irq_idx, u32 interval)
SXEVF_REG_WRITE(hw, SXE_VFEITR(irq_idx), eitr);
- return;
}
static void sxevf_event_irq_interval_set(struct sxevf_hw *hw, u16 irq_idx, u32 value)
{
SXEVF_REG_WRITE(hw, SXE_VFEITR(irq_idx), value);
- return;
}
static void sxevf_pending_irq_clear(struct sxevf_hw *hw)
{
SXEVF_REG_READ(hw, SXE_VFEICR);
- return;
}
static void sxevf_ring_irq_trigger(struct sxevf_hw *hw, u64 eics)
{
SXEVF_REG_WRITE(hw, SXE_VFEICS, eics);
- return;
}
static const struct sxevf_irq_operations sxevf_irq_ops = {
.ring_irq_interval_set = sxevf_ring_irq_interval_set,
.event_irq_interval_set = sxevf_event_irq_interval_set,
- .ring_irq_map = sxevf_hw_ring_irq_map,
- .event_irq_map = sxevf_event_irq_map,
- .pending_irq_clear = sxevf_pending_irq_clear,
- .ring_irq_trigger = sxevf_ring_irq_trigger,
- .specific_irq_enable = sxevf_specific_irq_enable,
- .irq_enable = sxevf_irq_enable,
- .irq_disable = sxevf_irq_disable,
+ .ring_irq_map = sxevf_hw_ring_irq_map,
+ .event_irq_map = sxevf_event_irq_map,
+ .pending_irq_clear = sxevf_pending_irq_clear,
+ .ring_irq_trigger = sxevf_ring_irq_trigger,
+ .specific_irq_enable = sxevf_specific_irq_enable,
+ .irq_enable = sxevf_irq_enable,
+ .irq_disable = sxevf_irq_disable,
};
void sxevf_hw_reset(struct sxevf_hw *hw)
@@ -347,10 +320,9 @@ void sxevf_hw_reset(struct sxevf_hw *hw)
SXEVF_REG_WRITE(hw, SXE_VFCTRL, SXE_VFCTRL_RST);
SXEVF_WRITE_FLUSH(hw);
- return;
}
-STATIC bool sxevf_hw_rst_done(struct sxevf_hw *hw)
+static bool sxevf_hw_rst_done(struct sxevf_hw *hw)
{
return !(SXEVF_REG_READ(hw, SXE_VFCTRL) & SXE_VFCTRL_RST);
}
@@ -374,9 +346,8 @@ static u32 sxevf_reg_dump(struct sxevf_hw *hw, u32 *regs_buff, u32 buf_size)
u32 i;
u32 regs_num = buf_size / sizeof(u32);
- for (i = 0; i < regs_num; i++) {
+ for (i = 0; i < regs_num; i++)
regs_buff[i] = SXEVF_REG_READ(hw, dump_regs[i]);
- }
return i;
}
@@ -476,7 +447,7 @@ static s32 sxevf_reg_set_and_check(struct sxevf_hw *hw, int reg,
return ret;
}
-STATIC s32 sxevf_regs_test(struct sxevf_hw *hw)
+static s32 sxevf_regs_test(struct sxevf_hw *hw)
{
u32 i;
s32 ret = 0;
@@ -521,9 +492,8 @@ STATIC s32 sxevf_regs_test(struct sxevf_hw *hw)
break;
}
- if (ret) {
+ if (ret)
goto l_end;
- }
}
test++;
@@ -545,14 +515,13 @@ static const struct sxevf_setup_operations sxevf_setup_ops = {
static void sxevf_tx_ring_desc_configure(struct sxevf_hw *hw, u32 desc_mem_len,
u64 desc_dma_addr, u8 reg_idx)
{
- SXEVF_REG_WRITE(hw, SXEVF_TDBAL(reg_idx), (desc_dma_addr & \
+ SXEVF_REG_WRITE(hw, SXEVF_TDBAL(reg_idx), (desc_dma_addr &
DMA_BIT_MASK(32)));
SXEVF_REG_WRITE(hw, SXEVF_TDBAH(reg_idx), (desc_dma_addr >> 32));
SXEVF_REG_WRITE(hw, SXEVF_TDLEN(reg_idx), desc_mem_len);
SXEVF_REG_WRITE(hw, SXEVF_TDH(reg_idx), 0);
SXEVF_REG_WRITE(hw, SXEVF_TDT(reg_idx), 0);
- return;
}
static void sxevf_tx_writeback_off(struct sxevf_hw *hw, u8 reg_idx)
@@ -560,7 +529,6 @@ static void sxevf_tx_writeback_off(struct sxevf_hw *hw, u8 reg_idx)
SXEVF_REG_WRITE(hw, SXEVF_TDWBAH(reg_idx), 0);
SXEVF_REG_WRITE(hw, SXEVF_TDWBAL(reg_idx), 0);
- return;
}
static void sxevf_tx_desc_thresh_set(
@@ -578,7 +546,6 @@ static void sxevf_tx_desc_thresh_set(
SXEVF_REG_WRITE(hw, SXEVF_TXDCTL(reg_idx), txdctl);
- return;
}
void sxevf_tx_ring_switch(struct sxevf_hw *hw, u8 reg_idx, bool is_on)
@@ -610,7 +577,6 @@ void sxevf_tx_ring_switch(struct sxevf_hw *hw, u8 reg_idx, bool is_on)
"the polling period\n", reg_idx, is_on);
}
- return;
}
static void sxevf_rx_disable(struct sxevf_hw *hw, u8 reg_idx)
@@ -619,9 +585,8 @@ static void sxevf_rx_disable(struct sxevf_hw *hw, u8 reg_idx)
u32 wait_loop = SXEVF_RX_RING_POLL_MAX;
struct sxevf_adapter *adapter = hw->adapter;
- if (!hw->reg_base_addr) {
- goto l_end;
- }
+ if (!hw->reg_base_addr)
+ return;
rxdctl = SXEVF_REG_READ(hw, SXE_VFRXDCTL(reg_idx));
rxdctl &= ~SXE_VFRXDCTL_ENABLE;
@@ -637,8 +602,6 @@ static void sxevf_rx_disable(struct sxevf_hw *hw, u8 reg_idx)
reg_idx);
}
-l_end:
- return;
}
void sxevf_rx_ring_switch(struct sxevf_hw *hw, u8 reg_idx, bool is_on)
@@ -673,7 +636,6 @@ void sxevf_rx_ring_switch(struct sxevf_hw *hw, u8 reg_idx, bool is_on)
"the polling period\n", reg_idx, is_on);
}
- return;
}
void sxevf_rx_ring_desc_configure(struct sxevf_hw *hw, u32 desc_mem_len,
@@ -689,7 +651,6 @@ void sxevf_rx_ring_desc_configure(struct sxevf_hw *hw, u32 desc_mem_len,
SXEVF_REG_WRITE(hw, SXE_VFRDH(reg_idx), 0);
SXEVF_REG_WRITE(hw, SXE_VFRDT(reg_idx), 0);
- return;
}
void sxevf_rx_rcv_ctl_configure(struct sxevf_hw *hw, u8 reg_idx,
@@ -697,9 +658,8 @@ void sxevf_rx_rcv_ctl_configure(struct sxevf_hw *hw, u8 reg_idx,
{
u32 srrctl = 0;
- if (drop_en) {
+ if (drop_en)
srrctl = SXEVF_SRRCTL_DROP_EN;
- }
srrctl |= ((header_buf_len << SXEVF_SRRCTL_BSIZEHDRSIZE_SHIFT) &
SXEVF_SRRCTL_BSIZEHDR_MASK);
@@ -708,7 +668,6 @@ void sxevf_rx_rcv_ctl_configure(struct sxevf_hw *hw, u8 reg_idx,
SXEVF_REG_WRITE(hw, SXE_VFSRRCTL(reg_idx), srrctl);
- return;
}
static void sxevf_tx_ring_info_get(struct sxevf_hw *hw,
@@ -717,48 +676,47 @@ static void sxevf_tx_ring_info_get(struct sxevf_hw *hw,
*head = SXEVF_REG_READ(hw, SXE_VFTDH(idx));
*tail = SXEVF_REG_READ(hw, SXE_VFTDT(idx));
- return;
}
static const struct sxevf_dma_operations sxevf_dma_ops = {
.tx_ring_desc_configure = sxevf_tx_ring_desc_configure,
- .tx_writeback_off = sxevf_tx_writeback_off,
- .tx_desc_thresh_set = sxevf_tx_desc_thresh_set,
- .tx_ring_switch = sxevf_tx_ring_switch,
- .tx_ring_info_get = sxevf_tx_ring_info_get,
-
- .rx_disable = sxevf_rx_disable,
- .rx_ring_switch = sxevf_rx_ring_switch,
- .rx_ring_desc_configure= sxevf_rx_ring_desc_configure,
+ .tx_writeback_off = sxevf_tx_writeback_off,
+ .tx_desc_thresh_set = sxevf_tx_desc_thresh_set,
+ .tx_ring_switch = sxevf_tx_ring_switch,
+ .tx_ring_info_get = sxevf_tx_ring_info_get,
+
+ .rx_disable = sxevf_rx_disable,
+ .rx_ring_switch = sxevf_rx_ring_switch,
+ .rx_ring_desc_configure = sxevf_rx_ring_desc_configure,
.rx_rcv_ctl_configure = sxevf_rx_rcv_ctl_configure,
};
#ifdef SXE_DPDK
-#define SXEVF_32BIT_COUNTER_UPDATE(reg, last, cur) \
- { \
- u32 latest = SXEVF_REG_READ(hw, reg); \
- cur += (latest - last) & UINT_MAX; \
- last = latest; \
- }
-
-#define SXEVF_36BIT_COUNTER_UPDATE(lsb, msb, last, cur) \
- { \
- u64 new_lsb = SXEVF_REG_READ(hw, lsb); \
- u64 new_msb = SXEVF_REG_READ(hw, msb); \
- u64 latest = ((new_msb << 32) | new_lsb); \
+#define SXEVF_32BIT_COUNTER_UPDATE(reg, last, cur) \
+ { \
+ u32 latest = SXEVF_REG_READ(hw, reg); \
+ cur += (latest - last) & UINT_MAX; \
+ last = latest; \
+ }
+
+#define SXEVF_36BIT_COUNTER_UPDATE(lsb, msb, last, cur) \
+ { \
+ u64 new_lsb = SXEVF_REG_READ(hw, lsb); \
+ u64 new_msb = SXEVF_REG_READ(hw, msb); \
+ u64 latest = ((new_msb << 32) | new_lsb); \
cur += (0x1000000000LL + latest - last) & 0xFFFFFFFFFLL; \
- last = latest; \
+ last = latest; \
}
#else
#define SXEVF_32BIT_COUNTER_UPDATE(reg, last_counter, counter) \
- { \
- u32 current_counter = SXEVF_REG_READ(hw, reg); \
- if (current_counter < last_counter) \
- counter += 0x100000000LL; \
- last_counter = current_counter; \
- counter &= 0xFFFFFFFF00000000LL; \
- counter |= current_counter; \
+ { \
+ u32 current_counter = SXEVF_REG_READ(hw, reg); \
+ if (current_counter < last_counter) \
+ counter += 0x100000000LL; \
+ last_counter = current_counter; \
+ counter &= 0xFFFFFFFF00000000LL; \
+ counter |= current_counter; \
}
#define SXEVF_36BIT_COUNTER_UPDATE(reg_lsb, reg_msb, last_counter, counter) \
@@ -791,7 +749,6 @@ void sxevf_packet_stats_get(struct sxevf_hw *hw,
SXEVF_32BIT_COUNTER_UPDATE(SXEVF_VFMPRC, stats->last_vfmprc,
stats->vfmprc);
- return;
}
void sxevf_stats_init_value_get(struct sxevf_hw *hw,
@@ -805,7 +762,6 @@ void sxevf_stats_init_value_get(struct sxevf_hw *hw,
stats->last_vfgotc |= (((u64)(SXEVF_REG_READ(hw, SXE_VFGOTC_MSB))) << 32);
stats->last_vfmprc = SXEVF_REG_READ(hw, SXE_VFMPRC);
- return;
}
static const struct sxevf_stat_operations sxevf_stat_ops = {
.packet_stats_get = sxevf_packet_stats_get,
@@ -816,13 +772,11 @@ static void sxevf_rx_max_used_ring_set(struct sxevf_hw *hw, u16 max_rx_ring)
{
u32 rqpl = 0;
- if (max_rx_ring > 1) {
+ if (max_rx_ring > 1)
rqpl |= BIT(29);
- }
SXEVF_REG_WRITE(hw, SXE_VFPSRTYPE, rqpl);
- return;
}
static const struct sxevf_dbu_operations sxevf_dbu_ops = {
@@ -844,23 +798,22 @@ static const struct sxevf_mbx_operations sxevf_mbx_ops = {
void sxevf_hw_ops_init(struct sxevf_hw *hw)
{
hw->setup.ops = &sxevf_setup_ops;
- hw->irq.ops = &sxevf_irq_ops;
- hw->mbx.ops = &sxevf_mbx_ops;
- hw->dma.ops = &sxevf_dma_ops;
- hw->stat.ops = &sxevf_stat_ops;
- hw->dbu.ops = &sxevf_dbu_ops;
+ hw->irq.ops = &sxevf_irq_ops;
+ hw->mbx.ops = &sxevf_mbx_ops;
+ hw->dma.ops = &sxevf_dma_ops;
+ hw->stat.ops = &sxevf_stat_ops;
+ hw->dbu.ops = &sxevf_dbu_ops;
- return;
}
-#ifdef SXE_DPDK
+#ifdef SXE_DPDK
-#define SXEVF_RSS_FIELD_MASK 0xffff0000
-#define SXEVF_MRQC_RSSEN 0x00000001
+#define SXEVF_RSS_FIELD_MASK 0xffff0000
+#define SXEVF_MRQC_RSSEN 0x00000001
-#define SXEVF_RSS_KEY_SIZE (40)
-#define SXEVF_MAX_RSS_KEY_ENTRIES (10)
-#define SXEVF_MAX_RETA_ENTRIES (128)
+#define SXEVF_RSS_KEY_SIZE (40)
+#define SXEVF_MAX_RSS_KEY_ENTRIES (10)
+#define SXEVF_MAX_RETA_ENTRIES (128)
void sxevf_rxtx_reg_init(struct sxevf_hw *hw)
{
@@ -886,7 +839,6 @@ void sxevf_rxtx_reg_init(struct sxevf_hw *hw)
SXEVF_WRITE_FLUSH(hw);
- return;
}
u32 sxevf_irq_cause_get(struct sxevf_hw *hw)
@@ -898,21 +850,19 @@ void sxevf_tx_desc_configure(struct sxevf_hw *hw, u32 desc_mem_len,
u64 desc_dma_addr, u8 reg_idx)
{
- SXEVF_REG_WRITE(hw, SXEVF_TDBAL(reg_idx), (desc_dma_addr & \
+ SXEVF_REG_WRITE(hw, SXEVF_TDBAL(reg_idx), (desc_dma_addr &
DMA_BIT_MASK(32)));
SXEVF_REG_WRITE(hw, SXEVF_TDBAH(reg_idx), (desc_dma_addr >> 32));
SXEVF_REG_WRITE(hw, SXEVF_TDLEN(reg_idx), desc_mem_len);
SXEVF_REG_WRITE(hw, SXEVF_TDH(reg_idx), 0);
SXEVF_REG_WRITE(hw, SXEVF_TDT(reg_idx), 0);
- return;
}
void sxevf_rss_bit_num_set(struct sxevf_hw *hw, u32 value)
{
SXEVF_REG_WRITE(hw, SXE_VFPSRTYPE, value);
- return;
}
void sxevf_hw_vlan_tag_strip_switch(struct sxevf_hw *hw,
@@ -922,15 +872,13 @@ void sxevf_hw_vlan_tag_strip_switch(struct sxevf_hw *hw,
vlnctrl = SXEVF_REG_READ(hw, SXE_VFRXDCTL(reg_index));
- if (is_enable) {
+ if (is_enable)
vlnctrl |= SXEVF_RXDCTL_VME;
- } else {
+ else
vlnctrl &= ~SXEVF_RXDCTL_VME;
- }
SXEVF_REG_WRITE(hw, SXE_VFRXDCTL(reg_index), vlnctrl);
- return;
}
void sxevf_tx_queue_thresh_set(struct sxevf_hw *hw, u8 reg_idx,
@@ -944,14 +892,12 @@ void sxevf_tx_queue_thresh_set(struct sxevf_hw *hw, u8 reg_idx,
SXEVF_REG_WRITE(hw, SXEVF_TXDCTL(reg_idx), txdctl);
- return;
}
void sxevf_rx_desc_tail_set(struct sxevf_hw *hw, u8 reg_idx, u32 value)
{
SXEVF_REG_WRITE(hw, SXE_VFRDT(reg_idx), value);
- return;
}
u32 sxevf_hw_rss_redir_tbl_get(struct sxevf_hw *hw, u16 reg_idx)
@@ -963,18 +909,16 @@ void sxevf_hw_rss_redir_tbl_set(struct sxevf_hw *hw,
u16 reg_idx, u32 value)
{
SXEVF_REG_WRITE(hw, SXE_VFRETA(reg_idx >> 2), value);
- return;
}
u32 sxevf_hw_rss_key_get(struct sxevf_hw *hw, u8 reg_idx)
{
u32 rss_key;
- if (reg_idx >= SXEVF_MAX_RSS_KEY_ENTRIES) {
+ if (reg_idx >= SXEVF_MAX_RSS_KEY_ENTRIES)
rss_key = 0;
- } else {
+ else
rss_key = SXEVF_REG_READ(hw, SXE_VFRSSRK(reg_idx));
- }
return rss_key;
}
@@ -989,9 +933,8 @@ bool sxevf_hw_is_rss_enabled(struct sxevf_hw *hw)
{
bool rss_enable = false;
u32 mrqc = SXEVF_REG_READ(hw, SXE_VFMRQC);
- if (mrqc & SXEVF_MRQC_RSSEN) {
+ if (mrqc & SXEVF_MRQC_RSSEN)
rss_enable = true;
- }
return rss_enable;
}
@@ -1000,25 +943,21 @@ void sxevf_hw_rss_key_set_all(struct sxevf_hw *hw, u32 *rss_key)
{
u32 i;
- for (i = 0; i < SXEVF_MAX_RSS_KEY_ENTRIES; i++) {
+ for (i = 0; i < SXEVF_MAX_RSS_KEY_ENTRIES; i++)
SXEVF_REG_WRITE(hw, SXE_VFRSSRK(i), rss_key[i]);
- }
- return;
}
void sxevf_hw_rss_cap_switch(struct sxevf_hw *hw, bool is_on)
{
u32 mrqc = SXEVF_REG_READ(hw, SXE_VFMRQC);
- if (is_on) {
+ if (is_on)
mrqc |= SXEVF_MRQC_RSSEN;
- } else {
+ else
mrqc &= ~SXEVF_MRQC_RSSEN;
- }
SXEVF_REG_WRITE(hw, SXE_VFMRQC, mrqc);
- return;
}
void sxevf_hw_rss_field_set(struct sxevf_hw *hw, u32 rss_field)
@@ -1029,7 +968,6 @@ void sxevf_hw_rss_field_set(struct sxevf_hw *hw, u32 rss_field)
mrqc |= rss_field;
SXEVF_REG_WRITE(hw, SXE_VFMRQC, mrqc);
- return;
}
u32 sxevf_hw_regs_group_read(struct sxevf_hw *hw,
@@ -1044,7 +982,7 @@ u32 sxevf_hw_regs_group_read(struct sxevf_hw *hw,
reg_buf[count + j] = SXEVF_REG_READ(hw,
regs[i].addr + j * regs[i].stride);
LOG_INFO("regs= %s, regs_addr=%x, regs_value=%04x\n",
- regs[i].name , regs[i].addr, reg_buf[count + j]);
+ regs[i].name, regs[i].addr, reg_buf[count + j]);
}
i++;
@@ -5,7 +5,7 @@
#ifndef __SXEVF_HW_H__
#define __SXEVF_HW_H__
-#if defined (__KERNEL__) || defined (SXE_KERNEL_TEST)
+#if defined(__KERNEL__) || defined(SXE_KERNEL_TEST)
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/if_ether.h>
@@ -18,7 +18,7 @@
#include "sxevf_regs.h"
-#if defined (__KERNEL__) || defined (SXE_KERNEL_TEST)
+#if defined(__KERNEL__) || defined(SXE_KERNEL_TEST)
#define SXE_PRIU64 "llu"
#define SXE_PRIX64 "llx"
#define SXE_PRID64 "lld"
@@ -28,30 +28,30 @@
#define SXE_PRID64 PRId64
#endif
-#define SXEVF_TXRX_RING_NUM_MAX 8
-#define SXEVF_MAX_TXRX_DESC_POLL (10)
+#define SXEVF_TXRX_RING_NUM_MAX 8
+#define SXEVF_MAX_TXRX_DESC_POLL (10)
#define SXEVF_TX_DESC_PREFETCH_THRESH_32 (32)
-#define SXEVF_TX_DESC_HOST_THRESH_1 (1)
+#define SXEVF_TX_DESC_HOST_THRESH_1 (1)
#define SXEVF_TX_DESC_WRITEBACK_THRESH_8 (8)
-#define SXEVF_TXDCTL_HTHRESH_SHIFT (8)
-#define SXEVF_TXDCTL_WTHRESH_SHIFT (16)
+#define SXEVF_TXDCTL_HTHRESH_SHIFT (8)
+#define SXEVF_TXDCTL_WTHRESH_SHIFT (16)
-#define SXEVF_TXDCTL_THRESH_MASK (0x7F)
+#define SXEVF_TXDCTL_THRESH_MASK (0x7F)
-#define SXEVF_RX_RING_POLL_MAX (10)
+#define SXEVF_RX_RING_POLL_MAX (10)
-#define SXEVF_MAC_HDR_LEN_MAX (127)
-#define SXEVF_NETWORK_HDR_LEN_MAX (511)
+#define SXEVF_MAC_HDR_LEN_MAX (127)
+#define SXEVF_NETWORK_HDR_LEN_MAX (511)
-#define SXEVF_LINK_SPEED_UNKNOWN 0
+#define SXEVF_LINK_SPEED_UNKNOWN 0
#define SXEVF_LINK_SPEED_1GB_FULL 0x0020
#define SXEVF_LINK_SPEED_10GB_FULL 0x0080
#define SXEVF_LINK_SPEED_100_FULL 0x0008
-#define SXEVF_VFT_TBL_SIZE (128)
-#define SXEVF_HW_TXRX_RING_NUM_MAX (128)
+#define SXEVF_VFT_TBL_SIZE (128)
+#define SXEVF_HW_TXRX_RING_NUM_MAX (128)
-#define SXEVF_VLAN_TAG_SIZE (4)
+#define SXEVF_VLAN_TAG_SIZE (4)
#define SXEVF_HW_UC_ENTRY_NUM_MAX 128
@@ -65,7 +65,7 @@ enum {
SXEVF_DIAG_TEST_PASSED = 0,
SXEVF_DIAG_TEST_BLOCKED = 1,
SXEVF_DIAG_REG_PATTERN_TEST_ERR = 2,
- SXEVF_DIAG_CHECK_REG_TEST_ERR = 3,
+ SXEVF_DIAG_CHECK_REG_TEST_ERR = 3,
};
struct sxevf_hw;
@@ -83,11 +83,11 @@ struct sxevf_hw_stats {
u64 last_vfgotc;
u64 last_vfmprc;
- u64 vfgprc;
- u64 vfgptc;
- u64 vfgorc;
- u64 vfgotc;
- u64 vfmprc;
+ u64 vfgprc;
+ u64 vfgptc;
+ u64 vfgorc;
+ u64 vfgotc;
+ u64 vfmprc;
u64 saved_reset_vfgprc;
u64 saved_reset_vfgptc;
@@ -100,12 +100,12 @@ void sxevf_hw_ops_init(struct sxevf_hw *hw);
struct sxevf_setup_operations {
- void (*reset)(struct sxevf_hw *);
+ void (*reset)(struct sxevf_hw *hw);
void (*hw_stop)(struct sxevf_hw *hw);
s32 (*regs_test)(struct sxevf_hw *hw);
u32 (*link_state_get)(struct sxevf_hw *hw);
u32 (*regs_dump)(struct sxevf_hw *hw, u32 *regs_buff, u32 buf_size);
- bool (*reset_done)(struct sxevf_hw *);
+ bool (*reset_done)(struct sxevf_hw *hw);
};
struct sxevf_hw_setup {
@@ -115,12 +115,12 @@ struct sxevf_hw_setup {
struct sxevf_irq_operations {
void (*pending_irq_clear)(struct sxevf_hw *hw);
void (*ring_irq_interval_set)(struct sxevf_hw *hw, u16 irq_idx, u32 interval);
- void (*event_irq_interval_set)(struct sxevf_hw * hw, u16 irq_idx, u32 value);
+ void (*event_irq_interval_set)(struct sxevf_hw *hw, u16 irq_idx, u32 value);
void (*ring_irq_map)(struct sxevf_hw *hw, bool is_tx, u16 hw_ring_idx, u16 irq_idx);
void (*event_irq_map)(struct sxevf_hw *hw, u16 irq_idx);
void (*ring_irq_trigger)(struct sxevf_hw *hw, u64 eics);
- void (*irq_enable)(struct sxevf_hw * hw, u32 mask);
- void (*specific_irq_enable)(struct sxevf_hw * hw, u32 value);
+ void (*irq_enable)(struct sxevf_hw *hw, u32 mask);
+ void (*specific_irq_enable)(struct sxevf_hw *hw, u32 value);
void (*irq_disable)(struct sxevf_hw *hw);
void (*irq_off)(struct sxevf_hw *hw);
};
@@ -142,37 +142,40 @@ struct sxevf_mbx_operations {
};
struct sxevf_mbx_stats {
- u32 send_msgs;
- u32 rcv_msgs;
+ u32 send_msgs;
+ u32 rcv_msgs;
- u32 reqs;
- u32 acks;
- u32 rsts;
+ u32 reqs;
+ u32 acks;
+ u32 rsts;
};
struct sxevf_mbx_info {
- const struct sxevf_mbx_operations *ops;
-
- struct sxevf_mbx_stats stats;
- u32 msg_len;
- u32 retry;
- u32 interval;
- u32 reg_value;
- u32 api_version;
+ const struct sxevf_mbx_operations *ops;
+
+ struct sxevf_mbx_stats stats;
+ u32 msg_len;
+ u32 retry;
+ u32 interval;
+ u32 reg_value;
+ u32 api_version;
};
struct sxevf_dma_operations {
- void (* tx_ring_desc_configure)(struct sxevf_hw *, u32, u64, u8);
- void (* tx_writeback_off)(struct sxevf_hw *, u8);
- void (* tx_desc_thresh_set)(struct sxevf_hw *, u8, u32, u32, u32);
- void (* tx_ring_switch)(struct sxevf_hw *, u8, bool);
- void (* tx_desc_wb_flush)(struct sxevf_hw *, u8);
- void (* tx_ring_info_get)(struct sxevf_hw *hw, u8 reg_idx,
+ void (*tx_ring_desc_configure)(struct sxevf_hw *hw, u32 desc_mem_len,
+ u64 desc_dma_addr, u8 reg_idx);
+ void (*tx_writeback_off)(struct sxevf_hw *hw, u8 reg_idx);
+ void (*tx_desc_thresh_set)(struct sxevf_hw *hw, u8 reg_idx,
+ u32 wb_thresh, u32 host_thresh, u32 prefech_thresh);
+ void (*tx_ring_switch)(struct sxevf_hw *hw, u8 reg_idx, bool is_on);
+ void (*tx_desc_wb_flush)(struct sxevf_hw *hw, u8 val);
+ void (*tx_ring_info_get)(struct sxevf_hw *hw, u8 reg_idx,
u32 *head, u32 *tail);
- void (* rx_disable)(struct sxevf_hw *, u8);
- void (* rx_ring_switch)(struct sxevf_hw *, u8, bool);
- void (* rx_ring_desc_configure)(struct sxevf_hw *, u32, u64, u8);
- void (* rx_rcv_ctl_configure)(struct sxevf_hw *hw, u8 reg_idx,
+ void (*rx_disable)(struct sxevf_hw *hw, u8 reg_idx);
+ void (*rx_ring_switch)(struct sxevf_hw *hw, u8 reg_idx, bool is_on);
+ void (*rx_ring_desc_configure)(struct sxevf_hw *hw, u32 desc_mem_len,
+ u64 desc_dma_addr, u8 reg_idx);
+ void (*rx_rcv_ctl_configure)(struct sxevf_hw *hw, u8 reg_idx,
u32 header_buf_len, u32 pkg_buf_len, bool drop_en);
};
@@ -181,8 +184,8 @@ struct sxevf_dma_info {
};
struct sxevf_stat_operations {
- void (*packet_stats_get)(struct sxevf_hw *,
- struct sxevf_hw_stats *);
+ void (*packet_stats_get)(struct sxevf_hw *hw,
+ struct sxevf_hw_stats *stats);
void (*stats_init_value_get)(struct sxevf_hw *hw,
struct sxevf_hw_stats *stats);
};
@@ -192,7 +195,7 @@ struct sxevf_stat_info {
};
struct sxevf_dbu_operations {
- void (*rx_max_used_ring_set)(struct sxevf_hw *, u16);
+ void (*rx_max_used_ring_set)(struct sxevf_hw *hw, u16 max_rx_ring);
};
@@ -206,30 +209,30 @@ enum sxevf_hw_state {
};
struct sxevf_hw {
- u8 __iomem *reg_base_addr;
+ u8 __iomem *reg_base_addr;
void *adapter;
void *priv;
- unsigned long state;
+ unsigned long state;
void (*fault_handle)(void *priv);
u32 (*reg_read)(const volatile void *reg);
void (*reg_write)(u32 value, volatile void *reg);
- s32 board_type;
+ s32 board_type;
- struct sxevf_hw_setup setup;
- struct sxevf_irq_info irq;
- struct sxevf_mbx_info mbx;
+ struct sxevf_hw_setup setup;
+ struct sxevf_irq_info irq;
+ struct sxevf_mbx_info mbx;
- struct sxevf_dma_info dma;
- struct sxevf_stat_info stat;
- struct sxevf_dbu_info dbu;
+ struct sxevf_dma_info dma;
+ struct sxevf_stat_info stat;
+ struct sxevf_dbu_info dbu;
};
struct sxevf_reg_info {
- u32 addr;
- u32 count;
- u32 stride;
- const s8 *name;
+ u32 addr;
+ u32 count;
+ u32 stride;
+ const s8 *name;
};
u16 sxevf_reg_dump_num_get(void);
@@ -247,7 +250,6 @@ static inline void sxevf_hw_fault_handle_init(struct sxevf_hw *hw,
hw->priv = priv;
hw->fault_handle = handle;
- return;
}
static inline void sxevf_hw_reg_handle_init(struct sxevf_hw *hw,
@@ -257,10 +259,9 @@ static inline void sxevf_hw_reg_handle_init(struct sxevf_hw *hw,
hw->reg_read = read;
hw->reg_write = write;
- return;
}
-#ifdef SXE_DPDK
+#ifdef SXE_DPDK
void sxevf_irq_disable(struct sxevf_hw *hw);
@@ -347,5 +348,5 @@ u32 sxevf_hw_regs_group_read(struct sxevf_hw *hw,
const struct sxevf_reg_info *regs,
u32 *reg_buf);
-#endif
+#endif
#endif
@@ -14,106 +14,106 @@
#define SXE_VFLINKS_SPEED_1G 0x00000004
#define SXE_VFLINKS_SPEED_100 0x00000002
-#define SXE_VFCTRL 0x00000
-#define SXE_VFSTATUS 0x00008
-#define SXE_VFLINKS 0x00018
-#define SXE_VFFRTIMER 0x00048
+#define SXE_VFCTRL 0x00000
+#define SXE_VFSTATUS 0x00008
+#define SXE_VFLINKS 0x00018
+#define SXE_VFFRTIMER 0x00048
#define SXE_VFRXMEMWRAP 0x03190
-#define SXE_VFEICR 0x00100
-#define SXE_VFEICS 0x00104
-#define SXE_VFEIMS 0x00108
-#define SXE_VFEIMC 0x0010C
-#define SXE_VFEIAM 0x00114
-#define SXE_VFEITR(x) (0x00820 + (4 * (x)))
-#define SXE_VFIVAR(x) (0x00120 + (4 * (x)))
-#define SXE_VFIVAR_MISC 0x00140
-#define SXE_VFRDBAL(x) (0x01000 + (0x40 * (x)))
-#define SXE_VFRDBAH(x) (0x01004 + (0x40 * (x)))
-#define SXE_VFRDLEN(x) (0x01008 + (0x40 * (x)))
-#define SXE_VFRDH(x) (0x01010 + (0x40 * (x)))
-#define SXE_VFRDT(x) (0x01018 + (0x40 * (x)))
+#define SXE_VFEICR 0x00100
+#define SXE_VFEICS 0x00104
+#define SXE_VFEIMS 0x00108
+#define SXE_VFEIMC 0x0010C
+#define SXE_VFEIAM 0x00114
+#define SXE_VFEITR(x) (0x00820 + (4 * (x)))
+#define SXE_VFIVAR(x) (0x00120 + (4 * (x)))
+#define SXE_VFIVAR_MISC 0x00140
+#define SXE_VFRDBAL(x) (0x01000 + (0x40 * (x)))
+#define SXE_VFRDBAH(x) (0x01004 + (0x40 * (x)))
+#define SXE_VFRDLEN(x) (0x01008 + (0x40 * (x)))
+#define SXE_VFRDH(x) (0x01010 + (0x40 * (x)))
+#define SXE_VFRDT(x) (0x01018 + (0x40 * (x)))
#define SXE_VFRXDCTL(x) (0x01028 + (0x40 * (x)))
#define SXE_VFSRRCTL(x) (0x01014 + (0x40 * (x)))
#define SXE_VFLROCTL(x) (0x0102C + (0x40 * (x)))
-#define SXE_VFPSRTYPE 0x00300
-#define SXE_VFTDBAL(x) (0x02000 + (0x40 * (x)))
-#define SXE_VFTDBAH(x) (0x02004 + (0x40 * (x)))
-#define SXE_VFTDLEN(x) (0x02008 + (0x40 * (x)))
-#define SXE_VFTDH(x) (0x02010 + (0x40 * (x)))
-#define SXE_VFTDT(x) (0x02018 + (0x40 * (x)))
+#define SXE_VFPSRTYPE 0x00300
+#define SXE_VFTDBAL(x) (0x02000 + (0x40 * (x)))
+#define SXE_VFTDBAH(x) (0x02004 + (0x40 * (x)))
+#define SXE_VFTDLEN(x) (0x02008 + (0x40 * (x)))
+#define SXE_VFTDH(x) (0x02010 + (0x40 * (x)))
+#define SXE_VFTDT(x) (0x02018 + (0x40 * (x)))
#define SXE_VFTXDCTL(x) (0x02028 + (0x40 * (x)))
#define SXE_VFTDWBAL(x) (0x02038 + (0x40 * (x)))
#define SXE_VFTDWBAH(x) (0x0203C + (0x40 * (x)))
-#define SXE_VFDCA_RXCTRL(x) (0x0100C + (0x40 * (x)))
-#define SXE_VFDCA_TXCTRL(x) (0x0200c + (0x40 * (x)))
-#define SXE_VFGPRC 0x0101C
-#define SXE_VFGPTC 0x0201C
-#define SXE_VFGORC_LSB 0x01020
-#define SXE_VFGORC_MSB 0x01024
-#define SXE_VFGOTC_LSB 0x02020
-#define SXE_VFGOTC_MSB 0x02024
-#define SXE_VFMPRC 0x01034
-#define SXE_VFMRQC 0x3000
-#define SXE_VFRSSRK(x) (0x3100 + ((x) * 4))
-#define SXE_VFRETA(x) (0x3200 + ((x) * 4))
-
-#define SXEVF_VFEIMC_IRQ_MASK (7)
-#define SXEVF_IVAR_ALLOC_VALID (0x80)
-
-#define SXEVF_EITR_CNT_WDIS (0x80000000)
-#define SXEVF_EITR_ITR_MASK (0x00000FF8)
-#define SXEVF_EITR_ITR_SHIFT (2)
-#define SXEVF_EITR_ITR_MAX (SXEVF_EITR_ITR_MASK >> SXEVF_EITR_ITR_SHIFT)
+#define SXE_VFDCA_RXCTRL(x) (0x0100C + (0x40 * (x)))
+#define SXE_VFDCA_TXCTRL(x) (0x0200c + (0x40 * (x)))
+#define SXE_VFGPRC 0x0101C
+#define SXE_VFGPTC 0x0201C
+#define SXE_VFGORC_LSB 0x01020
+#define SXE_VFGORC_MSB 0x01024
+#define SXE_VFGOTC_LSB 0x02020
+#define SXE_VFGOTC_MSB 0x02024
+#define SXE_VFMPRC 0x01034
+#define SXE_VFMRQC 0x3000
+#define SXE_VFRSSRK(x) (0x3100 + ((x) * 4))
+#define SXE_VFRETA(x) (0x3200 + ((x) * 4))
+
+#define SXEVF_VFEIMC_IRQ_MASK (7)
+#define SXEVF_IVAR_ALLOC_VALID (0x80)
+
+#define SXEVF_EITR_CNT_WDIS (0x80000000)
+#define SXEVF_EITR_ITR_MASK (0x00000FF8)
+#define SXEVF_EITR_ITR_SHIFT (2)
+#define SXEVF_EITR_ITR_MAX (SXEVF_EITR_ITR_MASK >> SXEVF_EITR_ITR_SHIFT)
#define SXE_VFRXDCTL_ENABLE 0x02000000
#define SXE_VFTXDCTL_ENABLE 0x02000000
-#define SXE_VFCTRL_RST 0x04000000
-
-#define SXEVF_RXDCTL_ENABLE 0x02000000
-#define SXEVF_RXDCTL_VME 0x40000000
-
-#define SXEVF_PSRTYPE_RQPL_SHIFT 29
-
-#define SXEVF_SRRCTL_DROP_EN 0x10000000
-#define SXEVF_SRRCTL_DESCTYPE_DATA_ONEBUF 0x02000000
-#define SXEVF_SRRCTL_BSIZEPKT_SHIFT (10)
-#define SXEVF_SRRCTL_BSIZEHDRSIZE_SHIFT (2)
-#define SXEVF_SRRCTL_BSIZEPKT_MASK 0x0000007F
-#define SXEVF_SRRCTL_BSIZEHDR_MASK 0x00003F00
-
-#define SXE_VFMAILBOX 0x002FC
-#define SXE_VFMBMEM 0x00200
-
-#define SXE_VFMAILBOX_REQ 0x00000001
-#define SXE_VFMAILBOX_ACK 0x00000002
-#define SXE_VFMAILBOX_VFU 0x00000004
-#define SXE_VFMAILBOX_PFU 0x00000008
-#define SXE_VFMAILBOX_PFSTS 0x00000010
-#define SXE_VFMAILBOX_PFACK 0x00000020
-#define SXE_VFMAILBOX_RSTI 0x00000040
-#define SXE_VFMAILBOX_RSTD 0x00000080
-#define SXE_VFMAILBOX_RC_BIT 0x000000B0
-
-#define SXEVF_TDBAL(_i) (0x02000 + ((_i) * 0x40))
-#define SXEVF_TDBAH(_i) (0x02004 + ((_i) * 0x40))
-#define SXEVF_TDLEN(_i) (0x02008 + ((_i) * 0x40))
-#define SXEVF_TDH(_i) (0x02010 + ((_i) * 0x40))
-#define SXEVF_TDT(_i) (0x02018 + ((_i) * 0x40))
-#define SXEVF_TXDCTL(_i) (0x02028 + ((_i) * 0x40))
-#define SXEVF_TDWBAL(_i) (0x02038 + ((_i) * 0x40))
-#define SXEVF_TDWBAH(_i) (0x0203C + ((_i) * 0x40))
-
-#define SXEVF_TXDCTL_SWFLSH (0x02000000)
-#define SXEVF_TXDCTL_ENABLE (0x02000000)
-
-#define SXEVF_VFGPRC 0x0101C
-#define SXEVF_VFGPTC 0x0201C
-#define SXEVF_VFGORC_LSB 0x01020
-#define SXEVF_VFGORC_MSB 0x01024
-#define SXEVF_VFGOTC_LSB 0x02020
-#define SXEVF_VFGOTC_MSB 0x02024
-#define SXEVF_VFMPRC 0x01034
-
-#define SXEVF_EICR_MASK 0x07
+#define SXE_VFCTRL_RST 0x04000000
+
+#define SXEVF_RXDCTL_ENABLE 0x02000000
+#define SXEVF_RXDCTL_VME 0x40000000
+
+#define SXEVF_PSRTYPE_RQPL_SHIFT 29
+
+#define SXEVF_SRRCTL_DROP_EN 0x10000000
+#define SXEVF_SRRCTL_DESCTYPE_DATA_ONEBUF 0x02000000
+#define SXEVF_SRRCTL_BSIZEPKT_SHIFT (10)
+#define SXEVF_SRRCTL_BSIZEHDRSIZE_SHIFT (2)
+#define SXEVF_SRRCTL_BSIZEPKT_MASK 0x0000007F
+#define SXEVF_SRRCTL_BSIZEHDR_MASK 0x00003F00
+
+#define SXE_VFMAILBOX 0x002FC
+#define SXE_VFMBMEM 0x00200
+
+#define SXE_VFMAILBOX_REQ 0x00000001
+#define SXE_VFMAILBOX_ACK 0x00000002
+#define SXE_VFMAILBOX_VFU 0x00000004
+#define SXE_VFMAILBOX_PFU 0x00000008
+#define SXE_VFMAILBOX_PFSTS 0x00000010
+#define SXE_VFMAILBOX_PFACK 0x00000020
+#define SXE_VFMAILBOX_RSTI 0x00000040
+#define SXE_VFMAILBOX_RSTD 0x00000080
+#define SXE_VFMAILBOX_RC_BIT 0x000000B0
+
+#define SXEVF_TDBAL(_i) (0x02000 + ((_i) * 0x40))
+#define SXEVF_TDBAH(_i) (0x02004 + ((_i) * 0x40))
+#define SXEVF_TDLEN(_i) (0x02008 + ((_i) * 0x40))
+#define SXEVF_TDH(_i) (0x02010 + ((_i) * 0x40))
+#define SXEVF_TDT(_i) (0x02018 + ((_i) * 0x40))
+#define SXEVF_TXDCTL(_i) (0x02028 + ((_i) * 0x40))
+#define SXEVF_TDWBAL(_i) (0x02038 + ((_i) * 0x40))
+#define SXEVF_TDWBAH(_i) (0x0203C + ((_i) * 0x40))
+
+#define SXEVF_TXDCTL_SWFLSH (0x02000000)
+#define SXEVF_TXDCTL_ENABLE (0x02000000)
+
+#define SXEVF_VFGPRC 0x0101C
+#define SXEVF_VFGPTC 0x0201C
+#define SXEVF_VFGORC_LSB 0x01020
+#define SXEVF_VFGORC_MSB 0x01024
+#define SXEVF_VFGOTC_LSB 0x02020
+#define SXEVF_VFGOTC_MSB 0x02024
+#define SXEVF_VFMPRC 0x01034
+
+#define SXEVF_EICR_MASK 0x07
#endif
@@ -16,7 +16,7 @@
typedef struct sxe_version_resp {
- U8 fw_version[SXE_VERSION_LEN];
-}sxe_version_resp_s;
+ U8 fw_version[SXE_VERSION_LEN];
+} sxe_version_resp_s;
-#endif
+#endif
@@ -11,26 +11,27 @@ extern "C" {
#include "mgc_types.h"
#include "ps3_types.h"
-typedef enum MglPortCmdSetCode{
- MGL_CMD_PORT_SET_BASE = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 0),
- MGL_CMD_PORT_SET_REG = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 1),
- MGL_CMD_PORT_SET_LED = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 2),
- MGL_CMD_SXE_SOC_HTHRESHOLD = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 3),
- MGL_CMD_SXE_SFP_HTHRESHOLD = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 4),
- MGL_CMD_SXE_SOC_RST = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 5),
- MGL_CMD_SXE_SET_MFGINFO = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 6),
- MGL_CMD_SXE_SET_INSIGHT = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 7),
- MGL_CMD_SXE_OPT_INSIGHT = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 8),
+typedef enum MglPortCmdSetCode {
+ MGL_CMD_PORT_SET_BASE = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 0),
+ MGL_CMD_PORT_SET_REG = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 1),
+ MGL_CMD_PORT_SET_LED = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 2),
+ MGL_CMD_SXE_SOC_HTHRESHOLD = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 3),
+ MGL_CMD_SXE_SFP_HTHRESHOLD = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 4),
+ MGL_CMD_SXE_SOC_RST = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 5),
+ MGL_CMD_SXE_SET_MFGINFO = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 6),
+ MGL_CMD_SXE_SET_INSIGHT = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 7),
+ MGL_CMD_SXE_OPT_INSIGHT = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 8),
+ MGL_CMD_SXE_SET_LLDPSTATE = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_SET, 9),
} MglPortCmdSetCode_e;
-typedef enum MglPortCmdGetCode{
- MGL_CMD_SXE_GET_REG = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 0),
- MGL_CMD_SXE_GET_SOC_INFO = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 1),
- MGL_CMD_SXE_LOG_EXPORT = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 2),
- MGL_CMD_SXE_REGS_DUMP = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 3),
- MGL_CMD_SXE_GET_MFGINFO = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 4),
- MGL_CMD_SXE_MAC_ADDR_GET = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 5),
- MGL_CMD_SXE_GET_INSIGHT = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 6),
+typedef enum MglPortCmdGetCode {
+ MGL_CMD_SXE_GET_REG = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 0),
+ MGL_CMD_SXE_GET_SOC_INFO = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 1),
+ MGL_CMD_SXE_LOG_EXPORT = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 2),
+ MGL_CMD_SXE_REGS_DUMP = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 3),
+ MGL_CMD_SXE_GET_MFGINFO = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 4),
+ MGL_CMD_SXE_MAC_ADDR_GET = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 5),
+ MGL_CMD_SXE_GET_INSIGHT = MGL_MK_LIMIT(MGL_All_LIMIT, MGL_CMD_PORT, MGL_CMD_GET, 6),
} MglPortCmdGetCode_e;
#if defined(__cplusplus)
@@ -9,160 +9,165 @@
#include "sxe_drv_type.h"
#endif
-#define SXE_VERION_LEN (32)
-#define SXE_MAC_NUM (128)
-#define SXE_PORT_TRANSCEIVER_LEN (32)
-#define SXE_PORT_VENDOR_LEN (32)
-#define SXE_CHIP_TYPE_LEN (32)
-#define SXE_VPD_SN_LEN (16)
-#define SXE_SOC_RST_TIME (0x93A80)
-#define SXE_SFP_TEMP_THRESHOLD_INTERVAL (3)
-#define MGC_TERMLOG_INFO_MAX_LEN (12 * 1024)
-#define SXE_REGS_DUMP_MAX_LEN (12 * 1024)
-#define SXE_PRODUCT_NAME_LEN (32)
+#define SXE_VERION_LEN (32)
+#define SXE_MAC_NUM (128)
+#define SXE_PORT_TRANSCEIVER_LEN (32)
+#define SXE_PORT_VENDOR_LEN (32)
+#define SXE_CHIP_TYPE_LEN (32)
+#define SXE_VPD_SN_LEN (16)
+#define SXE_SOC_RST_TIME (0x93A80)
+#define SXE_SFP_TEMP_THRESHOLD_INTERVAL (3)
+#define MGC_TERMLOG_INFO_MAX_LEN (12 * 1024)
+#define SXE_REGS_DUMP_MAX_LEN (12 * 1024)
+#define SXE_PRODUCT_NAME_LEN (32)
typedef enum sxe_led_mode {
- SXE_IDENTIFY_LED_BLINK_ON = 0,
- SXE_IDENTIFY_LED_BLINK_OFF,
- SXE_IDENTIFY_LED_ON,
- SXE_IDENTIFY_LED_OFF,
- SXE_IDENTIFY_LED_RESET,
+ SXE_IDENTIFY_LED_BLINK_ON = 0,
+ SXE_IDENTIFY_LED_BLINK_OFF,
+ SXE_IDENTIFY_LED_ON,
+ SXE_IDENTIFY_LED_OFF,
+ SXE_IDENTIFY_LED_RESET,
} sxe_led_mode_s;
typedef struct sxe_led_ctrl {
- U32 mode;
- U32 duration;
+ U32 mode;
+ U32 duration;
} sxe_led_ctrl_s;
typedef struct sxe_led_ctrl_resp {
- U32 ack;
+ U32 ack;
} sxe_led_ctrl_resp_s;
typedef enum PortLinkSpeed {
- PORT_LINK_NO = 0,
- PORT_LINK_100M = 1,
- PORT_LINK_1G = 2,
- PORT_LINK_10G = 3,
+ PORT_LINK_NO = 0,
+ PORT_LINK_100M = 1,
+ PORT_LINK_1G = 2,
+ PORT_LINK_10G = 3,
} PortLinkSpeed_e;
typedef struct SysSocInfo {
- S8 fwVer[SXE_VERION_LEN];
- S8 optVer[SXE_VERION_LEN];
- U8 socStatus;
- U8 pad[3];
- S32 socTemp;
- U64 chipId;
- S8 chipType[SXE_CHIP_TYPE_LEN];
- S8 pba[SXE_VPD_SN_LEN];
- S8 productName[SXE_PRODUCT_NAME_LEN];
+ S8 fwVer[SXE_VERION_LEN];
+ S8 optVer[SXE_VERION_LEN];
+ U8 socStatus;
+ U8 pad[3];
+ S32 socTemp;
+ U64 chipId;
+ S8 chipType[SXE_CHIP_TYPE_LEN];
+ S8 pba[SXE_VPD_SN_LEN];
+ S8 productName[SXE_PRODUCT_NAME_LEN];
} SysSocInfo_s;
typedef struct SysPortInfo {
- U64 mac[SXE_MAC_NUM];
- U8 isPortAbs;
- U8 linkStat;
- U8 linkSpeed;
-
-
- U8 isSfp:1;
- U8 isGetInfo:1;
- U8 rvd:6;
- S8 opticalModTemp;
- U8 pad[3];
- S8 transceiverType[SXE_PORT_TRANSCEIVER_LEN];
- S8 vendorName[SXE_PORT_VENDOR_LEN];
- S8 vendorPn[SXE_PORT_VENDOR_LEN];
+ U64 mac[SXE_MAC_NUM];
+ U8 isPortAbs;
+ U8 linkStat;
+ U8 linkSpeed;
+
+
+ U8 isSfp:1;
+ U8 isGetInfo:1;
+ U8 rvd:6;
+ S8 opticalModTemp;
+ U8 pad[3];
+ S8 transceiverType[SXE_PORT_TRANSCEIVER_LEN];
+ S8 vendorName[SXE_PORT_VENDOR_LEN];
+ S8 vendorPn[SXE_PORT_VENDOR_LEN];
} SysPortInfo_s;
typedef struct SysInfoResp {
- SysSocInfo_s socInfo;
- SysPortInfo_s portInfo;
+ SysSocInfo_s socInfo;
+ SysPortInfo_s portInfo;
} SysInfoResp_s;
typedef enum SfpTempTdMode {
- SFP_TEMP_THRESHOLD_MODE_ALARM = 0,
- SFP_TEMP_THRESHOLD_MODE_WARN,
+ SFP_TEMP_THRESHOLD_MODE_ALARM = 0,
+ SFP_TEMP_THRESHOLD_MODE_WARN,
} SfpTempTdMode_e;
-typedef struct SfpTempTdSet{
- U8 mode;
- U8 pad[3];
- S8 hthreshold;
- S8 lthreshold;
+typedef struct SfpTempTdSet {
+ U8 mode;
+ U8 pad[3];
+ S8 hthreshold;
+ S8 lthreshold;
} SfpTempTdSet_s;
typedef struct SxeLogExportResp {
- U16 curLogLen;
- U8 isEnd;
- U8 pad;
- S32 sessionId;
- S8 data[0];
+ U16 curLogLen;
+ U8 isEnd;
+ U8 pad;
+ S32 sessionId;
+ S8 data[0];
} SxeLogExportResp_s;
typedef enum SxeLogExportType {
- SXE_LOG_EXPORT_REQ = 0,
- SXE_LOG_EXPORT_FIN,
- SXE_LOG_EXPORT_ABORT,
+ SXE_LOG_EXPORT_REQ = 0,
+ SXE_LOG_EXPORT_FIN,
+ SXE_LOG_EXPORT_ABORT,
} SxeLogExportType_e;
typedef struct SxeLogExportReq {
- U8 isALLlog;
- U8 cmdtype;
- U8 isBegin;
- U8 pad;
- S32 sessionId;
- U32 logLen;
+ U8 isALLlog;
+ U8 cmdtype;
+ U8 isBegin;
+ U8 pad;
+ S32 sessionId;
+ U32 logLen;
} SxeLogExportReq_s;
typedef struct SocRstReq {
- U32 time;
+ U32 time;
} SocRstReq_s;
typedef struct RegsDumpResp {
- U32 curdwLen;
- U8 data[0];
+ U32 curdwLen;
+ U8 data[0];
} RegsDumpResp_s;
enum {
- SXE_MFG_PART_NUMBER_LEN = 8,
- SXE_MFG_SERIAL_NUMBER_LEN = 16,
- SXE_MFG_REVISION_LEN = 4,
- SXE_MFG_OEM_STR_LEN = 64,
- SXE_MFG_SXE_BOARD_ASSEMBLY_LEN = 32,
- SXE_MFG_SXE_BOARD_TRACE_NUM_LEN = 16,
- SXE_MFG_SXE_MAC_ADDR_CNT = 2,
+ SXE_MFG_PART_NUMBER_LEN = 8,
+ SXE_MFG_SERIAL_NUMBER_LEN = 16,
+ SXE_MFG_REVISION_LEN = 4,
+ SXE_MFG_OEM_STR_LEN = 64,
+ SXE_MFG_SXE_BOARD_ASSEMBLY_LEN = 32,
+ SXE_MFG_SXE_BOARD_TRACE_NUM_LEN = 16,
+ SXE_MFG_SXE_MAC_ADDR_CNT = 2,
};
typedef struct sxeMfgInfo {
- U8 partNumber[SXE_MFG_PART_NUMBER_LEN];
- U8 serialNumber [SXE_MFG_SERIAL_NUMBER_LEN];
- U32 mfgDate;
- U8 revision[SXE_MFG_REVISION_LEN];
- U32 reworkDate;
- U8 pad[4];
- U64 macAddr[SXE_MFG_SXE_MAC_ADDR_CNT];
- U8 boardTraceNum[SXE_MFG_SXE_BOARD_TRACE_NUM_LEN];
- U8 boardAssembly[SXE_MFG_SXE_BOARD_ASSEMBLY_LEN];
- U8 extra1[SXE_MFG_OEM_STR_LEN];
- U8 extra2[SXE_MFG_OEM_STR_LEN];
+ U8 partNumber[SXE_MFG_PART_NUMBER_LEN];
+ U8 serialNumber[SXE_MFG_SERIAL_NUMBER_LEN];
+ U32 mfgDate;
+ U8 revision[SXE_MFG_REVISION_LEN];
+ U32 reworkDate;
+ U8 pad[4];
+ U64 macAddr[SXE_MFG_SXE_MAC_ADDR_CNT];
+ U8 boardTraceNum[SXE_MFG_SXE_BOARD_TRACE_NUM_LEN];
+ U8 boardAssembly[SXE_MFG_SXE_BOARD_ASSEMBLY_LEN];
+ U8 extra1[SXE_MFG_OEM_STR_LEN];
+ U8 extra2[SXE_MFG_OEM_STR_LEN];
} sxeMfgInfo_t;
+typedef struct SxeLldpInfo {
+ U8 lldpState;
+ U8 pad[3];
+} SxeLldpInfo_t;
+
typedef struct RegsDumpReq {
- U32 baseAddr;
- U32 dwLen;
+ U32 baseAddr;
+ U32 dwLen;
} RegsDumpReq_s;
typedef enum sxe_pcs_mode {
- SXE_PCS_MODE_1000BASE_KX_WO = 0,
- SXE_PCS_MODE_1000BASE_KX_W,
- SXE_PCS_MODE_SGMII,
- SXE_PCS_MODE_10GBASE_KR_WO,
- SXE_PCS_MODE_AUTO_NEGT_73,
- SXE_PCS_MODE_LPBK_PHY_TX2RX,
- SXE_PCS_MODE_LPBK_PHY_RX2TX,
- SXE_PCS_MODE_LPBK_PCS_RX2TX,
- SXE_PCS_MODE_BUTT,
+ SXE_PCS_MODE_1000BASE_KX_WO = 0,
+ SXE_PCS_MODE_1000BASE_KX_W,
+ SXE_PCS_MODE_SGMII,
+ SXE_PCS_MODE_10GBASE_KR_WO,
+ SXE_PCS_MODE_AUTO_NEGT_73,
+ SXE_PCS_MODE_LPBK_PHY_TX2RX,
+ SXE_PCS_MODE_LPBK_PHY_RX2TX,
+ SXE_PCS_MODE_LPBK_PCS_RX2TX,
+ SXE_PCS_MODE_BUTT,
} sxe_pcs_mode_e;
typedef enum sxe_remote_fault_mode {
@@ -174,40 +179,40 @@ typedef enum sxe_remote_fault_mode {
} sxe_remote_fault_e;
typedef struct sxe_phy_cfg {
- sxe_pcs_mode_e mode;
- U32 mtu;
+ sxe_pcs_mode_e mode;
+ U32 mtu;
} sxe_pcs_cfg_s;
typedef enum sxe_an_speed {
- SXE_AN_SPEED_NO_LINK = 0,
- SXE_AN_SPEED_100M,
- SXE_AN_SPEED_1G,
- SXE_AN_SPEED_10G,
- SXE_AN_SPEED_UNKNOWN,
+ SXE_AN_SPEED_NO_LINK = 0,
+ SXE_AN_SPEED_100M,
+ SXE_AN_SPEED_1G,
+ SXE_AN_SPEED_10G,
+ SXE_AN_SPEED_UNKNOWN,
} sxe_an_speed_e;
typedef enum sxe_phy_pause_cap {
- SXE_PAUSE_CAP_NO_PAUSE = 0,
- SXE_PAUSE_CAP_ASYMMETRIC_PAUSE,
- SXE_PAUSE_CAP_SYMMETRIC_PAUSE,
- SXE_PAUSE_CAP_BOTH_PAUSE,
- SXE_PAUSE_CAP_UNKNOWN,
+ SXE_PAUSE_CAP_NO_PAUSE = 0,
+ SXE_PAUSE_CAP_ASYMMETRIC_PAUSE,
+ SXE_PAUSE_CAP_SYMMETRIC_PAUSE,
+ SXE_PAUSE_CAP_BOTH_PAUSE,
+ SXE_PAUSE_CAP_UNKNOWN,
} sxe_phy_pause_cap_e;
typedef enum sxe_phy_duplex_type {
- SXE_FULL_DUPLEX = 0,
- SXE_HALF_DUPLEX = 1,
- SXE_UNKNOWN_DUPLEX,
+ SXE_FULL_DUPLEX = 0,
+ SXE_HALF_DUPLEX = 1,
+ SXE_UNKNOWN_DUPLEX,
} sxe_phy_duplex_type_e;
typedef struct sxe_phy_an_cap {
- sxe_remote_fault_e remote_fault;
- sxe_phy_pause_cap_e pause_cap;
- sxe_phy_duplex_type_e duplex_cap;
+ sxe_remote_fault_e remote_fault;
+ sxe_phy_pause_cap_e pause_cap;
+ sxe_phy_duplex_type_e duplex_cap;
} sxe_phy_an_cap_s;
typedef struct sxe_an_cap {
- sxe_phy_an_cap_s local;
- sxe_phy_an_cap_s peer;
+ sxe_phy_an_cap_s local;
+ sxe_phy_an_cap_s peer;
} sxe_an_cap_s;
#endif
@@ -9,35 +9,35 @@
#include "sxe_drv_type.h"
#endif
-#define HDC_CACHE_TOTAL_LEN (16 *1024)
-#define ONE_PACKET_LEN_MAX (1024)
-#define DWORD_NUM (256)
-#define HDC_TRANS_RETRY_COUNT (3)
+#define HDC_CACHE_TOTAL_LEN (16 *1024)
+#define ONE_PACKET_LEN_MAX (1024)
+#define DWORD_NUM (256)
+#define HDC_TRANS_RETRY_COUNT (3)
typedef enum SxeHdcErrnoCode {
- PKG_OK = 0,
- PKG_ERR_REQ_LEN,
- PKG_ERR_RESP_LEN,
- PKG_ERR_PKG_SKIP,
- PKG_ERR_NODATA,
- PKG_ERR_PF_LK,
- PKG_ERR_OTHER,
+ PKG_OK = 0,
+ PKG_ERR_REQ_LEN,
+ PKG_ERR_RESP_LEN,
+ PKG_ERR_PKG_SKIP,
+ PKG_ERR_NODATA,
+ PKG_ERR_PF_LK,
+ PKG_ERR_OTHER,
} SxeHdcErrnoCode_e;
typedef union HdcHeader {
- struct {
- U8 pid:4;
- U8 errCode:4;
- U8 len;
- U16 startPkg:1;
- U16 endPkg:1;
- U16 isRd:1;
- U16 msi:1;
- U16 totalLen:12;
- } head;
- U32 dw0;
+ struct {
+ U8 pid:4;
+ U8 errCode:4;
+ U8 len;
+ U16 startPkg:1;
+ U16 endPkg:1;
+ U16 isRd:1;
+ U16 msi:1;
+ U16 totalLen:12;
+ } head;
+ U32 dw0;
} HdcHeader_u;
-#endif
+#endif
@@ -9,11 +9,11 @@
#endif
struct SxeIoctlSyncCmd {
- U64 traceid;
- void *inData;
- U32 inLen;
- void *outData;
- U32 outLen;
+ U64 traceid;
+ void *inData;
+ U32 inLen;
+ void *outData;
+ U32 outLen;
};
#define SXE_CMD_IOCTL_SYNC_CMD _IOWR('M', 1, struct SxeIoctlSyncCmd)
@@ -15,125 +15,125 @@
#define SXE_HDC_MSG_HDR_SIZE sizeof(struct sxe_hdc_drv_cmd_msg)
enum sxe_cmd_type {
- SXE_CMD_TYPE_CLI,
- SXE_CMD_TYPE_DRV,
- SXE_CMD_TYPE_UNKOWN,
+ SXE_CMD_TYPE_CLI,
+ SXE_CMD_TYPE_DRV,
+ SXE_CMD_TYPE_UNKNOWN,
};
typedef struct sxe_hdc_cmd_hdr {
- U8 cmd_type;
- U8 cmd_sub_type;
- U8 reserve[6];
+ U8 cmd_type;
+ U8 cmd_sub_type;
+ U8 reserve[6];
}sxe_hdc_cmd_hdr_s;
typedef enum SxeFWState {
- SXE_FW_START_STATE_UNDEFINED = 0x00,
- SXE_FW_START_STATE_INIT_BASE = 0x10,
- SXE_FW_START_STATE_SCAN_DEVICE = 0x20,
- SXE_FW_START_STATE_FINISHED = 0x30,
- SXE_FW_START_STATE_UPGRADE = 0x31,
- SXE_FW_RUNNING_STATE_ABNOMAL = 0x40,
- SXE_FW_START_STATE_MASK = 0xF0,
+ SXE_FW_START_STATE_UNDEFINED = 0x00,
+ SXE_FW_START_STATE_INIT_BASE = 0x10,
+ SXE_FW_START_STATE_SCAN_DEVICE = 0x20,
+ SXE_FW_START_STATE_FINISHED = 0x30,
+ SXE_FW_START_STATE_UPGRADE = 0x31,
+ SXE_FW_RUNNING_STATE_ABNOMAL = 0x40,
+ SXE_FW_START_STATE_MASK = 0xF0,
}SxeFWState_e;
typedef struct SxeFWStateInfo {
- U8 socStatus;
- char statBuff[32];
+ U8 socStatus;
+ char statBuff[32];
} SxeFWStateInfo_s;
typedef enum MsiEvt {
- MSI_EVT_SOC_STATUS = 0x1,
- MSI_EVT_HDC_FWOV = 0x2,
- MSI_EVT_HDC_TIME_SYNC = 0x4,
+ MSI_EVT_SOC_STATUS = 0x1,
+ MSI_EVT_HDC_FWOV = 0x2,
+ MSI_EVT_HDC_TIME_SYNC = 0x4,
- MSI_EVT_MAX = 0x80000000,
+ MSI_EVT_MAX = 0x80000000,
} MsiEvt_u;
typedef enum SxeFwHdcState {
- SXE_FW_HDC_TRANSACTION_IDLE = 0x01,
- SXE_FW_HDC_TRANSACTION_BUSY,
+ SXE_FW_HDC_TRANSACTION_IDLE = 0x01,
+ SXE_FW_HDC_TRANSACTION_BUSY,
- SXE_FW_HDC_TRANSACTION_ERR,
+ SXE_FW_HDC_TRANSACTION_ERR,
} SxeFwHdcState_e;
enum sxe_hdc_cmd_opcode {
- SXE_CMD_SET_WOL = 1,
- SXE_CMD_LED_CTRL,
- SXE_CMD_SFP_READ,
- SXE_CMD_SFP_WRITE,
- SXE_CMD_TX_DIS_CTRL = 5,
- SXE_CMD_TINE_SYNC,
- SXE_CMD_RATE_SELECT,
- SXE_CMD_R0_MAC_GET,
- SXE_CMD_LOG_EXPORT,
- SXE_CMD_FW_VER_GET = 10,
- SXE_CMD_PCS_SDS_INIT,
- SXE_CMD_AN_SPEED_GET,
- SXE_CMD_AN_CAP_GET,
- SXE_CMD_GET_SOC_INFO,
- SXE_CMD_MNG_RST = 15,
-
- SXE_CMD_MAX,
+ SXE_CMD_SET_WOL = 1,
+ SXE_CMD_LED_CTRL,
+ SXE_CMD_SFP_READ,
+ SXE_CMD_SFP_WRITE,
+ SXE_CMD_TX_DIS_CTRL = 5,
+ SXE_CMD_TINE_SYNC,
+ SXE_CMD_RATE_SELECT,
+ SXE_CMD_R0_MAC_GET,
+ SXE_CMD_LOG_EXPORT,
+ SXE_CMD_FW_VER_GET = 10,
+ SXE_CMD_PCS_SDS_INIT,
+ SXE_CMD_AN_SPEED_GET,
+ SXE_CMD_AN_CAP_GET,
+ SXE_CMD_GET_SOC_INFO,
+ SXE_CMD_MNG_RST = 15,
+
+ SXE_CMD_MAX,
};
enum sxe_hdc_cmd_errcode {
- SXE_ERR_INVALID_PARAM = 1,
+ SXE_ERR_INVALID_PARAM = 1,
};
typedef struct sxe_hdc_drv_cmd_msg {
- U16 opcode;
- U16 errcode;
- union dataLength {
- U16 req_len;
- U16 ack_len;
- } length;
- U8 reserve[8];
- U64 traceid;
- U8 body[0];
+ U16 opcode;
+ U16 errcode;
+ union dataLength {
+ U16 req_len;
+ U16 ack_len;
+ } length;
+ U8 reserve[8];
+ U64 traceid;
+ U8 body[0];
} sxe_hdc_drv_cmd_msg_s;
typedef struct sxe_sfp_rw_req {
- U16 offset;
- U16 len;
- U8 write_data[0];
+ U16 offset;
+ U16 len;
+ U8 write_data[0];
} sxe_sfp_rw_req_s;
typedef struct sxe_sfp_read_resp {
- U16 len;
- U8 resp[0];
+ U16 len;
+ U8 resp[0];
} sxe_sfp_read_resp_s;
-typedef enum sxe_sfp_rate{
- SXE_SFP_RATE_1G = 0,
- SXE_SFP_RATE_10G = 1,
+typedef enum sxe_sfp_rate {
+ SXE_SFP_RATE_1G = 0,
+ SXE_SFP_RATE_10G = 1,
} sxe_sfp_rate_e;
typedef struct sxe_sfp_rate_able {
- sxe_sfp_rate_e rate;
+ sxe_sfp_rate_e rate;
} sxe_sfp_rate_able_s;
typedef struct sxe_spp_tx_able {
- BOOL isDisable;
+ BOOL isDisable;
} sxe_spp_tx_able_s;
typedef struct sxe_default_mac_addr_resp {
- U8 addr[SXE_MAC_ADDR_LEN];
+ U8 addr[SXE_MAC_ADDR_LEN];
} sxe_default_mac_addr_resp_s;
typedef struct sxe_mng_rst {
- BOOL enable;
+ BOOL enable;
} sxe_mng_rst_s;
-#endif
+#endif
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (C), 2022, Linkdata Technology Co., Ltd.
*/
-
+
#ifndef __SXE_REGS_H__
#define __SXE_REGS_H__
@@ -20,9 +20,9 @@
#endif
-#define SXE_CTRL 0x00000
-#define SXE_STATUS 0x00008
-#define SXE_CTRL_EXT 0x00018
+#define SXE_CTRL 0x00000
+#define SXE_STATUS 0x00008
+#define SXE_CTRL_EXT 0x00018
#define SXE_CTRL_LNK_RST 0x00000008
@@ -57,7 +57,7 @@
#define SXE_FCCFG_TFCE_PRIORITY 0x00000010
-#define SXE_GCR_EXT 0x11050
+#define SXE_GCR_EXT 0x11050
#define SXE_GCR_CMPL_TMOUT_MASK 0x0000F000
@@ -117,7 +117,7 @@
#define SXE_EIMC_EX(i) (0x00AB0 + (i) * 4)
#define SXE_EIAM_EX(i) (0x00AD0 + (i) * 4)
#define SXE_EITR(i) (((i) <= 23) ? (0x00820 + ((i) * 4)) : \
- (0x012300 + (((i) - 24) * 4)))
+ (0x012300 + (((i) - 24) * 4)))
#define SXE_SPP_PROC 0x00AD8
#define SXE_SPP_STATE 0x00AF4
@@ -136,13 +136,13 @@
#define SXE_EICS_RTX_QUEUE SXE_EICR_RTX_QUEUE
-#define SXE_EICS_FLOW_NAV SXE_EICR_FLOW_NAV
-#define SXE_EICS_MAILBOX SXE_EICR_MAILBOX
-#define SXE_EICS_LSC SXE_EICR_LSC
-#define SXE_EICS_ECC SXE_EICR_ECC
-#define SXE_EICS_HDC SXE_EICR_HDC
+#define SXE_EICS_FLOW_NAV SXE_EICR_FLOW_NAV
+#define SXE_EICS_MAILBOX SXE_EICR_MAILBOX
+#define SXE_EICS_LSC SXE_EICR_LSC
+#define SXE_EICS_ECC SXE_EICR_ECC
+#define SXE_EICS_HDC SXE_EICR_HDC
#define SXE_EICS_TCP_TIMER SXE_EICR_TCP_TIMER
-#define SXE_EICS_OTHER SXE_EICR_OTHER
+#define SXE_EICS_OTHER SXE_EICR_OTHER
#define SXE_EIMS_RTX_QUEUE SXE_EICR_RTX_QUEUE
@@ -156,9 +156,9 @@
#define SXE_EIMS_ENABLE_MASK (SXE_EIMS_RTX_QUEUE | SXE_EIMS_LSC | \
SXE_EIMS_TCP_TIMER | SXE_EIMS_OTHER)
-#define SXE_EIMC_FLOW_NAV SXE_EICR_FLOW_NAV
-#define SXE_EIMC_LSC SXE_EICR_LSC
-#define SXE_EIMC_HDC SXE_EICR_HDC
+#define SXE_EIMC_FLOW_NAV SXE_EICR_FLOW_NAV
+#define SXE_EIMC_LSC SXE_EICR_LSC
+#define SXE_EIMC_HDC SXE_EICR_HDC
#define SXE_GPIE_SPP0_EN 0x00000001
@@ -204,7 +204,7 @@
#define SXE_RXCSUM 0x05000
#define SXE_RFCTL 0x05008
#define SXE_FCTRL 0x05080
-#define SXE_EXVET 0x05078
+#define SXE_EXVET 0x05078
#define SXE_VLNCTRL 0x05088
#define SXE_MCSTCTRL 0x05090
#define SXE_ETQF(_i) (0x05128 + ((_i) * 4))
@@ -218,8 +218,8 @@
#define SXE_MPSAR_LOW(_i) (0x0A600 + ((_i) * 8))
#define SXE_MPSAR_HIGH(_i) (0x0A604 + ((_i) * 8))
#define SXE_PSRTYPE(_i) (0x0EA00 + ((_i) * 4))
-#define SXE_RETA(_i) (0x0EB00 + ((_i) * 4))
-#define SXE_RSSRK(_i) (0x0EB80 + ((_i) * 4))
+#define SXE_RETA(_i) (0x0EB00 + ((_i) * 4))
+#define SXE_RSSRK(_i) (0x0EB80 + ((_i) * 4))
#define SXE_RQTC 0x0EC70
#define SXE_MRQC 0x0EC80
#define SXE_IEOI 0x0F654
@@ -242,8 +242,8 @@
#define SXE_LPL_DEFAULT 0x26000000
-#define SXE_RXCSUM_IPPCSE 0x00001000
-#define SXE_RXCSUM_PCSD 0x00002000
+#define SXE_RXCSUM_IPPCSE 0x00001000
+#define SXE_RXCSUM_PCSD 0x00002000
#define SXE_RFCTL_LRO_DIS 0x00000020
@@ -259,14 +259,14 @@
#define SXE_FCTRL_DPF 0x00002000
-#define SXE_VLNCTRL_VET 0x0000FFFF
-#define SXE_VLNCTRL_CFI 0x10000000
-#define SXE_VLNCTRL_CFIEN 0x20000000
-#define SXE_VLNCTRL_VFE 0x40000000
-#define SXE_VLNCTRL_VME 0x80000000
+#define SXE_VLNCTRL_VET 0x0000FFFF
+#define SXE_VLNCTRL_CFI 0x10000000
+#define SXE_VLNCTRL_CFIEN 0x20000000
+#define SXE_VLNCTRL_VFE 0x40000000
+#define SXE_VLNCTRL_VME 0x80000000
-#define SXE_EXVET_VET_EXT_SHIFT 16
-#define SXE_EXTENDED_VLAN (1 << 26)
+#define SXE_EXVET_VET_EXT_SHIFT 16
+#define SXE_EXTENDED_VLAN (1 << 26)
#define SXE_MCSTCTRL_MFE 4
@@ -290,10 +290,10 @@
#define SXE_ETQS_QUEUE_EN 0x80000000
-#define SXE_SYN_FILTER_ENABLE 0x00000001
-#define SXE_SYN_FILTER_QUEUE 0x000000FE
-#define SXE_SYN_FILTER_QUEUE_SHIFT 1
-#define SXE_SYN_FILTER_SYNQFP 0x80000000
+#define SXE_SYN_FILTER_ENABLE 0x00000001
+#define SXE_SYN_FILTER_QUEUE 0x000000FE
+#define SXE_SYN_FILTER_QUEUE_SHIFT 1
+#define SXE_SYN_FILTER_SYNQFP 0x80000000
#define SXE_RAH_VIND_MASK 0x003C0000
@@ -309,26 +309,26 @@
#define SXE_PSRTYPE_L2HDR 0x00001000
-#define SXE_MRQC_RSSEN 0x00000001
-#define SXE_MRQC_MRQE_MASK 0xF
-#define SXE_MRQC_RT8TCEN 0x00000002
-#define SXE_MRQC_RT4TCEN 0x00000003
-#define SXE_MRQC_RTRSS8TCEN 0x00000004
-#define SXE_MRQC_RTRSS4TCEN 0x00000005
-#define SXE_MRQC_VMDQEN 0x00000008
-#define SXE_MRQC_VMDQRSS32EN 0x0000000A
-#define SXE_MRQC_VMDQRSS64EN 0x0000000B
-#define SXE_MRQC_VMDQRT8TCEN 0x0000000C
-#define SXE_MRQC_VMDQRT4TCEN 0x0000000D
-#define SXE_MRQC_RSS_FIELD_MASK 0xFFFF0000
-#define SXE_MRQC_RSS_FIELD_IPV4_TCP 0x00010000
-#define SXE_MRQC_RSS_FIELD_IPV4 0x00020000
+#define SXE_MRQC_RSSEN 0x00000001
+#define SXE_MRQC_MRQE_MASK 0xF
+#define SXE_MRQC_RT8TCEN 0x00000002
+#define SXE_MRQC_RT4TCEN 0x00000003
+#define SXE_MRQC_RTRSS8TCEN 0x00000004
+#define SXE_MRQC_RTRSS4TCEN 0x00000005
+#define SXE_MRQC_VMDQEN 0x00000008
+#define SXE_MRQC_VMDQRSS32EN 0x0000000A
+#define SXE_MRQC_VMDQRSS64EN 0x0000000B
+#define SXE_MRQC_VMDQRT8TCEN 0x0000000C
+#define SXE_MRQC_VMDQRT4TCEN 0x0000000D
+#define SXE_MRQC_RSS_FIELD_MASK 0xFFFF0000
+#define SXE_MRQC_RSS_FIELD_IPV4_TCP 0x00010000
+#define SXE_MRQC_RSS_FIELD_IPV4 0x00020000
#define SXE_MRQC_RSS_FIELD_IPV6_EX_TCP 0x00040000
-#define SXE_MRQC_RSS_FIELD_IPV6_EX 0x00080000
-#define SXE_MRQC_RSS_FIELD_IPV6 0x00100000
-#define SXE_MRQC_RSS_FIELD_IPV6_TCP 0x00200000
-#define SXE_MRQC_RSS_FIELD_IPV4_UDP 0x00400000
-#define SXE_MRQC_RSS_FIELD_IPV6_UDP 0x00800000
+#define SXE_MRQC_RSS_FIELD_IPV6_EX 0x00080000
+#define SXE_MRQC_RSS_FIELD_IPV6 0x00100000
+#define SXE_MRQC_RSS_FIELD_IPV6_TCP 0x00200000
+#define SXE_MRQC_RSS_FIELD_IPV4_UDP 0x00400000
+#define SXE_MRQC_RSS_FIELD_IPV6_UDP 0x00800000
#define SXE_MRQC_RSS_FIELD_IPV6_EX_UDP 0x01000000
@@ -348,9 +348,9 @@
(0x0D028 + (((_i) - 64) * 0x40)))
#define SXE_LROCTL(_i) (((_i) < 64) ? (0x0102C + ((_i) * 0x40)) : \
(0x0D02C + (((_i) - 64) * 0x40)))
-#define SXE_RDRXCTL 0x02F00
-#define SXE_RXCTRL 0x03000
-#define SXE_LRODBU 0x03028
+#define SXE_RDRXCTL 0x02F00
+#define SXE_RXCTRL 0x03000
+#define SXE_LRODBU 0x03028
#define SXE_RXPBSIZE(_i) (0x03C00 + ((_i) * 4))
#define SXE_DRXCFG (0x03C20)
@@ -370,9 +370,9 @@
#define SXE_SRRCTL_BSIZEHDR_MASK 0x00003F00
-#define SXE_RXDCTL_ENABLE 0x02000000
-#define SXE_RXDCTL_SWFLSH 0x04000000
-#define SXE_RXDCTL_VME 0x40000000
+#define SXE_RXDCTL_ENABLE 0x02000000
+#define SXE_RXDCTL_SWFLSH 0x04000000
+#define SXE_RXDCTL_VME 0x40000000
#define SXE_RXDCTL_DESC_FIFO_AE_TH_SHIFT 8
#define SXE_RXDCTL_PREFETCH_NUM_CFG_SHIFT 16
@@ -409,11 +409,11 @@
#define SXE_LRODBU_LROACKDIS 0x00000080
-#define SXE_DRXCFG_GSP_ZERO 0x00000002
+#define SXE_DRXCFG_GSP_ZERO 0x00000002
#define SXE_DRXCFG_DBURX_START 0x00000001
-#define SXE_DMATXCTL 0x04A80
+#define SXE_DMATXCTL 0x04A80
#define SXE_TDBAL(_i) (0x06000 + ((_i) * 0x40))
#define SXE_TDBAH(_i) (0x06004 + ((_i) * 0x40))
#define SXE_TDLEN(_i) (0x06008 + ((_i) * 0x40))
@@ -424,25 +424,25 @@
#define SXE_PVFTDWBAH(p) (0x0603C + (0x40 * (p)))
#define SXE_TXPBSIZE(_i) (0x0CC00 + ((_i) * 4))
#define SXE_TXPBTHRESH(_i) (0x04950 + ((_i) * 4))
-#define SXE_MTQC 0x08120
-#define SXE_TXPBFCS 0x0CE00
-#define SXE_DTXCFG 0x0CE08
-#define SXE_DTMPCNT 0x0CE98
+#define SXE_MTQC 0x08120
+#define SXE_TXPBFCS 0x0CE00
+#define SXE_DTXCFG 0x0CE08
+#define SXE_DTMPCNT 0x0CE98
#define SXE_DMATXCTL_DEFAULT 0x81000000
-#define SXE_DMATXCTL_TE 0x1
-#define SXE_DMATXCTL_GDV 0x8
-#define SXE_DMATXCTL_VT_SHIFT 16
-#define SXE_DMATXCTL_VT_MASK 0xFFFF0000
+#define SXE_DMATXCTL_TE 0x1
+#define SXE_DMATXCTL_GDV 0x8
+#define SXE_DMATXCTL_VT_SHIFT 16
+#define SXE_DMATXCTL_VT_MASK 0xFFFF0000
#define SXE_TXDCTL_HTHRESH_SHIFT 8
#define SXE_TXDCTL_WTHRESH_SHIFT 16
-#define SXE_TXDCTL_ENABLE 0x02000000
-#define SXE_TXDCTL_SWFLSH 0x04000000
+#define SXE_TXDCTL_ENABLE 0x02000000
+#define SXE_TXDCTL_SWFLSH 0x04000000
#define SXE_PVFTDWBAL_N(ring_per_pool, vf_idx, vf_ring_idx) \
SXE_PVFTDWBAL((ring_per_pool) * (vf_idx) + vf_ring_idx)
@@ -470,7 +470,7 @@
#define SXE_TFCS_PB_MASK 0xff
-#define SXE_DTXCFG_DBUTX_START 0x00000001
+#define SXE_DTXCFG_DBUTX_START 0x00000001
#define SXE_DTXCFG_DBUTX_BUF_ALFUL_CFG 0x20
@@ -494,7 +494,7 @@
#define SXE_RTRPT4C_MCL_SHIFT 12
-#define SXE_RTRPT4C_BWG_SHIFT 9
+#define SXE_RTRPT4C_BWG_SHIFT 9
#define SXE_RTRPT4C_GSP 0x40000000
#define SXE_RTRPT4C_LSP 0x80000000
@@ -537,40 +537,40 @@
#define SXE_RTTPCS_ARBDIS 0x00000040
#define SXE_RTTPCS_TPRM 0x00000100
#define SXE_RTTPCS_ARBD_SHIFT 22
-#define SXE_RTTPCS_ARBD_DCB 0x4
+#define SXE_RTTPCS_ARBD_DCB 0x4
#define SXE_RTTPT2C_MCL_SHIFT 12
#define SXE_RTTPT2C_BWG_SHIFT 9
-#define SXE_RTTPT2C_GSP 0x40000000
-#define SXE_RTTPT2C_LSP 0x80000000
+#define SXE_RTTPT2C_GSP 0x40000000
+#define SXE_RTTPT2C_LSP 0x80000000
#define SXE_TPH_CTRL 0x11074
-#define SXE_TPH_TXCTRL(_i) (0x0600C + ((_i) * 0x40))
+#define SXE_TPH_TXCTRL(_i) (0x0600C + ((_i) * 0x40))
#define SXE_TPH_RXCTRL(_i) (((_i) < 64) ? (0x0100C + ((_i) * 0x40)) : \
(0x0D00C + (((_i) - 64) * 0x40)))
#define SXE_TPH_CTRL_ENABLE 0x00000000
#define SXE_TPH_CTRL_DISABLE 0x00000001
-#define SXE_TPH_CTRL_MODE_CB1 0x00
-#define SXE_TPH_CTRL_MODE_CB2 0x02
+#define SXE_TPH_CTRL_MODE_CB1 0x00
+#define SXE_TPH_CTRL_MODE_CB2 0x02
-#define SXE_TPH_RXCTRL_DESC_TPH_EN BIT(5)
-#define SXE_TPH_RXCTRL_HEAD_TPH_EN BIT(6)
-#define SXE_TPH_RXCTRL_DATA_TPH_EN BIT(7)
-#define SXE_TPH_RXCTRL_DESC_RRO_EN BIT(9)
+#define SXE_TPH_RXCTRL_DESC_TPH_EN BIT(5)
+#define SXE_TPH_RXCTRL_HEAD_TPH_EN BIT(6)
+#define SXE_TPH_RXCTRL_DATA_TPH_EN BIT(7)
+#define SXE_TPH_RXCTRL_DESC_RRO_EN BIT(9)
#define SXE_TPH_RXCTRL_DATA_WRO_EN BIT(13)
#define SXE_TPH_RXCTRL_HEAD_WRO_EN BIT(15)
-#define SXE_TPH_RXCTRL_CPUID_SHIFT 24
+#define SXE_TPH_RXCTRL_CPUID_SHIFT 24
-#define SXE_TPH_TXCTRL_DESC_TPH_EN BIT(5)
-#define SXE_TPH_TXCTRL_DESC_RRO_EN BIT(9)
+#define SXE_TPH_TXCTRL_DESC_TPH_EN BIT(5)
+#define SXE_TPH_TXCTRL_DESC_RRO_EN BIT(9)
#define SXE_TPH_TXCTRL_DESC_WRO_EN BIT(11)
#define SXE_TPH_TXCTRL_DATA_RRO_EN BIT(13)
-#define SXE_TPH_TXCTRL_CPUID_SHIFT 24
+#define SXE_TPH_TXCTRL_CPUID_SHIFT 24
#define SXE_SECTXCTRL 0x08800
@@ -579,18 +579,18 @@
#define SXE_SECTXMINIFG 0x08810
#define SXE_SECRXCTRL 0x08D00
#define SXE_SECRXSTAT 0x08D04
-#define SXE_LSECTXCTRL 0x08A04
-#define SXE_LSECTXSCL 0x08A08
-#define SXE_LSECTXSCH 0x08A0C
-#define SXE_LSECTXSA 0x08A10
-#define SXE_LSECTXPN(_n) (0x08A14 + (4 * (_n)))
-#define SXE_LSECTXKEY(_n, _m) (0x08A1C + ((0x10 * (_n)) + (4 * (_m))))
-#define SXE_LSECRXCTRL 0x08B04
-#define SXE_LSECRXSCL 0x08B08
-#define SXE_LSECRXSCH 0x08B0C
-#define SXE_LSECRXSA(_i) (0x08B10 + (4 * (_i)))
-#define SXE_LSECRXPN(_i) (0x08B18 + (4 * (_i)))
-#define SXE_LSECRXKEY(_n, _m) (0x08B20 + ((0x10 * (_n)) + (4 * (_m))))
+#define SXE_LSECTXCTRL 0x08A04
+#define SXE_LSECTXSCL 0x08A08
+#define SXE_LSECTXSCH 0x08A0C
+#define SXE_LSECTXSA 0x08A10
+#define SXE_LSECTXPN(_n) (0x08A14 + (4 * (_n)))
+#define SXE_LSECTXKEY(_n, _m) (0x08A1C + ((0x10 * (_n)) + (4 * (_m))))
+#define SXE_LSECRXCTRL 0x08B04
+#define SXE_LSECRXSCL 0x08B08
+#define SXE_LSECRXSCH 0x08B0C
+#define SXE_LSECRXSA(_i) (0x08B10 + (4 * (_i)))
+#define SXE_LSECRXPN(_i) (0x08B18 + (4 * (_i)))
+#define SXE_LSECRXKEY(_n, _m) (0x08B20 + ((0x10 * (_n)) + (4 * (_m))))
#define SXE_SECTXCTRL_SECTX_DIS 0x00000001
@@ -605,7 +605,7 @@
#define SXE_SECRXCTRL_SECRX_DIS 0x00000001
#define SXE_SECRXCTRL_RX_DIS 0x00000002
-#define SXE_SECRXCTRL_RP 0x00000080
+#define SXE_SECRXCTRL_RP 0x00000080
#define SXE_SECRXSTAT_SECRX_RDY 0x00000001
@@ -614,41 +614,41 @@
#define SXE_SECTX_DCB_ENABLE_MASK 0x00001F00
-#define SXE_LSECTXCTRL_EN_MASK 0x00000003
-#define SXE_LSECTXCTRL_EN_SHIFT 0
-#define SXE_LSECTXCTRL_ES 0x00000010
-#define SXE_LSECTXCTRL_AISCI 0x00000020
+#define SXE_LSECTXCTRL_EN_MASK 0x00000003
+#define SXE_LSECTXCTRL_EN_SHIFT 0
+#define SXE_LSECTXCTRL_ES 0x00000010
+#define SXE_LSECTXCTRL_AISCI 0x00000020
#define SXE_LSECTXCTRL_PNTHRSH_MASK 0xFFFFFF00
#define SXE_LSECTXCTRL_PNTHRSH_SHIFT 8
-#define SXE_LSECTXCTRL_RSV_MASK 0x000000D8
+#define SXE_LSECTXCTRL_RSV_MASK 0x000000D8
-#define SXE_LSECRXCTRL_EN_MASK 0x0000000C
-#define SXE_LSECRXCTRL_EN_SHIFT 2
-#define SXE_LSECRXCTRL_DROP_EN 0x00000010
+#define SXE_LSECRXCTRL_EN_MASK 0x0000000C
+#define SXE_LSECRXCTRL_EN_SHIFT 2
+#define SXE_LSECRXCTRL_DROP_EN 0x00000010
#define SXE_LSECRXCTRL_DROP_EN_SHIFT 4
-#define SXE_LSECRXCTRL_PLSH 0x00000040
-#define SXE_LSECRXCTRL_PLSH_SHIFT 6
-#define SXE_LSECRXCTRL_RP 0x00000080
-#define SXE_LSECRXCTRL_RP_SHIFT 7
-#define SXE_LSECRXCTRL_RSV_MASK 0xFFFFFF33
-
-#define SXE_LSECTXSA_AN0_MASK 0x00000003
-#define SXE_LSECTXSA_AN0_SHIFT 0
-#define SXE_LSECTXSA_AN1_MASK 0x0000000C
-#define SXE_LSECTXSA_AN1_SHIFT 2
-#define SXE_LSECTXSA_SELSA 0x00000010
-#define SXE_LSECTXSA_SELSA_SHIFT 4
-#define SXE_LSECTXSA_ACTSA 0x00000020
-
-#define SXE_LSECRXSA_AN_MASK 0x00000003
-#define SXE_LSECRXSA_AN_SHIFT 0
-#define SXE_LSECRXSA_SAV 0x00000004
-#define SXE_LSECRXSA_SAV_SHIFT 2
-#define SXE_LSECRXSA_RETIRED 0x00000010
-#define SXE_LSECRXSA_RETIRED_SHIFT 4
-
-#define SXE_LSECRXSCH_PI_MASK 0xFFFF0000
-#define SXE_LSECRXSCH_PI_SHIFT 16
+#define SXE_LSECRXCTRL_PLSH 0x00000040
+#define SXE_LSECRXCTRL_PLSH_SHIFT 6
+#define SXE_LSECRXCTRL_RP 0x00000080
+#define SXE_LSECRXCTRL_RP_SHIFT 7
+#define SXE_LSECRXCTRL_RSV_MASK 0xFFFFFF33
+
+#define SXE_LSECTXSA_AN0_MASK 0x00000003
+#define SXE_LSECTXSA_AN0_SHIFT 0
+#define SXE_LSECTXSA_AN1_MASK 0x0000000C
+#define SXE_LSECTXSA_AN1_SHIFT 2
+#define SXE_LSECTXSA_SELSA 0x00000010
+#define SXE_LSECTXSA_SELSA_SHIFT 4
+#define SXE_LSECTXSA_ACTSA 0x00000020
+
+#define SXE_LSECRXSA_AN_MASK 0x00000003
+#define SXE_LSECRXSA_AN_SHIFT 0
+#define SXE_LSECRXSA_SAV 0x00000004
+#define SXE_LSECRXSA_SAV_SHIFT 2
+#define SXE_LSECRXSA_RETIRED 0x00000010
+#define SXE_LSECRXSA_RETIRED_SHIFT 4
+
+#define SXE_LSECRXSCH_PI_MASK 0xFFFF0000
+#define SXE_LSECRXSCH_PI_SHIFT 16
#define SXE_LSECTXCTRL_DISABLE 0x0
#define SXE_LSECTXCTRL_AUTH 0x1
@@ -658,7 +658,7 @@
#define SXE_LSECRXCTRL_CHECK 0x1
#define SXE_LSECRXCTRL_STRICT 0x2
#define SXE_LSECRXCTRL_DROP 0x3
-#define SXE_SECTXCTRL_STORE_FORWARD_ENABLE 0x4
+#define SXE_SECTXCTRL_STORE_FORWARD_ENABLE 0x4
@@ -757,34 +757,34 @@
#define SXE_PXOFFRXCNT(_i) (0x04160 + ((_i) * 4))
#define SXE_EPC_GPRC 0x050E0
-#define SXE_RXDGPC 0x02F50
-#define SXE_RXDGBCL 0x02F54
-#define SXE_RXDGBCH 0x02F58
-#define SXE_RXDDGPC 0x02F5C
-#define SXE_RXDDGBCL 0x02F60
-#define SXE_RXDDGBCH 0x02F64
-#define SXE_RXLPBKGPC 0x02F68
-#define SXE_RXLPBKGBCL 0x02F6C
-#define SXE_RXLPBKGBCH 0x02F70
-#define SXE_RXDLPBKGPC 0x02F74
-#define SXE_RXDLPBKGBCL 0x02F78
-#define SXE_RXDLPBKGBCH 0x02F7C
-
-#define SXE_RXTPCIN 0x02F88
-#define SXE_RXTPCOUT 0x02F8C
-#define SXE_RXPRDDC 0x02F9C
+#define SXE_RXDGPC 0x02F50
+#define SXE_RXDGBCL 0x02F54
+#define SXE_RXDGBCH 0x02F58
+#define SXE_RXDDGPC 0x02F5C
+#define SXE_RXDDGBCL 0x02F60
+#define SXE_RXDDGBCH 0x02F64
+#define SXE_RXLPBKGPC 0x02F68
+#define SXE_RXLPBKGBCL 0x02F6C
+#define SXE_RXLPBKGBCH 0x02F70
+#define SXE_RXDLPBKGPC 0x02F74
+#define SXE_RXDLPBKGBCL 0x02F78
+#define SXE_RXDLPBKGBCH 0x02F7C
+
+#define SXE_RXTPCIN 0x02F88
+#define SXE_RXTPCOUT 0x02F8C
+#define SXE_RXPRDDC 0x02F9C
#define SXE_TXDGPC 0x087A0
-#define SXE_TXDGBCL 0x087A4
-#define SXE_TXDGBCH 0x087A8
-#define SXE_TXSWERR 0x087B0
-#define SXE_TXSWITCH 0x087B4
-#define SXE_TXREPEAT 0x087B8
-#define SXE_TXDESCERR 0x087BC
+#define SXE_TXDGBCL 0x087A4
+#define SXE_TXDGBCH 0x087A8
+#define SXE_TXSWERR 0x087B0
+#define SXE_TXSWITCH 0x087B4
+#define SXE_TXREPEAT 0x087B8
+#define SXE_TXDESCERR 0x087BC
#define SXE_MNGPRC 0x040B4
#define SXE_MNGPDC 0x040B8
-#define SXE_RQSMR(_i) (0x02300 + ((_i) * 4))
-#define SXE_TQSM(_i) (0x08600 + ((_i) * 4))
+#define SXE_RQSMR(_i) (0x02300 + ((_i) * 4))
+#define SXE_TQSM(_i) (0x08600 + ((_i) * 4))
#define SXE_QPRC(_i) (0x01030 + ((_i) * 0x40))
#define SXE_QBRC_L(_i) (0x01034 + ((_i) * 0x40))
#define SXE_QBRC_H(_i) (0x01038 + ((_i) * 0x40))
@@ -792,9 +792,9 @@
#define SXE_QPRDC(_i) (0x01430 + ((_i) * 0x40))
#define SXE_QPTC(_i) (0x08680 + ((_i) * 0x4))
-#define SXE_QBTC_L(_i) (0x08700 + ((_i) * 0x8))
-#define SXE_QBTC_H(_i) (0x08704 + ((_i) * 0x8))
-#define SXE_SSVPC 0x08780
+#define SXE_QBTC_L(_i) (0x08700 + ((_i) * 0x8))
+#define SXE_QBTC_H(_i) (0x08704 + ((_i) * 0x8))
+#define SXE_SSVPC 0x08780
#define SXE_MNGPTC 0x0CF90
#define SXE_MPC(_i) (0x03FA0 + ((_i) * 4))
@@ -808,91 +808,91 @@
-#define SXE_WUC 0x05800
-#define SXE_WUFC 0x05808
-#define SXE_WUS 0x05810
-#define SXE_IP6AT(_i) (0x05880 + ((_i) * 4))
+#define SXE_WUC 0x05800
+#define SXE_WUFC 0x05808
+#define SXE_WUS 0x05810
+#define SXE_IP6AT(_i) (0x05880 + ((_i) * 4))
-#define SXE_IP6AT_CNT 4
+#define SXE_IP6AT_CNT 4
-#define SXE_WUC_PME_EN 0x00000002
-#define SXE_WUC_PME_STATUS 0x00000004
-#define SXE_WUC_WKEN 0x00000010
-#define SXE_WUC_APME 0x00000020
+#define SXE_WUC_PME_EN 0x00000002
+#define SXE_WUC_PME_STATUS 0x00000004
+#define SXE_WUC_WKEN 0x00000010
+#define SXE_WUC_APME 0x00000020
-#define SXE_WUFC_LNKC 0x00000001
-#define SXE_WUFC_MAG 0x00000002
-#define SXE_WUFC_EX 0x00000004
-#define SXE_WUFC_MC 0x00000008
-#define SXE_WUFC_BC 0x00000010
-#define SXE_WUFC_ARP 0x00000020
-#define SXE_WUFC_IPV4 0x00000040
-#define SXE_WUFC_IPV6 0x00000080
-#define SXE_WUFC_MNG 0x00000100
+#define SXE_WUFC_LNKC 0x00000001
+#define SXE_WUFC_MAG 0x00000002
+#define SXE_WUFC_EX 0x00000004
+#define SXE_WUFC_MC 0x00000008
+#define SXE_WUFC_BC 0x00000010
+#define SXE_WUFC_ARP 0x00000020
+#define SXE_WUFC_IPV4 0x00000040
+#define SXE_WUFC_IPV6 0x00000080
+#define SXE_WUFC_MNG 0x00000100
-#define SXE_TSCTRL 0x14800
-#define SXE_TSES 0x14804
-#define SXE_TSYNCTXCTL 0x14810
-#define SXE_TSYNCRXCTL 0x14820
-#define SXE_RXSTMPL 0x14824
-#define SXE_RXSTMPH 0x14828
-#define SXE_SYSTIML 0x14840
-#define SXE_SYSTIMM 0x14844
-#define SXE_SYSTIMH 0x14848
-#define SXE_TIMADJL 0x14850
-#define SXE_TIMADJH 0x14854
-#define SXE_TIMINC 0x14860
+#define SXE_TSCTRL 0x14800
+#define SXE_TSES 0x14804
+#define SXE_TSYNCTXCTL 0x14810
+#define SXE_TSYNCRXCTL 0x14820
+#define SXE_RXSTMPL 0x14824
+#define SXE_RXSTMPH 0x14828
+#define SXE_SYSTIML 0x14840
+#define SXE_SYSTIMM 0x14844
+#define SXE_SYSTIMH 0x14848
+#define SXE_TIMADJL 0x14850
+#define SXE_TIMADJH 0x14854
+#define SXE_TIMINC 0x14860
-#define SXE_TSYNCTXCTL_TXTT 0x0001
-#define SXE_TSYNCTXCTL_TEN 0x0010
+#define SXE_TSYNCTXCTL_TXTT 0x0001
+#define SXE_TSYNCTXCTL_TEN 0x0010
-#define SXE_TSYNCRXCTL_RXTT 0x0001
-#define SXE_TSYNCRXCTL_REN 0x0010
+#define SXE_TSYNCRXCTL_RXTT 0x0001
+#define SXE_TSYNCRXCTL_REN 0x0010
-#define SXE_TSCTRL_TSSEL 0x00001
-#define SXE_TSCTRL_TSEN 0x00002
-#define SXE_TSCTRL_VER_2 0x00010
-#define SXE_TSCTRL_ONESTEP 0x00100
-#define SXE_TSCTRL_CSEN 0x01000
-#define SXE_TSCTRL_PTYP_ALL 0x00C00
+#define SXE_TSCTRL_TSSEL 0x00001
+#define SXE_TSCTRL_TSEN 0x00002
+#define SXE_TSCTRL_VER_2 0x00010
+#define SXE_TSCTRL_ONESTEP 0x00100
+#define SXE_TSCTRL_CSEN 0x01000
+#define SXE_TSCTRL_PTYP_ALL 0x00C00
#define SXE_TSCTRL_L4_UNICAST 0x08000
-#define SXE_TSES_TXES 0x00200
-#define SXE_TSES_RXES 0x00800
-#define SXE_TSES_TXES_V1_SYNC 0x00000
-#define SXE_TSES_TXES_V1_DELAY_REQ 0x00100
-#define SXE_TSES_TXES_V1_ALL 0x00200
-#define SXE_TSES_RXES_V1_SYNC 0x00000
-#define SXE_TSES_RXES_V1_DELAY_REQ 0x00400
-#define SXE_TSES_RXES_V1_ALL 0x00800
-#define SXE_TSES_TXES_V2_ALL 0x00200
-#define SXE_TSES_RXES_V2_ALL 0x00800
+#define SXE_TSES_TXES 0x00200
+#define SXE_TSES_RXES 0x00800
+#define SXE_TSES_TXES_V1_SYNC 0x00000
+#define SXE_TSES_TXES_V1_DELAY_REQ 0x00100
+#define SXE_TSES_TXES_V1_ALL 0x00200
+#define SXE_TSES_RXES_V1_SYNC 0x00000
+#define SXE_TSES_RXES_V1_DELAY_REQ 0x00400
+#define SXE_TSES_RXES_V1_ALL 0x00800
+#define SXE_TSES_TXES_V2_ALL 0x00200
+#define SXE_TSES_RXES_V2_ALL 0x00800
-#define SXE_IV_SNS 0
-#define SXE_IV_NS 8
-#define SXE_INCPD 0
-#define SXE_BASE_INCVAL 8
+#define SXE_IV_SNS 0
+#define SXE_IV_NS 8
+#define SXE_INCPD 0
+#define SXE_BASE_INCVAL 8
#define SXE_VT_CTL 0x051B0
#define SXE_PFMAILBOX(_i) (0x04B00 + (4 * (_i)))
#define SXE_PFMBICR(_i) (0x00710 + (4 * (_i)))
-#define SXE_VFLRE(i) ((i & 1)? 0x001C0 : 0x00600)
+#define SXE_VFLRE(i) ((i & 1) ? 0x001C0 : 0x00600)
#define SXE_VFLREC(i) (0x00700 + (i * 4))
#define SXE_VFRE(_i) (0x051E0 + ((_i) * 4))
#define SXE_VFTE(_i) (0x08110 + ((_i) * 4))
-#define SXE_QDE (0x02F04)
+#define SXE_QDE (0x02F04)
#define SXE_SPOOF(_i) (0x08200 + (_i) * 4)
#define SXE_PFDTXGSWC 0x08220
#define SXE_VMVIR(_i) (0x08000 + ((_i) * 4))
@@ -900,7 +900,7 @@
#define SXE_VLVF(_i) (0x0F100 + ((_i) * 4))
#define SXE_VLVFB(_i) (0x0F200 + ((_i) * 4))
#define SXE_MRCTL(_i) (0x0F600 + ((_i) * 4))
-#define SXE_VMRVLAN(_i) (0x0F610 + ((_i) * 4))
+#define SXE_VMRVLAN(_i) (0x0F610 + ((_i) * 4))
#define SXE_VMRVM(_i) (0x0F630 + ((_i) * 4))
#define SXE_VMECM(_i) (0x08790 + ((_i) * 4))
#define SXE_PFMBMEM(_i) (0x13000 + (64 * (_i)))
@@ -932,23 +932,23 @@
#define SXE_VT_CTL_DIS_DEFPL 0x20000000
-#define SXE_VT_CTL_REPLEN 0x40000000
-#define SXE_VT_CTL_VT_ENABLE 0x00000001
+#define SXE_VT_CTL_REPLEN 0x40000000
+#define SXE_VT_CTL_VT_ENABLE 0x00000001
#define SXE_VT_CTL_POOL_SHIFT 7
#define SXE_VT_CTL_POOL_MASK (0x3F << SXE_VT_CTL_POOL_SHIFT)
-#define SXE_PFMAILBOX_STS 0x00000001
-#define SXE_PFMAILBOX_ACK 0x00000002
-#define SXE_PFMAILBOX_VFU 0x00000004
-#define SXE_PFMAILBOX_PFU 0x00000008
-#define SXE_PFMAILBOX_RVFU 0x00000010
+#define SXE_PFMAILBOX_STS 0x00000001
+#define SXE_PFMAILBOX_ACK 0x00000002
+#define SXE_PFMAILBOX_VFU 0x00000004
+#define SXE_PFMAILBOX_PFU 0x00000008
+#define SXE_PFMAILBOX_RVFU 0x00000010
-#define SXE_PFMBICR_VFREQ 0x00000001
-#define SXE_PFMBICR_VFACK 0x00010000
-#define SXE_PFMBICR_VFREQ_MASK 0x0000FFFF
-#define SXE_PFMBICR_VFACK_MASK 0xFFFF0000
+#define SXE_PFMBICR_VFREQ 0x00000001
+#define SXE_PFMBICR_VFACK 0x00010000
+#define SXE_PFMBICR_VFREQ_MASK 0x0000FFFF
+#define SXE_PFMBICR_VFACK_MASK 0xFFFF0000
#define SXE_QDE_ENABLE (0x00000001)
@@ -962,7 +962,7 @@
#define SXE_SPOOF_VLAN_SHIFT (8)
-#define SXE_PFDTXGSWC_VT_LBEN 0x1
+#define SXE_PFDTXGSWC_VT_LBEN 0x1
#define SXE_VMVIR_VLANA_DEFAULT 0x40000000
@@ -978,51 +978,51 @@
#define SXE_VMOLR_MPE 0x10000000
-#define SXE_VLVF_VIEN 0x80000000
-#define SXE_VLVF_ENTRIES 64
+#define SXE_VLVF_VIEN 0x80000000
+#define SXE_VLVF_ENTRIES 64
#define SXE_VLVF_VLANID_MASK 0x00000FFF
-#define SXE_HDC_HOST_BASE 0x16000
-#define SXE_HDC_SW_LK (SXE_HDC_HOST_BASE + 0x00)
-#define SXE_HDC_PF_LK (SXE_HDC_HOST_BASE + 0x04)
-#define SXE_HDC_SW_OV (SXE_HDC_HOST_BASE + 0x08)
-#define SXE_HDC_FW_OV (SXE_HDC_HOST_BASE + 0x0C)
-#define SXE_HDC_PACKET_HEAD0 (SXE_HDC_HOST_BASE + 0x10)
+#define SXE_HDC_HOST_BASE 0x16000
+#define SXE_HDC_SW_LK (SXE_HDC_HOST_BASE + 0x00)
+#define SXE_HDC_PF_LK (SXE_HDC_HOST_BASE + 0x04)
+#define SXE_HDC_SW_OV (SXE_HDC_HOST_BASE + 0x08)
+#define SXE_HDC_FW_OV (SXE_HDC_HOST_BASE + 0x0C)
+#define SXE_HDC_PACKET_HEAD0 (SXE_HDC_HOST_BASE + 0x10)
-#define SXE_HDC_PACKET_DATA0 (SXE_HDC_HOST_BASE + 0x20)
+#define SXE_HDC_PACKET_DATA0 (SXE_HDC_HOST_BASE + 0x20)
#define SXE_HDC_MSI_STATUS_REG 0x17000
-#define SXE_FW_STATUS_REG 0x17004
-#define SXE_DRV_STATUS_REG 0x17008
-#define SXE_FW_HDC_STATE_REG 0x1700C
-#define SXE_R0_MAC_ADDR_RAL 0x17010
-#define SXE_R0_MAC_ADDR_RAH 0x17014
+#define SXE_FW_STATUS_REG 0x17004
+#define SXE_DRV_STATUS_REG 0x17008
+#define SXE_FW_HDC_STATE_REG 0x1700C
+#define SXE_R0_MAC_ADDR_RAL 0x17010
+#define SXE_R0_MAC_ADDR_RAH 0x17014
#define SXE_CRC_STRIP_REG 0x17018
-#define SXE_HDC_SW_LK_BIT 0x0001
-#define SXE_HDC_PF_LK_BIT 0x0003
-#define SXE_HDC_SW_OV_BIT 0x0001
-#define SXE_HDC_FW_OV_BIT 0x0001
+#define SXE_HDC_SW_LK_BIT 0x0001
+#define SXE_HDC_PF_LK_BIT 0x0003
+#define SXE_HDC_SW_OV_BIT 0x0001
+#define SXE_HDC_FW_OV_BIT 0x0001
#define SXE_HDC_RELEASE_SW_LK 0x0000
-#define SXE_HDC_LEN_TO_REG(n) (n - 1)
-#define SXE_HDC_LEN_FROM_REG(n) (n + 1)
+#define SXE_HDC_LEN_TO_REG(n) (n - 1)
+#define SXE_HDC_LEN_FROM_REG(n) (n + 1)
-#define SXE_RX_PKT_BUF_SIZE_SHIFT 10
-#define SXE_TX_PKT_BUF_SIZE_SHIFT 10
+#define SXE_RX_PKT_BUF_SIZE_SHIFT 10
+#define SXE_TX_PKT_BUF_SIZE_SHIFT 10
-#define SXE_RXIDX_TBL_SHIFT 1
-#define SXE_RXTXIDX_IPS_EN 0x00000001
-#define SXE_RXTXIDX_IDX_SHIFT 3
-#define SXE_RXTXIDX_READ 0x40000000
-#define SXE_RXTXIDX_WRITE 0x80000000
+#define SXE_RXIDX_TBL_SHIFT 1
+#define SXE_RXTXIDX_IPS_EN 0x00000001
+#define SXE_RXTXIDX_IDX_SHIFT 3
+#define SXE_RXTXIDX_READ 0x40000000
+#define SXE_RXTXIDX_WRITE 0x80000000
-#define SXE_KEEP_CRC_EN 0x00000001
+#define SXE_KEEP_CRC_EN 0x00000001
#define SXE_VMD_CTL 0x0581C
@@ -1032,208 +1032,208 @@
#define SXE_VMD_CTL_POOL_FILTER 0x00000002
-#define SXE_FLCTRL 0x14300
-#define SXE_PFCTOP 0x14304
-#define SXE_FCTTV0 0x14310
-#define SXE_FCTTV(_i) (SXE_FCTTV0 + ((_i) * 4))
-#define SXE_FCRTV 0x14320
-#define SXE_TFCS 0x14324
+#define SXE_FLCTRL 0x14300
+#define SXE_PFCTOP 0x14304
+#define SXE_FCTTV0 0x14310
+#define SXE_FCTTV(_i) (SXE_FCTTV0 + ((_i) * 4))
+#define SXE_FCRTV 0x14320
+#define SXE_TFCS 0x14324
-#define SXE_FCTRL_TFCE_MASK 0x0018
-#define SXE_FCTRL_TFCE_LFC_EN 0x0008
-#define SXE_FCTRL_TFCE_PFC_EN 0x0010
-#define SXE_FCTRL_TFCE_DPF_EN 0x0020
-#define SXE_FCTRL_RFCE_MASK 0x0300
-#define SXE_FCTRL_RFCE_LFC_EN 0x0100
-#define SXE_FCTRL_RFCE_PFC_EN 0x0200
+#define SXE_FCTRL_TFCE_MASK 0x0018
+#define SXE_FCTRL_TFCE_LFC_EN 0x0008
+#define SXE_FCTRL_TFCE_PFC_EN 0x0010
+#define SXE_FCTRL_TFCE_DPF_EN 0x0020
+#define SXE_FCTRL_RFCE_MASK 0x0300
+#define SXE_FCTRL_RFCE_LFC_EN 0x0100
+#define SXE_FCTRL_RFCE_PFC_EN 0x0200
-#define SXE_FCTRL_TFCE_FCEN_MASK 0x00FF0000
-#define SXE_FCTRL_TFCE_XONE_MASK 0xFF000000
+#define SXE_FCTRL_TFCE_FCEN_MASK 0x00FF0000
+#define SXE_FCTRL_TFCE_XONE_MASK 0xFF000000
-#define SXE_PFCTOP_FCT 0x8808
-#define SXE_PFCTOP_FCOP_MASK 0xFFFF0000
-#define SXE_PFCTOP_FCOP_PFC 0x01010000
-#define SXE_PFCTOP_FCOP_LFC 0x00010000
+#define SXE_PFCTOP_FCT 0x8808
+#define SXE_PFCTOP_FCOP_MASK 0xFFFF0000
+#define SXE_PFCTOP_FCOP_PFC 0x01010000
+#define SXE_PFCTOP_FCOP_LFC 0x00010000
-#define SXE_COMCTRL 0x14400
-#define SXE_PCCTRL 0x14404
-#define SXE_LPBKCTRL 0x1440C
-#define SXE_MAXFS 0x14410
-#define SXE_SACONH 0x14420
-#define SXE_SACONL 0x14424
-#define SXE_VLANCTRL 0x14430
-#define SXE_VLANID 0x14434
-#define SXE_LINKS 0x14454
-#define SXE_FPGA_SDS_STS 0x14704
-#define SXE_MSCA 0x14500
-#define SXE_MSCD 0x14504
+#define SXE_COMCTRL 0x14400
+#define SXE_PCCTRL 0x14404
+#define SXE_LPBKCTRL 0x1440C
+#define SXE_MAXFS 0x14410
+#define SXE_SACONH 0x14420
+#define SXE_SACONL 0x14424
+#define SXE_VLANCTRL 0x14430
+#define SXE_VLANID 0x14434
+#define SXE_LINKS 0x14454
+#define SXE_FPGA_SDS_STS 0x14704
+#define SXE_MSCA 0x14500
+#define SXE_MSCD 0x14504
-#define SXE_HLREG0 0x04240
-#define SXE_MFLCN 0x04294
-#define SXE_MACC 0x04330
+#define SXE_HLREG0 0x04240
+#define SXE_MFLCN 0x04294
+#define SXE_MACC 0x04330
-#define SXE_PCS1GLSTA 0x0420C
-#define SXE_MFLCN 0x04294
-#define SXE_PCS1GANA 0x04850
-#define SXE_PCS1GANLP 0x04854
+#define SXE_PCS1GLSTA 0x0420C
+#define SXE_MFLCN 0x04294
+#define SXE_PCS1GANA 0x04850
+#define SXE_PCS1GANLP 0x04854
-#define SXE_LPBKCTRL_EN 0x00000001
+#define SXE_LPBKCTRL_EN 0x00000001
-#define SXE_MAC_ADDR_SACONH_SHIFT 32
-#define SXE_MAC_ADDR_SACONL_MASK 0xFFFFFFFF
+#define SXE_MAC_ADDR_SACONH_SHIFT 32
+#define SXE_MAC_ADDR_SACONL_MASK 0xFFFFFFFF
-#define SXE_PCS1GLSTA_AN_COMPLETE 0x10000
-#define SXE_PCS1GLSTA_AN_PAGE_RX 0x20000
-#define SXE_PCS1GLSTA_AN_TIMED_OUT 0x40000
+#define SXE_PCS1GLSTA_AN_COMPLETE 0x10000
+#define SXE_PCS1GLSTA_AN_PAGE_RX 0x20000
+#define SXE_PCS1GLSTA_AN_TIMED_OUT 0x40000
#define SXE_PCS1GLSTA_AN_REMOTE_FAULT 0x80000
-#define SXE_PCS1GLSTA_AN_ERROR_RWS 0x100000
-
-#define SXE_PCS1GANA_SYM_PAUSE 0x100
-#define SXE_PCS1GANA_ASM_PAUSE 0x80
-
-
-#define SXE_LKSTS_PCS_LKSTS_UP 0x00000001
-#define SXE_LINK_UP_TIME 90
-#define SXE_AUTO_NEG_TIME 45
-
-
-#define SXE_MSCA_NP_ADDR_MASK 0x0000FFFF
-#define SXE_MSCA_NP_ADDR_SHIFT 0
-#define SXE_MSCA_DEV_TYPE_MASK 0x001F0000
-#define SXE_MSCA_DEV_TYPE_SHIFT 16
-#define SXE_MSCA_PHY_ADDR_MASK 0x03E00000
-#define SXE_MSCA_PHY_ADDR_SHIFT 21
-#define SXE_MSCA_OP_CODE_MASK 0x0C000000
-#define SXE_MSCA_OP_CODE_SHIFT 26
-#define SXE_MSCA_ADDR_CYCLE 0x00000000
-#define SXE_MSCA_WRITE 0x04000000
-#define SXE_MSCA_READ 0x0C000000
-#define SXE_MSCA_READ_AUTOINC 0x08000000
-#define SXE_MSCA_ST_CODE_MASK 0x30000000
-#define SXE_MSCA_ST_CODE_SHIFT 28
-#define SXE_MSCA_NEW_PROTOCOL 0x00000000
-#define SXE_MSCA_OLD_PROTOCOL 0x10000000
-#define SXE_MSCA_BYPASSRA_C45 0x40000000
+#define SXE_PCS1GLSTA_AN_ERROR_RWS 0x100000
+
+#define SXE_PCS1GANA_SYM_PAUSE 0x100
+#define SXE_PCS1GANA_ASM_PAUSE 0x80
+
+
+#define SXE_LKSTS_PCS_LKSTS_UP 0x00000001
+#define SXE_LINK_UP_TIME 90
+#define SXE_AUTO_NEG_TIME 45
+
+
+#define SXE_MSCA_NP_ADDR_MASK 0x0000FFFF
+#define SXE_MSCA_NP_ADDR_SHIFT 0
+#define SXE_MSCA_DEV_TYPE_MASK 0x001F0000
+#define SXE_MSCA_DEV_TYPE_SHIFT 16
+#define SXE_MSCA_PHY_ADDR_MASK 0x03E00000
+#define SXE_MSCA_PHY_ADDR_SHIFT 21
+#define SXE_MSCA_OP_CODE_MASK 0x0C000000
+#define SXE_MSCA_OP_CODE_SHIFT 26
+#define SXE_MSCA_ADDR_CYCLE 0x00000000
+#define SXE_MSCA_WRITE 0x04000000
+#define SXE_MSCA_READ 0x0C000000
+#define SXE_MSCA_READ_AUTOINC 0x08000000
+#define SXE_MSCA_ST_CODE_MASK 0x30000000
+#define SXE_MSCA_ST_CODE_SHIFT 28
+#define SXE_MSCA_NEW_PROTOCOL 0x00000000
+#define SXE_MSCA_OLD_PROTOCOL 0x10000000
+#define SXE_MSCA_BYPASSRA_C45 0x40000000
#define SXE_MSCA_MDI_CMD_ON_PROG 0x80000000
-#define MDIO_MSCD_RDATA_LEN 16
-#define MDIO_MSCD_RDATA_SHIFT 16
-
-
-#define SXE_CRCERRS 0x14A04
-#define SXE_ERRBC 0x14A10
-#define SXE_RLEC 0x14A14
-#define SXE_PRC64 0x14A18
-#define SXE_PRC127 0x14A1C
-#define SXE_PRC255 0x14A20
-#define SXE_PRC511 0x14A24
-#define SXE_PRC1023 0x14A28
-#define SXE_PRC1522 0x14A2C
-#define SXE_BPRC 0x14A30
-#define SXE_MPRC 0x14A34
-#define SXE_GPRC 0x14A38
-#define SXE_GORCL 0x14A3C
-#define SXE_GORCH 0x14A40
-#define SXE_RUC 0x14A44
-#define SXE_RFC 0x14A48
-#define SXE_ROC 0x14A4C
-#define SXE_RJC 0x14A50
-#define SXE_TORL 0x14A54
-#define SXE_TORH 0x14A58
-#define SXE_TPR 0x14A5C
-#define SXE_PRCPF(_i) (0x14A60 + ((_i) * 4))
-#define SXE_GPTC 0x14B00
-#define SXE_GOTCL 0x14B04
-#define SXE_GOTCH 0x14B08
-#define SXE_TPT 0x14B0C
-#define SXE_PTC64 0x14B10
-#define SXE_PTC127 0x14B14
-#define SXE_PTC255 0x14B18
-#define SXE_PTC511 0x14B1C
-#define SXE_PTC1023 0x14B20
-#define SXE_PTC1522 0x14B24
-#define SXE_MPTC 0x14B28
-#define SXE_BPTC 0x14B2C
-#define SXE_PFCT(_i) (0x14B30 + ((_i) * 4))
-
-#define SXE_MACCFG 0x0CE04
-#define SXE_MACCFG_PAD_EN 0x00000001
-
-
-#define SXE_COMCTRL_TXEN 0x0001
-#define SXE_COMCTRL_RXEN 0x0002
-#define SXE_COMCTRL_EDSEL 0x0004
-#define SXE_COMCTRL_SPEED_1G 0x0200
-#define SXE_COMCTRL_SPEED_10G 0x0300
-
-
-#define SXE_PCCTRL_TXCE 0x0001
-#define SXE_PCCTRL_RXCE 0x0002
-#define SXE_PCCTRL_PEN 0x0100
-#define SXE_PCCTRL_PCSC_ALL 0x30000
-
-
-#define SXE_MAXFS_TFSEL 0x0001
-#define SXE_MAXFS_RFSEL 0x0002
-#define SXE_MAXFS_MFS_MASK 0xFFFF0000
-#define SXE_MAXFS_MFS 0x40000000
-#define