smsc9500.c 180 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242
  1. /***************************************************************************
  2. *
  3. * Copyright (C) 2007-2008 SMSC
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License
  7. * as published by the Free Software Foundation; either version 2
  8. * of the License, or (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. *
  19. ***************************************************************************
  20. * File: smsc9500.c
  21. ***************************************************************************/
  22. #ifndef __KERNEL__
  23. # define __KERNEL__
  24. #endif
  25. #include <linux/version.h>
  26. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13))
  27. #include <linux/config.h>
  28. #endif
  29. #include <linux/module.h>
  30. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  31. #include <linux/moduleparam.h>
  32. #endif
  33. //#define PME_EEPROMLESS
  34. #include <linux/module.h>
  35. #include <linux/kmod.h>
  36. #include <linux/sched.h>
  37. #include <linux/init.h>
  38. #include <linux/netdevice.h>
  39. #include <linux/etherdevice.h>
  40. #include <linux/ethtool.h>
  41. #include <linux/workqueue.h>
  42. #include <linux/mii.h>
  43. #include <linux/usb.h>
  44. #include <linux/crc32.h>
  45. #include <linux/ioport.h>
  46. #include <asm/io.h>
  47. #include <linux/mm.h>
  48. #include "version.h"
  49. #include "smscusbnet.h"
  50. #include "smsc9500.h"
  51. #include "ioctl_9500.h"
  52. #ifndef bool
  53. #define bool int
  54. #endif
  55. #define CHECK_RETURN_STATUS(A) \
  56. { \
  57. if((A) < 0) \
  58. { \
  59. SMSC_WARNING("Failure in %s(), line: %d\n", __FUNCTION__,__LINE__); \
  60. goto DONE; \
  61. } \
  62. }
  63. unsigned int debug_mode = DBG_WARNING | DBG_INIT | DBG_LINK_CHANGE | DBG_PWR;
  64. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  65. module_param(debug_mode, uint, 0);
  66. #else
  67. MODULE_PARM(debug_mode,"i");
  68. #endif
  69. MODULE_PARM_DESC(debug_mode,"bit 0 enables trace points, bit 1 enables warning points, bit 2 enables eth gpios, bit 3 enables gen gpios");
  70. u32 link_mode=0x7fUL;
  71. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  72. module_param(link_mode, uint, 0);
  73. #else
  74. MODULE_PARM(link_mode,"i");
  75. #endif
  76. MODULE_PARM_DESC(link_mode,"Set Link speed and Duplex, 1=10HD,2=10FD,4=100HD,8=100FD,default=0xF");
  77. u32 auto_mdix=0x3U;
  78. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  79. module_param(auto_mdix, uint, 0);
  80. #else
  81. MODULE_PARM(auto_mdix,"i");
  82. #endif
  83. MODULE_PARM_DESC(auto_mdix,"Set Auto-MDIX state, 0=StraightCable,1=CrossOver,2=Enable AMDIX,3=controlled by Strap");
  84. u32 mac_addr_hi16=0xFFFFFFFFUL;
  85. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  86. module_param(mac_addr_hi16, uint, 0);
  87. #else
  88. MODULE_PARM(mac_addr_hi16,"i");
  89. #endif
  90. MODULE_PARM_DESC(mac_addr_hi16,"Specifies the high 16 bits of the mac address");
  91. u32 mac_addr_lo32=0xFFFFFFFFUL;
  92. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  93. module_param(mac_addr_lo32, uint, 0);
  94. #else
  95. MODULE_PARM(mac_addr_lo32,"i");
  96. #endif
  97. MODULE_PARM_DESC(mac_addr_lo32,"Specifies the low 32 bits of the mac address");
  98. u32 phy_addr=0xFFFFFFFFUL;
  99. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  100. module_param(phy_addr, uint, 0);
  101. #else
  102. MODULE_PARM(phy_addr,"i");
  103. #endif
  104. MODULE_PARM_DESC(phy_addr,"phy_addr, only valid if it is external phy set by strap; 0-31=external phy with specified address, else autodetect external phy addr");
  105. bool scatter_gather=FALSE;
  106. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  107. module_param(scatter_gather,bool, 0);
  108. #else
  109. MODULE_PARM(scatter_gather,"bool");
  110. #endif
  111. MODULE_PARM_DESC(scatter_gather,"Enable Scatter Gather");
  112. bool tx_Csum=FALSE;
  113. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  114. module_param(tx_Csum,bool, 0);
  115. #else
  116. MODULE_PARM(tx_Csum,"bool");
  117. #endif
  118. MODULE_PARM_DESC(tx_Csum,"Enable Tx Hardware Checksum Offload");
  119. bool rx_Csum=FALSE;
  120. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  121. module_param(rx_Csum,bool, 0);
  122. #else
  123. MODULE_PARM(rx_Csum,"bool");
  124. #endif
  125. MODULE_PARM_DESC(tx_Csum,"Enable Rx Hardware Checksum Offload");
  126. u32 bulkin_delay=DEFAULT_BULK_IN_DELAY;
  127. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  128. module_param(bulkin_delay,uint, 0);
  129. #else
  130. MODULE_PARM(bulkin_delay,"i");
  131. #endif
  132. MODULE_PARM_DESC(bulkin_delay,"16 bit value in units of 16ns to delay UTX sending data");
  133. bool TurboMode=TRUE;
  134. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  135. module_param(TurboMode,bool, 0);
  136. #else
  137. MODULE_PARM(TurboMode,"bool");
  138. #endif
  139. MODULE_PARM_DESC(TurboMode,"Enable Turbo Mode");
  140. bool LinkActLedCfg=FALSE;
  141. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  142. module_param(LinkActLedCfg,bool, 0);
  143. #else
  144. MODULE_PARM(LinkActLedCfg,"bool");
  145. #endif
  146. MODULE_PARM_DESC(LinkActLedCfg,"Enables separate Link and Activity LEDs in LAN9500A");
  147. u32 LinkPollPeriod=3;
  148. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  149. module_param(LinkPollPeriod, uint, 0);
  150. #else
  151. MODULE_PARM(LinkPollPeriod, "i");
  152. #endif
  153. MODULE_PARM_DESC(LinkPollPeriod, "Interval for PHY polling, seconds");
  154. u32 LinkLedOnGpio=11;
  155. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  156. module_param(LinkLedOnGpio, uint, 0);
  157. #else
  158. MODULE_PARM(LinkLedOnGpio,"i");
  159. #endif
  160. MODULE_PARM_DESC(LinkLedOnGpio,"Enable separate Link and Activity LEDs in LAN9500 and specifies gpio port for link status");
  161. u32 LinkLedBufType=0;
  162. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  163. module_param(LinkLedBufType, uint, 0);
  164. #else
  165. MODULE_PARM(LinkLedBufType,"bool");
  166. #endif
  167. MODULE_PARM_DESC(LinkLedBufType,"Specifies gpio buffer type for link led");
  168. u32 LinkLedPolarity = 0;
  169. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  170. module_param(LinkLedPolarity, uint, 0);
  171. #else
  172. MODULE_PARM(LinkLedPolarity,"bool");
  173. #endif
  174. MODULE_PARM_DESC(LinkLedPolarity,"Specifies active level on gpio port");
  175. /*
  176. linkdownsuspend = 0----> Disabled
  177. linkdownsuspend = 1----> Enabled, wake up on auto-negotiation complete, device is in suspend0.
  178. linkdownsuspend = 2----> Enabled, wake up on energy detection, device is in suspend1.
  179. */
  180. static uint linkdownsuspend=0;
  181. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  182. module_param(linkdownsuspend, uint, 0);
  183. #else
  184. MODULE_PARM(linkdownsuspend,"i");
  185. #endif
  186. MODULE_PARM_DESC(linkdownsuspend,"Suspend device when link is down");
  187. static u32 dynamicsuspend=0;
  188. module_param(dynamicsuspend,uint, 0);
  189. MODULE_PARM_DESC(dynamicsuspend,"Enable dynamic autosuspend mode");
  190. static u32 netdetach=0;
  191. module_param(netdetach,uint, 0);
  192. MODULE_PARM_DESC(netdetach,"Enable net detach mode, for LAN9500A only");
  193. u32 EDPDConfig=EDPD_CFG_DEFAULT;
  194. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  195. module_param(EDPDConfig, uint, 0);
  196. #else
  197. MODULE_PARM(EDPDConfig,"i");
  198. #endif
  199. MODULE_PARM_DESC(EDPDConfig,"Set EDPD Config");
  200. u32 tx_skb_clone=TRUE;
  201. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  202. module_param(tx_skb_clone, uint, 0);
  203. #else
  204. MODULE_PARM(tx_skb_clone,"i");
  205. #endif
  206. MODULE_PARM_DESC(tx_skb_clone,"Set tx_skb_clone");
  207. u32 EnableEEE=0;
  208. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
  209. module_param(EnableEEE, uint, 0);
  210. #else
  211. MODULE_PARM(EnableEEE,"i");
  212. #endif
  213. MODULE_PARM_DESC(EnableEEE,"Enable EEE");
  214. /********static function and variable declartion****************/
  215. static int smsc9500_reset(struct usbnet *dev);
  216. static int smsc9500_get_stats(struct usbnet *dev, char *data);
  217. static int smsc9500_private_ioctl(PADAPTER_DATA privateData, struct usbnet *dev, PSMSC9500_IOCTL_DATA ioctlData);
  218. static int smsc9500_device_recovery(struct usbnet *dev);
  219. static int SetGpo(struct usbnet * dev, u32 Gpo, u32 State);
  220. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11))
  221. static int Smsc9500_suspend (struct usb_interface *intf, u32 state);
  222. static int Smsc9500SystemSuspend (struct usb_interface *intf, u32 state);
  223. static int Smsc9500AutoSuspend (struct usb_interface *intf, u32 state);
  224. #else
  225. static int Smsc9500_suspend (struct usb_interface *intf, pm_message_t state);
  226. static int Smsc9500SystemSuspend (struct usb_interface *intf, pm_message_t state);
  227. static int Smsc9500AutoSuspend (struct usb_interface *intf, pm_message_t state);
  228. #endif
  229. static int Smsc9500SystemResume(struct usb_interface *intf);
  230. static u16 CalculateCrc16(const BYTE * bpData,const u32 dwLen, const BOOLEAN fBitReverse);
  231. static int SetLinkDownWakeupEvents(struct usbnet *dev, int wakeUpMode);
  232. static int ResetLinkDownWakeupEvents(struct usbnet *dev);
  233. static int Smsc9500AutoResume(struct usb_interface *intf);
  234. static int EnablePHYWakeupInterrupt(struct usbnet *dev, u32 interrupt);
  235. static int DisablePHYWakeupInterrupt(struct usbnet *dev, u32 interrupt);
  236. static int smsc9500_eth_mac_addr(struct net_device *netdev, void *p);
  237. static int smsc9500_eth_phy_boost(struct usbnet *dev, int mode);
  238. #ifdef PME_EEPROMLESS
  239. static int EepromLessPMESetting(struct usbnet *dev);
  240. #endif
  241. static u32 LanRegMap[MAX_LAN_REG_NUM];
  242. static u32 MacRegMap[MAX_MAC_REG_NUM];
  243. static u32 PhyRegMap[MAX_PHY_REG_NUM];
  244. /***************************************************************/
  245. enum{
  246. SMSC9500_FAIL = -1,
  247. SMSC9500_SUCCESS = 0
  248. };
  249. /***************************************************************/
  250. static int smsc9500_read_reg(struct usbnet *dev, u32 index, u32 *data)
  251. {
  252. int ret = 0;
  253. u32 *buf = NULL;
  254. u16 retry_count = 0;
  255. BUG_ON(!dev);
  256. /* The heap buffer should be used for usb_control_msg, because the stack might not be DMA-mappable
  257. Control message is very slow so it really isn't big deal to dynamically allocate the data
  258. */
  259. buf = kmalloc (sizeof(u32), GFP_KERNEL | GFP_DMA);
  260. if(buf == NULL){
  261. return SMSC9500_FAIL;
  262. }
  263. do{
  264. ret=usb_control_msg(
  265. dev->udev,
  266. usb_rcvctrlpipe(dev->udev, 0),
  267. USB_VENDOR_REQUEST_READ_REGISTER,
  268. USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  269. 00,
  270. index,
  271. (void*)buf,
  272. sizeof(u32),
  273. USB_CTRL_GET_TIMEOUT);
  274. }while((ret < 0) && (retry_count++ < 3));
  275. if (ret<0){
  276. SMSC_WARNING("Failed to read register index 0x%08x\n", index);
  277. }else{
  278. le32_to_cpus(buf);
  279. *data = *buf;
  280. }
  281. kfree(buf);
  282. return ret;
  283. }
  284. static int smsc9500_write_reg(struct usbnet *dev, u32 index, u32 data)
  285. {
  286. int ret = 0;
  287. u32* buf = NULL;
  288. u16 retry_count = 0;
  289. BUG_ON(!dev);
  290. /* The heap buffer should be used for usb_control_msg, because the stack might not be DMA-mappable
  291. Control message is very slow so it really isn't big deal to dynamically allocate the data
  292. */
  293. buf = kmalloc (sizeof(u32), GFP_KERNEL | GFP_DMA);
  294. if(buf == NULL){
  295. return SMSC9500_FAIL;
  296. }
  297. *buf = data;
  298. cpu_to_le32s(buf);
  299. do{
  300. ret=usb_control_msg(
  301. dev->udev,
  302. usb_sndctrlpipe(dev->udev, 0),
  303. USB_VENDOR_REQUEST_WRITE_REGISTER,
  304. USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  305. 00,
  306. index,
  307. buf,
  308. sizeof(u32),
  309. USB_CTRL_SET_TIMEOUT);
  310. }while((ret < 0) && (retry_count++ < 3));
  311. if (ret<0){
  312. SMSC_WARNING("Failed to write register index 0x%08x\n", index);
  313. }
  314. kfree(buf);
  315. return ret;
  316. }
  317. static int smsc9500_set_feature(struct usbnet *dev, u32 feature)
  318. {
  319. BUG_ON(!dev);
  320. cpu_to_le32s((u32*)&feature);
  321. return usb_control_msg(
  322. dev->udev,
  323. usb_sndctrlpipe(dev->udev, 0),
  324. USB_REQ_SET_FEATURE,
  325. USB_RECIP_DEVICE,
  326. feature,
  327. 0,
  328. NULL,
  329. 0,
  330. USB_CTRL_SET_TIMEOUT);
  331. }
  332. static int smsc9500_clear_feature(struct usbnet *dev, u32 feature)
  333. {
  334. BUG_ON(!dev);
  335. cpu_to_le32s((u32*)&feature);
  336. return usb_control_msg(
  337. dev->udev,
  338. usb_sndctrlpipe(dev->udev, 0),
  339. USB_REQ_CLEAR_FEATURE,
  340. USB_RECIP_DEVICE,
  341. feature,
  342. 0,
  343. NULL,
  344. 0,
  345. USB_CTRL_SET_TIMEOUT);
  346. }
  347. static int smsc9500_read_phy(struct usbnet *dev, u32 Register, u32 *pValue32 )
  348. {
  349. int ret = SMSC9500_FAIL;
  350. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  351. u32 dwValue,dwAddr;
  352. int Count;
  353. BUG_ON(!dev);
  354. if(down_interruptible(&adapterData->phy_mutex)){
  355. return -EINTR;
  356. }
  357. /* confirm MII not busy */
  358. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MII_ADDR, &dwValue));
  359. if ((dwValue & MII_BUSY_) != 0UL){
  360. SMSC_WARNING("MII is busy in smsc9500_read_phy\n");
  361. goto DONE;
  362. }
  363. /* set the address, index & direction (read from PHY) */
  364. dwAddr = ((adapterData->dwPhyAddress & 0x1FUL)<<11) | ((Register & 0x1FUL)<<6)|MII_READ_ | MII_BUSY_;
  365. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MII_ADDR, dwAddr));
  366. /* Loop until the read is completed w/timeout */
  367. for(Count=1;Count<100;Count++){
  368. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MII_ADDR, &dwValue));
  369. if(!(dwValue & MII_BUSY_))
  370. break;
  371. udelay(1);
  372. }
  373. if (Count < 100){
  374. ret = smsc9500_read_reg(dev, MII_DATA, pValue32);
  375. }else{
  376. SMSC_WARNING ("Timed out reading MII register %08X\n",Register & 0x1f);
  377. }
  378. DONE:
  379. up(&adapterData->phy_mutex);
  380. return ret;
  381. } /* smsc9500_read_phy */
  382. static int smsc9500_write_phy(struct usbnet *dev, u32 Register, u32 pValue32)
  383. {
  384. int ret = SMSC9500_FAIL;
  385. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  386. u32 dwValue,dwAddr;
  387. int Count;
  388. BUG_ON(!dev);
  389. if(down_interruptible(&adapterData->phy_mutex)){
  390. return -EINTR;
  391. }
  392. if(Register==0){
  393. if(((LOWORD(pValue32))&0x1200)==0x1200){
  394. adapterData->wLastADVatRestart=adapterData->wLastADV;
  395. }
  396. }
  397. if(Register==4){
  398. adapterData->wLastADV=LOWORD(pValue32);
  399. }
  400. /* confirm MII not busy */
  401. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MII_ADDR, &dwValue));
  402. if ((dwValue & MII_BUSY_) != 0UL){
  403. SMSC_WARNING ("MII is busy in smsc9500_read_phy\n");
  404. goto DONE;
  405. }
  406. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MII_DATA, pValue32));
  407. /* set the address, index & direction (read from PHY) */
  408. dwAddr = ((adapterData->dwPhyAddress & 0x1FUL)<<11) | ((Register & 0x1FUL)<<6)|MII_WRITE_ | MII_BUSY_;
  409. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MII_ADDR, dwAddr));
  410. /* Loop until the read is completed w/timeout */
  411. for(Count=1;Count<100;Count++){
  412. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MII_ADDR, &dwValue));
  413. if(!(dwValue & MII_BUSY_))
  414. break;
  415. udelay(1);
  416. }
  417. if (Count < 100){
  418. ret=0;
  419. }else{
  420. SMSC_WARNING("Timed out writing MII register %08X\n",Register & 0x1f);
  421. }
  422. DONE:
  423. up(&adapterData->phy_mutex);
  424. return ret;
  425. } /* smsc9500_write_phy */
  426. static int smsc9500_eeprom_IsBusy(struct usbnet *dev)
  427. {
  428. int Count, retVal = 0;
  429. u32 dwValue;
  430. BUG_ON(!dev);
  431. for(Count = 0; Count < 1000; Count++){
  432. if(smsc9500_read_reg(dev, E2P_CMD, &dwValue) < 0){
  433. return SMSC9500_FAIL;
  434. }
  435. if (!(dwValue & E2P_CMD_BUSY_) || (dwValue & E2P_CMD_TIMEOUT_)){
  436. break;
  437. }
  438. udelay(60);
  439. }
  440. if ((dwValue & E2P_CMD_TIMEOUT_) || (dwValue & E2P_CMD_BUSY_)){
  441. SMSC_WARNING("EEPROM read operation timeout");
  442. retVal = SMSC9500_FAIL;
  443. }
  444. return retVal;
  445. }
  446. /* Read EEPROM data
  447. */
  448. static int smsc9500_read_eeprom(struct usbnet *dev, u32 dwOffset, u32 dwLength, BYTE* pbValue)
  449. {
  450. int i, ret = SMSC9500_FAIL;
  451. u32 dwValue,dwAddr;
  452. PADAPTER_DATA adapterData = (PADAPTER_DATA)(dev->data[0]);
  453. BUG_ON(!dev);
  454. BUG_ON(!pbValue);
  455. if(down_interruptible(&adapterData->eeprom_mutex)) {
  456. return -EINTR;
  457. }
  458. /* confirm eeprom not busy */
  459. CHECK_RETURN_STATUS(smsc9500_eeprom_IsBusy(dev));
  460. dwAddr = dwOffset;
  461. for(i = 0; i < dwLength; i++){
  462. /* Isuue command */
  463. dwValue = E2P_CMD_BUSY_ | E2P_CMD_READ_ | (dwAddr & E2P_CMD_ADDR_);
  464. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, E2P_CMD, dwValue));
  465. CHECK_RETURN_STATUS(smsc9500_eeprom_IsBusy(dev));
  466. /* Read data when ready */
  467. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, E2P_DATA, &dwValue));
  468. pbValue[i] = dwValue & 0xFF;
  469. dwAddr++;
  470. }
  471. ret = SMSC9500_SUCCESS;
  472. DONE:
  473. up(&adapterData->eeprom_mutex);
  474. return ret;
  475. } /* smsc9500_read_eeprom */
  476. static int smsc9500_do_write_eeprom(struct usbnet *dev, u32 dwOffset, u32 dwLength, BYTE* pbValue)
  477. {
  478. int i, ret = SMSC9500_FAIL;
  479. u32 dwValue,dwAddr;
  480. PADAPTER_DATA adapterData = (PADAPTER_DATA)(dev->data[0]);
  481. BUG_ON(!dev);
  482. BUG_ON(!pbValue);
  483. if(down_interruptible(&adapterData->eeprom_mutex)){
  484. return -EINTR;
  485. }
  486. /* confirm eeprom not busy */
  487. CHECK_RETURN_STATUS(smsc9500_eeprom_IsBusy(dev));
  488. /* Iuuse write/erase enable command */
  489. dwValue = E2P_CMD_BUSY_ | E2P_CMD_EWEN_;
  490. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, E2P_CMD, dwValue));
  491. CHECK_RETURN_STATUS(smsc9500_eeprom_IsBusy(dev));
  492. dwAddr = dwOffset;
  493. for(i=0; i<dwLength; i++){
  494. /* Fill data register */
  495. dwValue = pbValue[i];
  496. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, E2P_DATA, dwValue));
  497. /* Send "write" command */
  498. dwValue = E2P_CMD_BUSY_ | E2P_CMD_WRITE_ | (dwAddr & E2P_CMD_ADDR_);
  499. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, E2P_CMD, dwValue));
  500. CHECK_RETURN_STATUS(smsc9500_eeprom_IsBusy(dev));
  501. dwAddr++;
  502. }
  503. ret = SMSC9500_SUCCESS;
  504. DONE:
  505. up(&adapterData->eeprom_mutex);
  506. return ret;
  507. }
  508. static int smsc9500_write_eeprom(struct usbnet *dev, u32 dwOffset, u32 dwLength, BYTE* pbValue)
  509. {
  510. int i, retries = 10;
  511. u32 dwValue;
  512. for (i = 0; i < retries; i++) {
  513. if (smsc9500_do_write_eeprom(dev, dwOffset, dwLength, pbValue) == SMSC9500_SUCCESS)
  514. return SMSC9500_SUCCESS;
  515. }
  516. mdelay(100);
  517. if ((smsc9500_eeprom_IsBusy(dev) != 0) && (smsc9500_read_reg(dev,ID_REV, &dwValue)== 0))
  518. set_bit (EVENT_DEV_RECOVERY, &dev->flags);
  519. return SMSC9500_FAIL;
  520. }
  521. static int IsDataPortReady(struct usbnet *dev)
  522. {
  523. int ret = FALSE;
  524. int count = 0;
  525. u32 dwValue;
  526. /* confirm data port is not busy */
  527. for(count=0; count<100; count++){
  528. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, DP_SEL, &dwValue));
  529. if (dwValue & DP_SEL_DPRDY){
  530. ret = TRUE;
  531. break;
  532. }
  533. udelay(40);
  534. }
  535. if (ret == FALSE){
  536. SMSC_WARNING("Data port is busy ");
  537. }
  538. DONE:
  539. return ret;
  540. }
  541. /* Read data from internal RAM
  542. * ramSel: Choose which internal RAM to access.
  543. * startAddr: The first offset to access.
  544. * length: Data length in DWORD.
  545. * valLow: Low 32 bits buffer pointer.
  546. * valHigh: High 5 bits buffer pointer. If null, will ignore.
  547. * */
  548. static int ReadDataPort(struct usbnet *dev, int ramSel, u32 startAddr, u32 length, u32 *valLow, u32 *valHigh)
  549. {
  550. u32 dwValue;
  551. int ret = SMSC9500_FAIL;
  552. int i;
  553. PADAPTER_DATA adapterData;
  554. BUG_ON(!dev);
  555. adapterData = (PADAPTER_DATA)(dev->data[0]);
  556. BUG_ON(!adapterData);
  557. if(down_interruptible(&adapterData->internal_ram_mutex)){
  558. return -EINTR;
  559. }
  560. // confirm data port not busy
  561. if(!IsDataPortReady(dev))goto DONE;
  562. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, DP_SEL, &dwValue));
  563. dwValue &= ~DP_SEL_RSEL;
  564. switch(ramSel){
  565. case RAMSEL_FCT: dwValue |= DP_SEL_RSEL_FCT; break;
  566. case RAMSEL_EEPROM: dwValue |= DP_SEL_RSEL_EEPROM; break;
  567. case RAMSEL_TXTLI: dwValue |= DP_SEL_RSEL_TXTLI; break;
  568. case RAMSEL_RXTLI: dwValue |= DP_SEL_RSEL_RXTLI; break;
  569. }
  570. dwValue |= DP_SEL_TESTEN;
  571. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, DP_SEL, dwValue));
  572. for(i=0; i<length; i++){
  573. //Set device ram address
  574. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, DP_ADDR, startAddr + i));
  575. //Enable reading
  576. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, DP_CMD, DP_CMD_READ));
  577. if(!IsDataPortReady(dev))goto DONE;
  578. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, DP_DATA0, valLow + i));
  579. if(valHigh){
  580. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, DP_DATA1, valHigh + i));
  581. }
  582. }
  583. ret = SMSC9500_SUCCESS;
  584. DONE:
  585. smsc9500_read_reg(dev, DP_SEL, &dwValue);
  586. dwValue &= ~DP_SEL_TESTEN;
  587. smsc9500_write_reg(dev, DP_SEL, dwValue);
  588. up(&adapterData->internal_ram_mutex);
  589. return ret;
  590. }
  591. /**
  592. * smsc9500_is_zero_ether_addr - Determine if give Ethernet address is all zeros.
  593. * @addr: Pointer to a six-byte array containing the Ethernet address
  594. *
  595. * Return true if the address is all zeroes.
  596. */
  597. static int smsc9500_is_zero_ether_addr(const u8 *addr)
  598. {
  599. return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);
  600. }
  601. /**
  602. * smsc9500_is_multicast_ether_addr - Determine if the Ethernet address is a multicast.
  603. * @addr: Pointer to a six-byte array containing the Ethernet address
  604. *
  605. * Return true if the address is a multicast address.
  606. * By definition the broadcast address is also a multicast address.
  607. */
  608. static int smsc9500_is_multicast_ether_addr(const u8 *addr)
  609. {
  610. return (0x01 & addr[0]);
  611. }
  612. /**
  613. * smsc9500_is_valid_ether_addr - Determine if the given Ethernet address is valid
  614. * @addr: Pointer to a six-byte array containing the Ethernet address
  615. *
  616. * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not
  617. * a multicast address, and is not FF:FF:FF:FF:FF:FF.
  618. *
  619. * Return true if the address is valid.
  620. */
  621. static int smsc9500_is_valid_ether_addr(const u8 *addr)
  622. {
  623. /* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to
  624. * explicitly check for it here. */
  625. return !smsc9500_is_multicast_ether_addr(addr) && !smsc9500_is_zero_ether_addr(addr);
  626. }
  627. static void smsc9500_status(struct usbnet *dev, struct urb *urb)
  628. {
  629. struct smsc9500_int_data *event;
  630. int hasFrame;
  631. BUG_ON(!dev);
  632. BUG_ON(!urb);
  633. SMSC_TRACE(DBG_INTR,"---->in smsc9500_status\n");
  634. if (urb->actual_length < 4) {
  635. SMSC_WARNING("urb->actual_length= %d",urb->actual_length);
  636. return;
  637. }
  638. event = urb->transfer_buffer;
  639. le32_to_cpus((u32*)&event->IntEndPoint);
  640. SMSC_TRACE(DBG_INTR, "event->IntEndPoint= 0x%08x\n", event->IntEndPoint);
  641. hasFrame = event->IntEndPoint &INT_END_RXFIFO_HAS_FRAME_;
  642. if (hasFrame) {
  643. dev->StopSummitUrb=0;
  644. tasklet_schedule (&dev->bh);
  645. }
  646. SMSC_TRACE(DBG_INTR,"<----out of smsc9500_status\n");
  647. }
  648. static int smsc9500_get_stats(struct usbnet *dev, char *data)
  649. {
  650. int ret = 0;
  651. void* buf;
  652. u16 retry_count = 0;
  653. u16 RxStatSize = 0;
  654. u16 TxStatSize = 0;
  655. BUG_ON(!dev);
  656. BUG_ON(!data);
  657. SMSC_TRACE(DBG_RX, "in smsc9500_get_stats\n");
  658. buf = kmalloc (sizeof(SMSC9500_RX_STATS)+sizeof(SMSC9500_TX_STATS), GFP_KERNEL | GFP_DMA);
  659. if(buf == NULL){
  660. return SMSC9500_FAIL;
  661. }
  662. if(dev->chipDependFeatures[FEATURE_EEE]){
  663. RxStatSize = sizeof(SMSC9500_RX_STATS);
  664. TxStatSize = sizeof(SMSC9500_TX_STATS);
  665. }else{
  666. /* 20h for RX statistics. 28h for TX statistics */
  667. RxStatSize = sizeof(SMSC9500_RX_STATS) - 8;
  668. TxStatSize = sizeof(SMSC9500_TX_STATS) - 8;
  669. }
  670. do{
  671. ret=usb_control_msg(
  672. dev->udev,
  673. usb_rcvctrlpipe(dev->udev, 0),
  674. USB_VENDOR_REQUEST_GET_STATS,
  675. USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  676. 00,
  677. 0,
  678. buf,
  679. RxStatSize,
  680. USB_CTRL_SET_TIMEOUT);
  681. }while((ret < 0) && (retry_count++ < 3));
  682. if (ret < 0){
  683. SMSC_WARNING("Failed to get Rx status\n");
  684. goto Done;
  685. }
  686. retry_count = 0;
  687. do{
  688. ret=usb_control_msg(
  689. dev->udev,
  690. usb_rcvctrlpipe(dev->udev, 0),
  691. USB_VENDOR_REQUEST_GET_STATS,
  692. USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  693. 00,
  694. 1,
  695. buf+sizeof(SMSC9500_RX_STATS),
  696. TxStatSize,
  697. USB_CTRL_SET_TIMEOUT);
  698. }while((ret < 0) && (retry_count++ < 3));
  699. if (ret < 0){
  700. SMSC_WARNING("Failed to get Tx status\n");
  701. }else{
  702. memcpy(data, buf, (sizeof(SMSC9500_TX_STATS)+sizeof(SMSC9500_RX_STATS)));
  703. }
  704. Done:
  705. kfree(buf);
  706. return ret;
  707. }
  708. void UpdateStatCounters(
  709. struct usbnet *dev, char * pStats
  710. )
  711. /*++
  712. Routine Description:
  713. This routine updates Tx/Rx statistic counters.
  714. Arguments:
  715. Adapter - pointer to our Adapter
  716. pStats - Pointer to stat. counters array
  717. Return Value:
  718. --*/
  719. {
  720. PADAPTER_DATA pAdapter = (PADAPTER_DATA)(dev->data[0]);
  721. u32 * pValue32=(u32 *)pStats;
  722. pSMSC9500_RX_STATS pRxStats;
  723. pSMSC9500_TX_STATS pTxStats;
  724. int i=0;
  725. for (i=0; i<((sizeof(SMSC9500_RX_STATS)+sizeof(SMSC9500_RX_STATS))/4);i++){
  726. le32_to_cpus((u32*)&pValue32[i]);
  727. if ((i != 0)|| (i != 8) || (i != 9) || (i != 10) || (i != 20) || (i != 21))
  728. pValue32[i] &= 0xFFFFF; //This counter has 20 bits.
  729. }
  730. pRxStats = (pSMSC9500_RX_STATS) pStats;
  731. pTxStats = (pSMSC9500_TX_STATS) (pStats + sizeof(SMSC9500_RX_STATS));
  732. if(dev->chipDependFeatures[FEATURE_NEWSTATIS_CNT])
  733. {
  734. // Good Tx (32Bit Counter)
  735. if (pTxStats->TxGoodFrames >= pAdapter->tx_statistics.TxGoodFrames)
  736. pAdapter->TxGoodFrames += (u64)(pTxStats->TxGoodFrames - pAdapter->tx_statistics.TxGoodFrames);
  737. else
  738. pAdapter->TxGoodFrames += (u64)(pTxStats->TxGoodFrames + (0xFFFFFFFFUL - pAdapter->tx_statistics.TxGoodFrames) + 1UL);
  739. pAdapter->tx_statistics.TxGoodFrames = pTxStats->TxGoodFrames;
  740. // Tx Excess Collisions (20Bit Counter)
  741. if (pTxStats->TxExcessiveCollisionErrors >= pAdapter->tx_statistics.TxExcessiveCollisionErrors)
  742. pAdapter->TxExcessiveCollisionErrors += (pTxStats->TxExcessiveCollisionErrors - pAdapter->tx_statistics.TxExcessiveCollisionErrors);
  743. else
  744. pAdapter->TxExcessiveCollisionErrors += (pTxStats->TxExcessiveCollisionErrors + (0xFFFFFUL - pAdapter->tx_statistics.TxExcessiveCollisionErrors) + 1UL);
  745. pAdapter->tx_statistics.TxExcessiveCollisionErrors = pTxStats->TxExcessiveCollisionErrors;
  746. // Tx Late Collisions (20Bit Counter)
  747. if (pTxStats->TxLateCollisionErrors >= pAdapter->tx_statistics.TxLateCollisionErrors)
  748. pAdapter->TxLateCollisionErrors += (pTxStats->TxLateCollisionErrors - pAdapter->tx_statistics.TxLateCollisionErrors);
  749. else
  750. pAdapter->TxLateCollisionErrors += (pTxStats->TxLateCollisionErrors + (0xFFFFFUL - pAdapter->tx_statistics.TxLateCollisionErrors) + 1UL);
  751. pAdapter->tx_statistics.TxLateCollisionErrors = pTxStats->TxLateCollisionErrors;
  752. // Tx Underrun (20Bit Counter)
  753. if (pTxStats->TxBufferUnderrunErrors >= pAdapter->tx_statistics.TxBufferUnderrunErrors)
  754. pAdapter->TxBufferUnderrunErrors += (pTxStats->TxBufferUnderrunErrors - pAdapter->tx_statistics.TxBufferUnderrunErrors);
  755. else
  756. pAdapter->TxBufferUnderrunErrors += (pTxStats->TxBufferUnderrunErrors + (0xFFFFFUL - pAdapter->tx_statistics.TxBufferUnderrunErrors) + 1UL);
  757. pAdapter->tx_statistics.TxBufferUnderrunErrors = pTxStats->TxBufferUnderrunErrors;
  758. // Tx Carrier Errors (20Bit Counter)
  759. if (pTxStats->TxCarrierErrors >= pAdapter->tx_statistics.TxCarrierErrors)
  760. pAdapter->TxCarrierErrors += (pTxStats->TxCarrierErrors - pAdapter->tx_statistics.TxCarrierErrors);
  761. else
  762. pAdapter->TxCarrierErrors += (pTxStats->TxCarrierErrors + (0xFFFFFUL - pAdapter->tx_statistics.TxCarrierErrors) + 1UL);
  763. pAdapter->tx_statistics.TxCarrierErrors = pTxStats->TxCarrierErrors;
  764. // Tx Single Collision (20Bit Counter)
  765. if (pTxStats->TxSingleCollisions >= pAdapter->tx_statistics.TxSingleCollisions)
  766. pAdapter->TxSingleCollisions += (pTxStats->TxSingleCollisions - pAdapter->tx_statistics.TxSingleCollisions);
  767. else
  768. pAdapter->TxSingleCollisions += (pTxStats->TxSingleCollisions + (0xFFFFFUL - pAdapter->tx_statistics.TxSingleCollisions) + 1UL);
  769. pAdapter->tx_statistics.TxSingleCollisions = pTxStats->TxSingleCollisions;
  770. // Tx Multiple Collision (20Bit Counter)
  771. if (pTxStats->TxMultipleCollisions >= pAdapter->tx_statistics.TxMultipleCollisions)
  772. pAdapter->TxMultipleCollisions += (pTxStats->TxMultipleCollisions - pAdapter->tx_statistics.TxMultipleCollisions);
  773. else
  774. pAdapter->TxMultipleCollisions += (pTxStats->TxMultipleCollisions + (0xFFFFFUL - pAdapter->tx_statistics.TxMultipleCollisions) + 1UL);
  775. pAdapter->tx_statistics.TxMultipleCollisions = pTxStats->TxMultipleCollisions;
  776. // Tx Excessive Deferral (20Bit Counter)
  777. if (pTxStats->TxExcessiveDeferralErrors >= pAdapter->tx_statistics.TxExcessiveDeferralErrors)
  778. pAdapter->TxExcessiveDeferralErrors += (pTxStats->TxExcessiveDeferralErrors - pAdapter->tx_statistics.TxExcessiveDeferralErrors);
  779. else
  780. pAdapter->TxExcessiveDeferralErrors += (pTxStats->TxExcessiveDeferralErrors + (0xFFFFFUL - pAdapter->tx_statistics.TxExcessiveDeferralErrors) + 1UL);
  781. pAdapter->tx_statistics.TxExcessiveDeferralErrors = pTxStats->TxExcessiveDeferralErrors;
  782. // Tx Pause (20Bit Counter)
  783. if (pTxStats->TxPauseFrames >= pAdapter->tx_statistics.TxPauseFrames)
  784. pAdapter->TxPauseFrames += (pTxStats->TxPauseFrames - pAdapter->tx_statistics.TxPauseFrames);
  785. else
  786. pAdapter->TxPauseFrames += (pTxStats->TxPauseFrames + (0xFFFFFUL - pAdapter->tx_statistics.TxPauseFrames) + 1UL);
  787. pAdapter->tx_statistics.TxPauseFrames = pTxStats->TxPauseFrames;
  788. // Tx Bad (20Bit Counter)
  789. if (pTxStats->TxBadFrames >= pAdapter->tx_statistics.TxBadFrames)
  790. pAdapter->TxBadFrames += (pTxStats->TxBadFrames - pAdapter->tx_statistics.TxBadFrames);
  791. else
  792. pAdapter->TxBadFrames += (pTxStats->TxBadFrames + (0xFFFFFUL - pAdapter->tx_statistics.TxBadFrames) + 1UL);
  793. pAdapter->tx_statistics.TxPauseFrames = pTxStats->TxPauseFrames;
  794. // Good Rx (32Bit Counter)
  795. if (pRxStats->RxGoodFrames >= pAdapter->rx_statistics.RxGoodFrames)
  796. pAdapter->RxGoodFrames += (u64)(pRxStats->RxGoodFrames - pAdapter->rx_statistics.RxGoodFrames);
  797. else
  798. pAdapter->RxGoodFrames += (u64)(pRxStats->RxGoodFrames + (0xFFFFFFFFUL - pAdapter->rx_statistics.RxGoodFrames) + 1UL);
  799. pAdapter->rx_statistics.RxGoodFrames = pRxStats->RxGoodFrames;
  800. // Rx Crc (20Bit Counter)
  801. if (pRxStats->RxCrcErrors >= pAdapter->rx_statistics.RxCrcErrors)
  802. pAdapter->RxCrcErrors += (pRxStats->RxCrcErrors - pAdapter->rx_statistics.RxCrcErrors);
  803. else
  804. pAdapter->RxCrcErrors += (pRxStats->RxCrcErrors + (0xFFFFFUL - pAdapter->rx_statistics.RxCrcErrors) + 1UL);
  805. pAdapter->rx_statistics.RxCrcErrors = pRxStats->RxCrcErrors;
  806. // Rx Alignment (20Bit Counter)
  807. if (pRxStats->RxAlignmentErrors >= pAdapter->rx_statistics.RxAlignmentErrors)
  808. pAdapter->RxAlignmentErrors += (pRxStats->RxAlignmentErrors - pAdapter->rx_statistics.RxAlignmentErrors);
  809. else
  810. pAdapter->RxAlignmentErrors += (pRxStats->RxAlignmentErrors + (0xFFFFFUL - pAdapter->rx_statistics.RxAlignmentErrors) + 1UL);
  811. pAdapter->rx_statistics.RxAlignmentErrors = pRxStats->RxAlignmentErrors;
  812. // Rx Resources (20Bit Counter)
  813. if (pRxStats->RxFifoDroppedFrames >= pAdapter->rx_statistics.RxFifoDroppedFrames)
  814. pAdapter->RxFifoDroppedFrames += (pRxStats->RxFifoDroppedFrames - pAdapter->rx_statistics.RxFifoDroppedFrames);
  815. else
  816. pAdapter->RxFifoDroppedFrames += (pRxStats->RxFifoDroppedFrames + (0xFFFFFUL - pAdapter->rx_statistics.RxFifoDroppedFrames) + 1UL);
  817. pAdapter->rx_statistics.RxFifoDroppedFrames = pRxStats->RxFifoDroppedFrames;
  818. // Rx Runts (20Bit Counter)
  819. if (pRxStats->RxRuntFrameErrors >= pAdapter->rx_statistics.RxRuntFrameErrors)
  820. pAdapter->RxRuntFrameErrors += (pRxStats->RxRuntFrameErrors - pAdapter->rx_statistics.RxRuntFrameErrors);
  821. else
  822. pAdapter->RxRuntFrameErrors += (pRxStats->RxRuntFrameErrors + (0xFFFFFUL - pAdapter->rx_statistics.RxRuntFrameErrors) + 1UL);
  823. pAdapter->rx_statistics.RxRuntFrameErrors = pRxStats->RxRuntFrameErrors;
  824. // Rx TooLong (20Bit Counter)
  825. if (pRxStats->RxFrameTooLongError >= pAdapter->rx_statistics.RxFrameTooLongError)
  826. pAdapter->RxFrameTooLongError += (pRxStats->RxFrameTooLongError - pAdapter->rx_statistics.RxFrameTooLongError);
  827. else
  828. pAdapter->RxFrameTooLongError += (pRxStats->RxFrameTooLongError + (0xFFFFFUL - pAdapter->rx_statistics.RxFrameTooLongError) + 1UL);
  829. pAdapter->rx_statistics.RxFrameTooLongError = pRxStats->RxFrameTooLongError;
  830. // Rx Late Collisions (20Bit Counter)
  831. if (pRxStats->RxLaterCollisionError >= pAdapter->rx_statistics.RxLaterCollisionError)
  832. pAdapter->RxLaterCollisionError += (pRxStats->RxLaterCollisionError - pAdapter->rx_statistics.RxLaterCollisionError);
  833. else
  834. pAdapter->RxLaterCollisionError += (pRxStats->RxLaterCollisionError + (0xFFFFFUL - pAdapter->rx_statistics.RxLaterCollisionError) + 1UL);
  835. pAdapter->rx_statistics.RxLaterCollisionError = pRxStats->RxLaterCollisionError;
  836. // Rx Bad (20Bit Counter)
  837. if (pRxStats->RxBadFrames >= pAdapter->rx_statistics.RxBadFrames)
  838. pAdapter->RxBadFrames += (pRxStats->RxBadFrames - pAdapter->rx_statistics.RxBadFrames);
  839. else
  840. pAdapter->RxBadFrames += (pRxStats->RxBadFrames + (0xFFFFFUL - pAdapter->rx_statistics.RxBadFrames) + 1UL);
  841. pAdapter->rx_statistics.RxBadFrames = pRxStats->RxBadFrames;
  842. if(dev->chipDependFeatures[FEATURE_EEE])
  843. {
  844. // EEE Tx LPI Transitions (32 bit)
  845. if (pTxStats->EeeTxLpiTransitions >= pAdapter->tx_statistics.EeeTxLpiTransitions)
  846. {
  847. pAdapter->EeeTxLpiTransitions +=
  848. (u64)(pTxStats->EeeTxLpiTransitions - pAdapter->tx_statistics.EeeTxLpiTransitions);
  849. }
  850. else
  851. {
  852. pAdapter->EeeTxLpiTransitions +=
  853. (u64)(pTxStats->EeeTxLpiTransitions + (0xFFFFFFFFUL - pAdapter->tx_statistics.EeeTxLpiTransitions) + 1UL);
  854. }
  855. // EEE Tx LPI Time (32 bit)
  856. if (pTxStats->EeeTxLpiTime >= pAdapter->tx_statistics.EeeTxLpiTime)
  857. {
  858. pAdapter->EeeTxLpiTime +=
  859. (u64)(pTxStats->EeeTxLpiTime - pAdapter->tx_statistics.EeeTxLpiTime);
  860. }
  861. else
  862. {
  863. pAdapter->EeeTxLpiTime +=
  864. (u64)(pTxStats->EeeTxLpiTime + (0xFFFFFFFFUL - pAdapter->tx_statistics.EeeTxLpiTime) + 1UL);
  865. }
  866. //EEE Rx LPI Transitions (32 bit)
  867. if (pRxStats->EeeRxLpiTransitions >= pAdapter->rx_statistics.EeeRxLpiTransitions)
  868. {
  869. pAdapter->EeeRxLpiTransitions +=
  870. (u64)(pRxStats->EeeRxLpiTransitions - pAdapter->rx_statistics.EeeRxLpiTransitions);
  871. }
  872. else
  873. {
  874. pAdapter->EeeRxLpiTransitions +=
  875. (u64)(pRxStats->EeeRxLpiTransitions + (0xFFFFFFFFUL - pAdapter->rx_statistics.EeeRxLpiTransitions) + 1UL);
  876. }
  877. //EEE Rx LPI Time (32 bit)
  878. if (pRxStats->EeeRxLpiTime >= pAdapter->rx_statistics.EeeRxLpiTime)
  879. {
  880. pAdapter->EeeRxLpiTime += (u64)(pRxStats->EeeRxLpiTime - pAdapter->rx_statistics.EeeRxLpiTime);
  881. }
  882. else
  883. {
  884. pAdapter->EeeRxLpiTime +=
  885. (u64)(pRxStats->EeeRxLpiTime + (0xFFFFFFFFUL - pAdapter->rx_statistics.EeeRxLpiTime) + 1UL);
  886. }
  887. }
  888. }
  889. else
  890. {
  891. // Good Tx (32Bit Counter)
  892. pAdapter->TxGoodFrames += (u64)pTxStats->TxGoodFrames;
  893. // Tx Excess Collisions (20Bit Counter)
  894. pAdapter->TxExcessiveCollisionErrors += pTxStats->TxExcessiveCollisionErrors;
  895. // Tx Late Collisions (20Bit Counter)
  896. pAdapter->TxLateCollisionErrors += pTxStats->TxLateCollisionErrors;
  897. // Tx Underrun (20Bit Counter)
  898. pAdapter->TxBufferUnderrunErrors += pTxStats->TxBufferUnderrunErrors;
  899. // Tx Carrier Errors (20Bit Counter)
  900. pAdapter->TxCarrierErrors += pTxStats->TxCarrierErrors;
  901. // Tx Single Collision (20Bit Counter)
  902. pAdapter->TxSingleCollisions += pTxStats->TxSingleCollisions;
  903. // Tx Multiple Collision (20Bit Counter)
  904. pAdapter->TxMultipleCollisions += pTxStats->TxMultipleCollisions;
  905. // Tx Excessive Deferral (20Bit Counter)
  906. pAdapter->TxExcessiveDeferralErrors += pTxStats->TxExcessiveDeferralErrors;
  907. // Tx Pause (20Bit Counter)
  908. pAdapter->TxPauseFrames += pTxStats->TxPauseFrames;
  909. // Tx Bad (20Bit Counter)
  910. pAdapter->TxBadFrames += pTxStats->TxBadFrames;
  911. // Good Rx (32Bit Counter)
  912. pAdapter->RxGoodFrames += (u64)pRxStats->RxGoodFrames;
  913. // Rx Crc (20Bit Counter)
  914. pAdapter->RxCrcErrors += pRxStats->RxCrcErrors;
  915. // Rx Alignment (20Bit Counter)
  916. pAdapter->RxAlignmentErrors += pRxStats->RxAlignmentErrors;
  917. // Rx Resources (20Bit Counter)
  918. pAdapter->RxFifoDroppedFrames += pRxStats->RxFifoDroppedFrames;
  919. // Rx Runts (20Bit Counter)
  920. pAdapter->RxRuntFrameErrors += pRxStats->RxRuntFrameErrors;
  921. // Rx TooLong (20Bit Counter)
  922. pAdapter->RxFrameTooLongError += pRxStats->RxFrameTooLongError;
  923. // Rx Late Collisions (20Bit Counter)
  924. pAdapter->RxLaterCollisionError += pRxStats->RxLaterCollisionError;
  925. // Rx Bad (20Bit Counter)
  926. pAdapter->RxBadFrames += pRxStats->RxBadFrames;
  927. }
  928. }
  929. static void smsc9500_async_cmd_callback(struct urb *urb, struct pt_regs *regs)
  930. {
  931. struct USB_CONTEXT * usb_context = (struct USB_CONTEXT *)urb->context;
  932. if (urb->status < 0)
  933. SMSC_WARNING("smsc9500_async_cmd_callback() failed with %d\n",urb->status);
  934. complete((struct completion *)&usb_context->notify);
  935. kfree(&usb_context->req);
  936. usb_free_urb(urb);
  937. }
  938. static int
  939. smsc9500_read_reg_async(struct usbnet *dev, u32 index, void *data, int wait)
  940. {
  941. int ret = ASYNC_RW_SUCCESS;
  942. struct USB_CONTEXT * usb_context;
  943. int status;
  944. struct urb *urb;
  945. u32 size=4;
  946. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11))
  947. int expire;
  948. #endif
  949. BUG_ON(!dev);
  950. BUG_ON(!data);
  951. if ((urb = usb_alloc_urb(0, GFP_ATOMIC)) == NULL) {
  952. SMSC_WARNING("Error allocating URB in write_cmd_async!");
  953. return ASYNC_RW_FAIL;
  954. }
  955. if ((usb_context = kmalloc(sizeof(struct USB_CONTEXT), GFP_ATOMIC)) == NULL) {
  956. SMSC_WARNING( "Failed to allocate memory for control request");
  957. usb_free_urb(urb);
  958. return ASYNC_RW_FAIL;
  959. }
  960. usb_context->req.bRequestType = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE;
  961. usb_context->req.bRequest = USB_VENDOR_REQUEST_READ_REGISTER;
  962. usb_context->req.wValue = 00;
  963. usb_context->req.wIndex = cpu_to_le32(index);
  964. usb_context->req.wLength = cpu_to_le32(size);
  965. init_completion(&usb_context->notify);
  966. usb_fill_control_urb(urb, dev->udev,
  967. usb_rcvctrlpipe(dev->udev, 0),
  968. (void *)&usb_context->req, data, size,
  969. (usb_complete_t)smsc9500_async_cmd_callback, (void*)usb_context);
  970. if((status = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {
  971. SMSC_WARNING( "Error submitting the control message: status=%d", status);
  972. kfree(usb_context);
  973. usb_free_urb(urb);
  974. return ASYNC_RW_FAIL;
  975. }
  976. if(wait){
  977. //wait_for_completion_timeout only implemented in 2.6.11 and higher kernel version
  978. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11))
  979. expire = msecs_to_jiffies(USB_CTRL_SET_TIMEOUT);
  980. if (!wait_for_completion_timeout(&usb_context->notify, expire)) {
  981. ret = ASYNC_RW_TIMEOUT;
  982. SMSC_TRACE(DBG_WARNING,"urb timeout \n");
  983. kfree(usb_context);
  984. usb_free_urb(urb);
  985. return ASYNC_RW_FAIL;
  986. }
  987. #endif
  988. }
  989. return ret;
  990. }
  991. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22))
  992. extern void *page_address(struct page *);
  993. static void CalculateTxChecksumOffset(
  994. struct sk_buff *skb,
  995. int *csum_start_offset
  996. )
  997. {
  998. unsigned int skbFragCnt;
  999. int i;
  1000. u32 offset;
  1001. skbFragCnt = skb_shinfo(skb)->nr_frags + 1;
  1002. // Initialize csum offset locations as if it was single frag.
  1003. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22))
  1004. SMSC_ASSERT(skb->h.raw);
  1005. #else
  1006. SMSC_ASSERT(skb->transport_header); // Should never happen for a CHECKSUM_HW packet.
  1007. #endif
  1008. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22))
  1009. *csum_start_offset = skb->h.raw - skb->data;
  1010. #else
  1011. *csum_start_offset = (unsigned long)skb->transport_header - (unsigned long)skb->data;
  1012. #endif
  1013. offset = (skbFragCnt == 1) ? skb->len : (skb->len - skb->data_len);
  1014. // Process all fragments
  1015. for(i=0;i<(skbFragCnt-1);i++)
  1016. {
  1017. skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
  1018. unsigned char *frag_addr = (unsigned char *) page_address(frag->page) + frag->page_offset;
  1019. // Find if transport header start belongs to this fragment and if so calculate offset from start of packet.
  1020. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22))
  1021. if((frag_addr <= skb->h.raw) && ((frag_addr + frag->size) >=skb->h.raw))
  1022. {
  1023. *csum_start_offset = offset + ((u32)skb->h.raw) - ((u32)frag_addr);
  1024. }
  1025. #else
  1026. if((frag_addr <= (unsigned char *)((unsigned long)skb->transport_header)) &&
  1027. ((frag_addr + frag->size) >= (unsigned char *)((unsigned long)skb->transport_header)))
  1028. {
  1029. *csum_start_offset = offset + ((unsigned long)skb->transport_header) - ((unsigned long)frag_addr);
  1030. }
  1031. #endif
  1032. SMSC_ASSERT((offset + frag->size) <= skb->len);
  1033. offset += frag->size;
  1034. }
  1035. }
  1036. #endif
  1037. static void Tx_StopQueue(
  1038. struct usbnet *dev,u32 dwSource)
  1039. {
  1040. unsigned long intFlags=0;
  1041. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1042. spin_lock_irqsave(&(adapterData->TxQueueLock),intFlags);
  1043. if(adapterData->dwTxQueueDisableMask==0) {
  1044. netif_stop_queue(dev->net);
  1045. }
  1046. adapterData->dwTxQueueDisableMask|=dwSource;
  1047. spin_unlock_irqrestore(&(adapterData->TxQueueLock),intFlags);
  1048. }
  1049. static void Tx_WakeQueue(
  1050. struct usbnet *dev,u32 dwSource)
  1051. {
  1052. unsigned long intFlags=0;
  1053. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1054. spin_lock_irqsave(&(adapterData->TxQueueLock),intFlags);
  1055. adapterData->dwTxQueueDisableMask&=(~dwSource);
  1056. if(adapterData->dwTxQueueDisableMask==0) {
  1057. netif_wake_queue(dev->net);
  1058. }
  1059. spin_unlock_irqrestore(&(adapterData->TxQueueLock),intFlags);
  1060. }
  1061. int NICStartRxPath(struct usbnet *dev)
  1062. /*++
  1063. Routine Description:
  1064. This function stops all activity on the Rx Path, both at the USB and Mac
  1065. Arguments:
  1066. Adapter - pointer to the MP_ADAPTER structure
  1067. Return value:
  1068. VOID
  1069. --*/
  1070. {
  1071. u32 Value32;
  1072. int Status=-1;
  1073. // Enable the receiver at the Mac
  1074. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MAC_CR, &Value32));
  1075. Value32 |= MAC_CR_RXEN_;
  1076. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MAC_CR, Value32));
  1077. Status=0;
  1078. DONE:
  1079. return (Status);
  1080. }
  1081. int NICStopRxPath(struct usbnet *dev)
  1082. /*++
  1083. Routine Description:
  1084. This function stops all activity on the Rx Path, both at the USB and Mac
  1085. Arguments:
  1086. Adapter - pointer to the MP_ADAPTER structure
  1087. Return value:
  1088. VOID
  1089. --*/
  1090. {
  1091. u32 Value32,dwValue, Count = 0;
  1092. int Status=-1;
  1093. // Clr the Rx Stop bit if not already
  1094. dwValue=INT_STS_RX_STOP_;
  1095. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, INT_STS, dwValue));
  1096. // Disable the receiver at the Mac
  1097. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MAC_CR, &Value32));
  1098. Value32 &= (~MAC_CR_RXEN_);
  1099. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MAC_CR, Value32));
  1100. // The Rx Stop bit should assert as soon as the packet "in flight" makes
  1101. // it into the Mac, worst case is 10 Mbps HD. This will be ~2ms tops
  1102. // Assuming one register read per (micro)frame the case of high speed USB
  1103. // - 125us register read cycle time - is the worse and would need up to
  1104. // 16 reads. Let's just round up to 20.
  1105. do
  1106. {
  1107. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, INT_STS, &Value32));
  1108. // Let it try to do the 20 reads even if the reg reads are failing
  1109. // If the previous write did go thru at least this way we have a better
  1110. // chance of making sure the receiver did stop.
  1111. }
  1112. while ( (++Count<20) && ((Value32 & INT_STS_RX_STOP_) == 0) );
  1113. DONE:
  1114. return (Status);
  1115. }
  1116. int NICStopAndFlushRxPath(struct usbnet *dev)
  1117. /*++
  1118. Routine Description:
  1119. This function stops all activity on the Rx Path, both at the USB and Mac
  1120. and then flushes the Receive Fifo.
  1121. Arguments:
  1122. Adapter - pointer to the MP_ADAPTER structure
  1123. Return value:
  1124. VOID
  1125. --*/
  1126. {
  1127. int Status = -1;
  1128. u32 Value32,dwValue;
  1129. Status = NICStopRxPath(dev);
  1130. dwValue=RX_FIFO_FLUSH_;
  1131. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, RX_CFG, dwValue));
  1132. // Should self clear way before the read.
  1133. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, RX_CFG, &Value32));
  1134. if (Value32 & RX_FIFO_FLUSH_)
  1135. {
  1136. // Flush did not self clear!
  1137. Status = -1;
  1138. }
  1139. else {
  1140. Status = 0;
  1141. }
  1142. DONE:
  1143. return (Status);
  1144. }
  1145. //returns hash bit number for given MAC address
  1146. //example:
  1147. // 01 00 5E 00 00 01 -> returns bit number 31
  1148. static u32 Rx_Hash(BYTE addr[6])
  1149. {
  1150. int i;
  1151. u32 crc=0xFFFFFFFFUL;
  1152. u32 poly=0xEDB88320UL;
  1153. u32 result=0;
  1154. for(i=0;i<6;i++)
  1155. {
  1156. int bit;
  1157. u32 data=((u32)addr[i]);
  1158. for(bit=0;bit<8;bit++)
  1159. {
  1160. u32 p = (crc^((u32)data))&1UL;
  1161. crc >>= 1;
  1162. if(p!=0) crc ^= poly;
  1163. data >>=1;
  1164. }
  1165. }
  1166. result=((crc&0x01UL)<<5)|
  1167. ((crc&0x02UL)<<3)|
  1168. ((crc&0x04UL)<<1)|
  1169. ((crc&0x08UL)>>1)|
  1170. ((crc&0x10UL)>>3)|
  1171. ((crc&0x20UL)>>5);
  1172. return result;
  1173. }
  1174. static int smsc9500_rx_setmulticastlist(struct usbnet *dev)
  1175. {
  1176. u32 local_MACCR, dwHashHi,dwHashLo;
  1177. u32 ret = SMSC9500_FAIL;
  1178. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1179. if ((dev->suspendFlag) || (dev->netDetachDone)) {
  1180. return 0;
  1181. }
  1182. if(down_interruptible(&adapterData->RxFilterLock)){
  1183. return -EINTR;
  1184. }
  1185. SMSC_TRACE(DBG_MCAST, "---------->in smsc9500_set_multicast\n");
  1186. if(dev->net->flags & IFF_PROMISC) {
  1187. SMSC_TRACE(DBG_MCAST,"Promiscuous Mode Enabled");
  1188. adapterData->set_bits_mask = MAC_CR_PRMS_;
  1189. adapterData->clear_bits_mask = (MAC_CR_MCPAS_ | MAC_CR_HPFILT_);
  1190. adapterData->HashHi = 0UL;
  1191. adapterData->HashLo = 0UL;
  1192. goto PREPARE;
  1193. }
  1194. if(dev->net->flags & IFF_ALLMULTI) {
  1195. SMSC_TRACE(DBG_MCAST, "Receive all Multicast Enabled");
  1196. adapterData->set_bits_mask = MAC_CR_MCPAS_;
  1197. adapterData->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_HPFILT_);
  1198. adapterData->HashHi = 0UL;
  1199. adapterData->HashLo = 0UL;
  1200. goto PREPARE;
  1201. }
  1202. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
  1203. if(dev->net->mc_count>0) {
  1204. u32 dwHashH=0;
  1205. u32 dwHashL=0;
  1206. u32 dwCount=0;
  1207. struct dev_mc_list *mc_list=dev->net->mc_list;
  1208. adapterData->set_bits_mask = MAC_CR_HPFILT_;
  1209. adapterData->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_MCPAS_);
  1210. while(mc_list!=NULL) {
  1211. dwCount++;
  1212. if((mc_list->dmi_addrlen)==6) {
  1213. u32 dwMask=0x01UL;
  1214. u32 dwBitNum=Rx_Hash(mc_list->dmi_addr);
  1215. dwMask<<=(dwBitNum&0x1FUL);
  1216. if(dwBitNum&0x20UL) {
  1217. dwHashH|=dwMask;
  1218. } else {
  1219. dwHashL|=dwMask;
  1220. }
  1221. } else {
  1222. SMSC_WARNING("dmi_addrlen!=6");
  1223. }
  1224. mc_list=mc_list->next;
  1225. }
  1226. if(dwCount!=((u32)(dev->net->mc_count))) {
  1227. SMSC_WARNING("dwCount!=dev->net->mc_count");
  1228. }
  1229. SMSC_TRACE(DBG_MCAST, "Multicast: HASHH=0x%08X,HASHL=0x%08X",dwHashH,dwHashL);
  1230. adapterData->HashHi = dwHashH;
  1231. adapterData->HashLo = dwHashL;
  1232. }
  1233. #else
  1234. if( netdev_mc_count(dev->net)>0) {
  1235. u32 dwHashH=0;
  1236. u32 dwHashL=0;
  1237. u32 dwCount=0;
  1238. struct netdev_hw_addr *ha;
  1239. adapterData->set_bits_mask = MAC_CR_HPFILT_;
  1240. adapterData->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_MCPAS_);
  1241. netdev_for_each_mc_addr(ha, dev->net) {
  1242. u32 dwMask=0x01UL;
  1243. u32 dwBitNum=Rx_Hash(ha->addr);
  1244. dwCount++;
  1245. dwMask<<=(dwBitNum&0x1FUL);
  1246. if(dwBitNum&0x20UL) {
  1247. dwHashH|=dwMask;
  1248. } else {
  1249. dwHashL|=dwMask;
  1250. }
  1251. }
  1252. if(dwCount!=((u32)netdev_mc_count(dev->net))) {
  1253. SMSC_WARNING("dwCount!=netdev_mc_count(dev->net)");
  1254. }
  1255. SMSC_TRACE(DBG_MCAST, "Multicast: HASHH=0x%08X,HASHL=0x%08X",dwHashH,dwHashL);
  1256. adapterData->HashHi = dwHashH;
  1257. adapterData->HashLo = dwHashL;
  1258. }
  1259. #endif
  1260. else
  1261. {
  1262. adapterData->set_bits_mask = 0L;
  1263. adapterData->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_MCPAS_ | MAC_CR_HPFILT_);
  1264. SMSC_TRACE(DBG_MCAST, "Receive own packets only.");
  1265. adapterData->HashHi = 0UL;
  1266. adapterData->HashLo = 0UL;
  1267. }
  1268. PREPARE:
  1269. up(&adapterData->RxFilterLock);
  1270. dwHashHi=adapterData->HashHi;
  1271. dwHashLo=adapterData->HashLo;
  1272. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,HASHH,dwHashHi));
  1273. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,HASHL,dwHashLo));
  1274. CHECK_RETURN_STATUS(smsc9500_read_reg(dev,MAC_CR,&local_MACCR));
  1275. local_MACCR |= adapterData->set_bits_mask;
  1276. local_MACCR &= ~(adapterData->clear_bits_mask);
  1277. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,MAC_CR,local_MACCR));
  1278. SMSC_TRACE(DBG_MCAST, "<---------out of smsc9500_set_multicast");
  1279. ret = 0;
  1280. DONE:
  1281. return ret;
  1282. }
  1283. static void smsc9500_set_multicast(struct net_device *netdev)
  1284. {
  1285. struct usbnet *dev=netdev_priv(netdev);
  1286. smscusbnet_defer_myevent(dev, EVENT_SET_MULTICAST);
  1287. }
  1288. static int Phy_GetLinkMode(struct usbnet *dev)
  1289. {
  1290. u32 dwTemp, dwValue, result=LINK_OFF;
  1291. u16 wRegBcr=0;
  1292. u16 wRegBSR,wRegLPA,WSpeedIndication;
  1293. int ret = SMSC9500_FAIL;
  1294. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1295. SMSC_TRACE(DBG_LINK, "---------->in Phy_GetLinkMode");
  1296. /* read PHY_BSR twice: link status bit is LL */
  1297. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_BSR,&dwTemp));
  1298. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_BSR,&dwTemp));
  1299. wRegBSR=LOWORD(dwTemp);
  1300. adapterData->dwLinkSettings=LINK_OFF;
  1301. if(wRegBSR&PHY_BSR_LINK_STATUS_) {
  1302. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_BCR,&dwValue));
  1303. wRegBcr=LOWORD(dwValue);
  1304. if(wRegBcr & PHY_BCR_AUTO_NEG_ENABLE_) {
  1305. u32 linkSettings=LINK_AUTO_NEGOTIATE;
  1306. u16 wRegADV=adapterData->wLastADVatRestart;
  1307. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_ANEG_LPA,&dwTemp));
  1308. wRegLPA=LOWORD(dwTemp);
  1309. if(wRegADV & PHY_ANEG_ADV_ASYMP_) {
  1310. linkSettings |= LINK_ASYMMETRIC_PAUSE;
  1311. }
  1312. if(wRegADV & PHY_ANEG_ADV_SYMP_) {
  1313. linkSettings |= LINK_SYMMETRIC_PAUSE;
  1314. }
  1315. if(wRegADV & PHY_ANEG_LPA_100FDX_) {
  1316. linkSettings |= LINK_SPEED_100FD;
  1317. }
  1318. if(wRegADV & PHY_ANEG_LPA_100HDX_) {
  1319. linkSettings |= LINK_SPEED_100HD;
  1320. }
  1321. if(wRegADV & PHY_ANEG_LPA_10FDX_) {
  1322. linkSettings |= LINK_SPEED_10FD;
  1323. }
  1324. if(wRegADV & PHY_ANEG_LPA_10HDX_) {
  1325. linkSettings |= LINK_SPEED_10HD;
  1326. }
  1327. adapterData->dwLinkSettings=linkSettings;
  1328. wRegLPA &= wRegADV;
  1329. if(wRegLPA & PHY_ANEG_LPA_100FDX_) {
  1330. result = LINK_SPEED_100FD;
  1331. } else if(wRegLPA & PHY_ANEG_LPA_100HDX_) {
  1332. result = LINK_SPEED_100HD;
  1333. } else if(wRegLPA & PHY_ANEG_LPA_10FDX_) {
  1334. result = LINK_SPEED_10FD;
  1335. } else if(wRegLPA & PHY_ANEG_LPA_10HDX_) {
  1336. result = LINK_SPEED_10HD;
  1337. }
  1338. if (result==LINK_OFF) {
  1339. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_SPECIAL,&dwTemp));
  1340. WSpeedIndication=LOWORD(dwTemp);
  1341. if ((WSpeedIndication & PHY_SPECIAL_SPD_)== PHY_SPECIAL_SPD_10HALF_) {
  1342. result = LINK_SPEED_10HD;
  1343. } else if ((WSpeedIndication & PHY_SPECIAL_SPD_)== PHY_SPECIAL_SPD_10FULL_) {
  1344. result = LINK_SPEED_10FD;
  1345. } else if ((WSpeedIndication & PHY_SPECIAL_SPD_)== PHY_SPECIAL_SPD_100HALF_) {
  1346. result = LINK_SPEED_100HD;
  1347. } else if ((WSpeedIndication & PHY_SPECIAL_SPD_)== PHY_SPECIAL_SPD_100FULL_) {
  1348. result = LINK_SPEED_100FD;
  1349. }
  1350. }
  1351. } else {
  1352. if(wRegBcr & PHY_BCR_SPEED_SELECT_) {
  1353. if(wRegBcr & PHY_BCR_DUPLEX_MODE_) {
  1354. adapterData->dwLinkSettings=result=LINK_SPEED_100FD;
  1355. } else {
  1356. adapterData->dwLinkSettings=result=LINK_SPEED_100HD;
  1357. }
  1358. } else {
  1359. if(wRegBcr & PHY_BCR_DUPLEX_MODE_) {
  1360. adapterData->dwLinkSettings=result=LINK_SPEED_10FD;
  1361. } else {
  1362. adapterData->dwLinkSettings=result=LINK_SPEED_10HD;
  1363. }
  1364. }
  1365. }
  1366. }
  1367. adapterData->dwLinkSpeed=result;
  1368. SMSC_TRACE(DBG_LINK,"<----------out of Phy_GetLinkMode");
  1369. ret = 0;
  1370. DONE:
  1371. return ret;
  1372. }
  1373. static int Phy_UpdateLinkMode(struct usbnet *dev)
  1374. {
  1375. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1376. int ret = SMSC9500_FAIL;
  1377. u32 dwOldLinkSpeed=adapterData->dwLinkSpeed;
  1378. u32 dwTemp,dwValue;
  1379. SMSC_TRACE(DBG_LINK,"---------->in Phy_UpdateLinkMode");
  1380. Phy_GetLinkMode(dev);
  1381. if(dwOldLinkSpeed!=(adapterData->dwLinkSpeed)) {
  1382. if(adapterData->dwLinkSpeed!=LINK_OFF) {
  1383. u32 dwRegVal=0;
  1384. /* Ethernet output boost */
  1385. smsc9500_eth_phy_boost(dev, 1);
  1386. switch(adapterData->dwLinkSpeed) {
  1387. case LINK_SPEED_10HD:
  1388. SMSC_TRACE(DBG_LINK_CHANGE,"Link is now UP at 10Mbps HD");
  1389. break;
  1390. case LINK_SPEED_10FD:
  1391. SMSC_TRACE(DBG_LINK_CHANGE,"Link is now UP at 10Mbps FD");
  1392. break;
  1393. case LINK_SPEED_100HD:
  1394. SMSC_TRACE(DBG_LINK_CHANGE,"Link is now UP at 100Mbps HD");
  1395. break;
  1396. case LINK_SPEED_100FD:
  1397. SMSC_TRACE(DBG_LINK_CHANGE,"Link is now UP at 100Mbps FD");
  1398. break;
  1399. default:
  1400. SMSC_TRACE(DBG_LINK_CHANGE,"Link is now UP at Unknown Link Speed, dwLinkSpeed=0x%08X",
  1401. adapterData->dwLinkSpeed);
  1402. break;
  1403. }
  1404. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MAC_CR,&dwRegVal));
  1405. dwRegVal&=~(MAC_CR_FDPX_|MAC_CR_RCVOWN_);
  1406. switch(adapterData->dwLinkSpeed) {
  1407. case LINK_SPEED_10HD:
  1408. case LINK_SPEED_100HD:
  1409. dwRegVal|=MAC_CR_RCVOWN_;
  1410. break;
  1411. case LINK_SPEED_10FD:
  1412. case LINK_SPEED_100FD:
  1413. dwRegVal|=MAC_CR_FDPX_;
  1414. break;
  1415. default:break;
  1416. }
  1417. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MAC_CR, dwRegVal));
  1418. if(adapterData->dwLinkSettings&LINK_AUTO_NEGOTIATE) {
  1419. u16 linkPartner=0;
  1420. u16 localLink=0;
  1421. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_ANEG_ADV, &dwTemp));
  1422. localLink=LOWORD(dwTemp);
  1423. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_ANEG_LPA, &dwTemp));
  1424. linkPartner=LOWORD(dwTemp);
  1425. switch(adapterData->dwLinkSpeed) {
  1426. case LINK_SPEED_10FD:
  1427. case LINK_SPEED_100FD:
  1428. if(((localLink&linkPartner)&((u16)PHY_ANEG_ADV_SYMP_)) != ((u16)0U)) {
  1429. //Enable PAUSE receive and transmit
  1430. dwTemp=0xFFFF0002UL;
  1431. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,FLOW, dwTemp));
  1432. CHECK_RETURN_STATUS(smsc9500_read_reg(dev,AFC_CFG,&dwValue));
  1433. dwValue=dwValue|0x0000000FUL;
  1434. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, AFC_CFG,dwValue));
  1435. } else if(((localLink&((u16)0x0C00U))==((u16)0x0C00U)) &&
  1436. ((linkPartner&((u16)0x0C00U))==((u16)0x0800U)))
  1437. {
  1438. //Enable PAUSE receive, disable PAUSE transmit
  1439. dwTemp=0xFFFF0002UL;
  1440. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, FLOW, dwTemp));
  1441. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, AFC_CFG,&dwValue));
  1442. dwValue=dwValue&(~0x0000000FUL);
  1443. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, AFC_CFG, dwValue));
  1444. } else if(((localLink&((u16)0x0C00U))==((u16)0x0800U)) &&
  1445. ((linkPartner&((u16)0x0C00U))==((u16)0x0C00U)))
  1446. {
  1447. //Enable PAUSE transmit, disable PAUSE receive
  1448. dwTemp=0x0UL;
  1449. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, FLOW, dwTemp));
  1450. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, AFC_CFG,&dwValue));
  1451. dwValue=dwValue|0x0000000FUL;
  1452. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, AFC_CFG, dwValue));
  1453. } else {
  1454. //Disable PAUSE receive and transmit
  1455. dwTemp=0x0UL;
  1456. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, FLOW, dwTemp));
  1457. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, AFC_CFG,&dwValue));
  1458. dwValue=dwValue&(~0x0000000FUL);
  1459. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, AFC_CFG, dwValue));
  1460. };break;
  1461. case LINK_SPEED_10HD:
  1462. case LINK_SPEED_100HD:
  1463. dwTemp=0x0UL;
  1464. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, FLOW, dwTemp));
  1465. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, AFC_CFG,&dwValue));
  1466. dwValue=dwValue|0x0000000FUL;
  1467. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, AFC_CFG, dwValue));
  1468. break;
  1469. default:break;
  1470. }
  1471. SMSC_TRACE(DBG_LINK_CHANGE,"LAN9500: %s,%s,%s,%s,%s,%s",
  1472. (localLink&PHY_ANEG_ADV_ASYMP_)?"ASYMP":" ",
  1473. (localLink&PHY_ANEG_ADV_SYMP_)?"SYMP ":" ",
  1474. (localLink&PHY_ANEG_ADV_100F_)?"100FD":" ",
  1475. (localLink&PHY_ANEG_ADV_100H_)?"100HD":" ",
  1476. (localLink&PHY_ANEG_ADV_10F_)?"10FD ":" ",
  1477. (localLink&PHY_ANEG_ADV_10H_)?"10HD ":" ");
  1478. SMSC_TRACE(DBG_LINK_CHANGE,"Partner: %s,%s,%s,%s,%s,%s",
  1479. (linkPartner&PHY_ANEG_LPA_ASYMP_)?"ASYMP":" ",
  1480. (linkPartner&PHY_ANEG_LPA_SYMP_)?"SYMP ":" ",
  1481. (linkPartner&PHY_ANEG_LPA_100FDX_)?"100FD":" ",
  1482. (linkPartner&PHY_ANEG_LPA_100HDX_)?"100HD":" ",
  1483. (linkPartner&PHY_ANEG_LPA_10FDX_)?"10FD ":" ",
  1484. (linkPartner&PHY_ANEG_LPA_10HDX_)?"10HD ":" ");
  1485. } else {
  1486. switch(adapterData->dwLinkSpeed) {
  1487. case LINK_SPEED_10HD:
  1488. case LINK_SPEED_100HD:
  1489. dwTemp=0x0UL;
  1490. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, FLOW, dwTemp));
  1491. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, AFC_CFG,&dwValue));
  1492. dwValue=dwValue|0x0000000FUL;
  1493. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, AFC_CFG, dwValue));
  1494. break;
  1495. default:
  1496. dwTemp=0x0UL;
  1497. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, FLOW, dwTemp));
  1498. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, AFC_CFG,&dwValue));
  1499. dwValue=dwValue&(~0x0000000FUL);
  1500. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, AFC_CFG, dwValue));
  1501. break;
  1502. }
  1503. }
  1504. netif_carrier_on(dev->net);
  1505. SMSC_TRACE(DBG_LINK_CHANGE, "link is UP!<______________________");
  1506. Tx_WakeQueue(dev,0x01);
  1507. SetGpo(dev, adapterData->LinkLedOnGpio, !adapterData->LinkLedOnGpioPolarity);
  1508. NICStartRxPath(dev);
  1509. set_bit (EVENT_LINK_UP, &dev->flags);
  1510. } else {
  1511. SMSC_TRACE(DBG_LINK_CHANGE,"Link is now DOWN");
  1512. Tx_StopQueue(dev,0x01);
  1513. netif_carrier_off(dev->net);
  1514. SetGpo(dev, adapterData->LinkLedOnGpio, adapterData->LinkLedOnGpioPolarity);
  1515. SMSC_TRACE(DBG_LINK, "stop and flush RX path!!!");
  1516. NICStopAndFlushRxPath(dev);
  1517. dwTemp=0x0UL;
  1518. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, FLOW, dwTemp));
  1519. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, AFC_CFG,&dwValue));
  1520. dwValue=dwValue& (~0x0000000FUL);
  1521. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, AFC_CFG, dwValue));
  1522. set_bit (EVENT_LINK_DOWN, &dev->flags);
  1523. }
  1524. }
  1525. SMSC_TRACE(DBG_LINK,"<----------out of Phy_UpdateLinkMode");
  1526. ret = 0;
  1527. DONE:
  1528. return ret;
  1529. }
  1530. static int Phy_CheckLink(void * ptr)
  1531. {
  1532. struct usbnet *dev = ptr;
  1533. char statistics[sizeof(SMSC9500_RX_STATS) + sizeof(SMSC9500_TX_STATS)];
  1534. int ret = SMSC9500_FAIL;
  1535. u32 dwValue;
  1536. BUG_ON(!dev);
  1537. SMSC_TRACE(DBG_LINK,"-------->in Phy_CheckLink");
  1538. if(Phy_UpdateLinkMode(dev) < 0)return ret;
  1539. /* verify whether ethernet boost is set */
  1540. smsc9500_eth_phy_boost(dev, 0);
  1541. if(dev->suspendFlag & AUTOSUSPEND_DETACH){
  1542. if(!netif_carrier_ok(dev->net)){//Link is down, detach device
  1543. //Set wakeup event
  1544. SetLinkDownWakeupEvents(dev, WAKEPHY_ENERGY);
  1545. //Enable net detach
  1546. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, HW_CFG,&dwValue));
  1547. dwValue |= HW_CFG_SMDET_EN;
  1548. //Not checking return status here. Failure or success smsc9500_write_reg() return negetive
  1549. smsc9500_write_reg(dev, HW_CFG, dwValue);
  1550. dev->suspendFlag &= ~AUTOSUSPEND_DETACH;
  1551. dev->netDetachDone = TRUE;
  1552. ret = SMSC9500_SUCCESS;
  1553. goto DONE;
  1554. }
  1555. }
  1556. if(smsc9500_get_stats(dev, statistics) > 0){
  1557. UpdateStatCounters(dev,statistics);
  1558. }
  1559. if( (!(dev->StopLinkPolling)) && (!timer_pending(&dev->LinkPollingTimer))) {
  1560. dev->LinkPollingTimer.expires=jiffies+(LinkPollPeriod*HZ);
  1561. add_timer(&(dev->LinkPollingTimer));
  1562. }
  1563. SMSC_TRACE(DBG_LINK,"<---------out of Phy_CheckLink");
  1564. ret = SMSC9500_SUCCESS;
  1565. DONE:
  1566. return ret;
  1567. }
  1568. static int phy_SetLink(struct usbnet *dev, u32 dwLinkRequest)
  1569. {
  1570. u32 dwValue;
  1571. u16 wTemp=0;
  1572. int ret = SMSC9500_FAIL;
  1573. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1574. SMSC_TRACE(DBG_LINK,"--------->in phy_SetLink");
  1575. if(dwLinkRequest&LINK_AUTO_NEGOTIATE) {
  1576. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_ANEG_ADV,&dwValue));
  1577. wTemp=LOWORD(dwValue);
  1578. wTemp&=~PHY_ANEG_ADV_PAUSE_;
  1579. if(dwLinkRequest&LINK_ASYMMETRIC_PAUSE) {
  1580. wTemp|=PHY_ANEG_ADV_ASYMP_;
  1581. }
  1582. if(dwLinkRequest&LINK_SYMMETRIC_PAUSE) {
  1583. wTemp|=PHY_ANEG_ADV_SYMP_;
  1584. }
  1585. wTemp&=~PHY_ANEG_ADV_SPEED_;
  1586. if(dwLinkRequest&LINK_SPEED_10HD) {
  1587. wTemp|=PHY_ANEG_ADV_10H_;
  1588. }
  1589. if(dwLinkRequest&LINK_SPEED_10FD) {
  1590. wTemp|=PHY_ANEG_ADV_10F_;
  1591. }
  1592. if((dwLinkRequest&LINK_SPEED_100HD) && (dev->udev->speed == USB_SPEED_HIGH)) {
  1593. wTemp|=PHY_ANEG_ADV_100H_;
  1594. }
  1595. if((dwLinkRequest&LINK_SPEED_100FD) && (dev->udev->speed == USB_SPEED_HIGH)) {
  1596. wTemp|=PHY_ANEG_ADV_100F_;
  1597. }
  1598. dwValue=(u32)(wTemp) &0x0000FFFFUL;
  1599. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_ANEG_ADV, dwValue));
  1600. // begin to establish link
  1601. wTemp=PHY_BCR_AUTO_NEG_ENABLE_|PHY_BCR_RESTART_AUTO_NEG_;
  1602. dwValue=(u32)(wTemp) &0x0000FFFFUL;
  1603. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_BCR, dwValue));
  1604. } else {
  1605. /* Automdix fix when force mode */
  1606. if (adapterData->internalPhy == TRUE) {
  1607. if ((auto_mdix >= AMDIX_ENABLE) && (dev->chipDependFeatures[FEATURE_MDIX_MODE] == TRUE)) {
  1608. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_SILICON_REV, &dwValue));
  1609. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_SILICON_REV, dwValue | PHY_SILICON_REV_AMDIX_XTD_));
  1610. } else {
  1611. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_SPECIAL_CTRL_STS, &dwValue));
  1612. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_SPECIAL_CTRL_STS, (dwValue & 0x1FFF)|0x8000));
  1613. }
  1614. }
  1615. if(dwLinkRequest&(LINK_SPEED_100FD)) {
  1616. dwLinkRequest=LINK_SPEED_100FD;
  1617. } else if(dwLinkRequest&(LINK_SPEED_100HD)) {
  1618. dwLinkRequest=LINK_SPEED_100HD;
  1619. } else if(dwLinkRequest&(LINK_SPEED_10FD)) {
  1620. dwLinkRequest=LINK_SPEED_10FD;
  1621. } else if(dwLinkRequest&(LINK_SPEED_10HD)) {
  1622. dwLinkRequest=LINK_SPEED_10HD;
  1623. }
  1624. if(dwLinkRequest&(LINK_SPEED_10FD|LINK_SPEED_100FD)) {
  1625. wTemp|=PHY_BCR_DUPLEX_MODE_;
  1626. }
  1627. if(dwLinkRequest&(LINK_SPEED_100HD|LINK_SPEED_100FD)) {
  1628. wTemp|=PHY_BCR_SPEED_SELECT_;
  1629. }
  1630. dwValue=(u32)(wTemp) &0x0000FFFFUL;
  1631. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_BCR, dwValue));
  1632. }
  1633. /* Ethernet output boost */
  1634. smsc9500_eth_phy_boost(dev, 1);
  1635. SMSC_TRACE(DBG_LINK,"<---------out of phy_SetLink");
  1636. ret = 0;
  1637. DONE:
  1638. return ret;
  1639. }
  1640. static int Phy_SetAutoMdix(
  1641. struct usbnet *dev,
  1642. u16 wAutoMdix
  1643. )
  1644. {
  1645. u32 SpecialCtrlSts = 0U;
  1646. int ret = SMSC9500_FAIL;
  1647. if (wAutoMdix > AMDIX_ENABLE) {
  1648. SMSC_WARNING("LAN9500 Auto MDIX feature controlled by hardware strap\n");
  1649. }
  1650. else {
  1651. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_SPECIAL_CTRL_STS, &SpecialCtrlSts));
  1652. if (wAutoMdix == AMDIX_DISABLE_CROSSOVER) {
  1653. SpecialCtrlSts |= (SPECIAL_CTRL_STS_OVRRD_AMDIX_ | SPECIAL_CTRL_STS_AMDIX_STATE_);
  1654. SpecialCtrlSts &= ~SPECIAL_CTRL_STS_AMDIX_ENABLE_;
  1655. SMSC_WARNING("LAN9500 Auto MDIX hardware strap was overiden by driver. AutoMdix is disabled, use crossover cable.");
  1656. } else if (wAutoMdix == AMDIX_DISABLE_STRAIGHT) {
  1657. SpecialCtrlSts |= SPECIAL_CTRL_STS_OVRRD_AMDIX_;
  1658. SpecialCtrlSts &= ~(SPECIAL_CTRL_STS_AMDIX_ENABLE_ | SPECIAL_CTRL_STS_AMDIX_STATE_);
  1659. SMSC_WARNING("LAN9500 Auto MDIX hardware strap was overiden by driver. AutoMdix is disabled, use straight cable.");
  1660. } else {
  1661. SpecialCtrlSts |= (SPECIAL_CTRL_STS_OVRRD_AMDIX_ | SPECIAL_CTRL_STS_AMDIX_ENABLE_);
  1662. SMSC_WARNING("LAN9500 Auto MDIX hardware strap was overiden by driver. AutoMdix is enabled");
  1663. }
  1664. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_SPECIAL_CTRL_STS, SpecialCtrlSts));
  1665. }
  1666. ret = 0;
  1667. DONE:
  1668. return ret;
  1669. }
  1670. static BOOLEAN Phy_Initialize(
  1671. struct usbnet *dev,
  1672. u32 dwPhyAddr,
  1673. u32 dwLinkRequest)
  1674. {
  1675. BOOLEAN result=FALSE, bConfigureAutoMdix = FALSE;
  1676. u32 dwTemp=0,dwValue, address, Value32, Temp32;
  1677. u32 dwLoopCount=0;
  1678. u32 phy_id_1, phy_id_2;
  1679. u32 dwPhyBcr;
  1680. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1681. SMSC_TRACE(DBG_INIT,"-->Phy_Initialize");
  1682. SMSC_ASSERT(dwLinkRequest<=0x7FUL);
  1683. adapterData->internalPhy = TRUE;
  1684. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, HW_CFG, &dwValue));
  1685. if(dwValue & HW_CFG_PSEL_){
  1686. SMSC_TRACE(DBG_INIT,"using external PHY ");
  1687. if(dwPhyAddr <= 31){
  1688. /* We know the phy address. Use it. */
  1689. adapterData->dwPhyAddress = dwPhyAddr;
  1690. }else{ /* Auto detect PHY */
  1691. phy_id_1 = 0xFFFFU;
  1692. phy_id_2 = 0xFFFFU;
  1693. for (address=0; address<=31; address++)
  1694. {
  1695. adapterData->dwPhyAddress = address;
  1696. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_ID_1, &phy_id_1));
  1697. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_ID_2, &phy_id_2));
  1698. if((phy_id_1 != 0x7FFFU) && (phy_id_1 != 0xFFFFU) && (phy_id_1 != 0x0000U)){
  1699. SMSC_TRACE(DBG_INIT,"Deteced Phy at address = 0x%02X", address);
  1700. break;
  1701. }
  1702. }
  1703. }
  1704. SMSC_TRACE(DBG_INIT,"using external PHY ");
  1705. adapterData->internalPhy = FALSE;
  1706. } else { /* Use Internal Phy */
  1707. SMSC_TRACE(DBG_INIT,"using internal PHY ");
  1708. adapterData->dwPhyAddress=1;
  1709. bConfigureAutoMdix = TRUE;
  1710. }
  1711. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_ID_2,&dwTemp));
  1712. adapterData->bPhyRev=((BYTE)(dwTemp&(0x0FUL)));
  1713. adapterData->bPhyModel=((BYTE)((dwTemp>>4)&(0x3FUL)));
  1714. adapterData->dwPhyId=((dwTemp&(0xFC00UL))<<8);
  1715. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_ID_1,&dwTemp));
  1716. adapterData->dwPhyId|=((dwTemp&(0x0000FFFFUL))<<2);
  1717. SMSC_TRACE(DBG_INIT,"dwPhyId==0x%08X,bPhyModel==0x%02X,bPhyRev==0x%02X",
  1718. adapterData->dwPhyId,
  1719. adapterData->bPhyModel,
  1720. adapterData->bPhyRev);
  1721. adapterData->dwLinkSpeed = LINK_INIT;
  1722. adapterData->dwLinkSettings=LINK_INIT;
  1723. /* Reset the PHY */
  1724. dwPhyBcr=(u32)PHY_BCR_RESET_ ;
  1725. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_BCR, dwPhyBcr));
  1726. dwLoopCount = 20;
  1727. do {
  1728. mdelay(100);
  1729. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_BCR,&dwPhyBcr));
  1730. dwLoopCount--;
  1731. } while((dwLoopCount>0) && ((u16)dwPhyBcr&PHY_BCR_RESET_));
  1732. if((u16)dwPhyBcr&PHY_BCR_RESET_) {
  1733. SMSC_WARNING("PHY reset failed to complete.");
  1734. goto DONE;
  1735. }
  1736. else {
  1737. SMSC_TRACE(DBG_INIT,"PHY reset!!!");
  1738. }
  1739. if (bConfigureAutoMdix)
  1740. {
  1741. Phy_SetAutoMdix(dev, (u16)auto_mdix);
  1742. }
  1743. phy_SetLink(dev,dwLinkRequest);
  1744. /* set EDPD settings */
  1745. if ((EDPDConfig != 0) && ((dev->chipID == ID_REV_9500A_CHIPID) || (dev->chipID == PID_LAN9530) ||
  1746. (dev->chipID == PID_LAN9730) || (dev->chipID == PID_LAN89530))) {
  1747. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_SILICON_REV, &dwTemp));
  1748. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_SILICON_REV, (dwTemp & 0x03FF) | EDPDConfig));
  1749. }
  1750. if (((dev->chipID == PID_LAN9730) ||
  1751. (dev->chipID == PID_LAN9735) ||
  1752. (dev->chipID == PID_LAN9530) ||
  1753. (dev->chipID == PID_LAN9535) ||
  1754. (dev->chipID == PID_LAN89530)) && (EnableEEE < 2))
  1755. {
  1756. CHECK_RETURN_STATUS(smsc9500_read_reg(dev,MAC_CR,&Value32));
  1757. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_SILICON_REV, &Temp32));
  1758. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_ANEG_ADV, &dwTemp));
  1759. if (EnableEEE==0) {
  1760. Value32 &= ~MAC_CR_ENABLE_EEE;
  1761. Temp32 &= ~PHY_SILICON_REV_EEE_ENABLE;
  1762. dwTemp &= ~PHY_ANEG_NEXT_PAGE;
  1763. } else if (EnableEEE==1) {
  1764. Value32 |= MAC_CR_ENABLE_EEE;
  1765. Temp32 |= PHY_SILICON_REV_EEE_ENABLE;
  1766. dwTemp |= PHY_ANEG_NEXT_PAGE;
  1767. }
  1768. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_ANEG_ADV, dwTemp));
  1769. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_SILICON_REV, Temp32));
  1770. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MAC_CR, Value32)) ;
  1771. }
  1772. result=TRUE;
  1773. DONE:
  1774. SMSC_TRACE(DBG_INIT,"<--Phy_Initialize, result=%s\n",result?"TRUE":"FALSE");
  1775. return result;
  1776. }
  1777. static int smsc9500_get_settings(struct net_device *net, struct ethtool_cmd *cmd)
  1778. {
  1779. struct usbnet *dev = netdev_priv(net);
  1780. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1781. cmd->supported=
  1782. SUPPORTED_10baseT_Half |
  1783. SUPPORTED_10baseT_Full |
  1784. SUPPORTED_100baseT_Half |
  1785. SUPPORTED_100baseT_Full |
  1786. SUPPORTED_Autoneg |
  1787. SUPPORTED_MII;
  1788. cmd->advertising=ADVERTISED_MII;
  1789. if(adapterData->dwLinkSettings & LINK_SPEED_10HD)
  1790. cmd->advertising|=ADVERTISED_10baseT_Half;
  1791. if(adapterData->dwLinkSettings & LINK_SPEED_10FD)
  1792. cmd->advertising|=ADVERTISED_10baseT_Full;
  1793. if(adapterData->dwLinkSettings & LINK_SPEED_100HD)
  1794. cmd->advertising|=ADVERTISED_100baseT_Half;
  1795. if(adapterData->dwLinkSettings & LINK_SPEED_100FD)
  1796. cmd->advertising|=ADVERTISED_100baseT_Full;
  1797. if(adapterData->dwLinkSettings & LINK_AUTO_NEGOTIATE) {
  1798. cmd->advertising|=ADVERTISED_Autoneg;
  1799. cmd->autoneg=AUTONEG_ENABLE;
  1800. } else cmd->autoneg=AUTONEG_DISABLE;
  1801. if(adapterData->dwLinkSpeed & (LINK_SPEED_100HD|LINK_SPEED_100FD))
  1802. cmd->speed=SPEED_100;
  1803. else cmd->speed=SPEED_10;
  1804. if(adapterData->dwLinkSpeed & (LINK_SPEED_10FD|LINK_SPEED_100FD))
  1805. cmd->duplex=DUPLEX_FULL;
  1806. else cmd->duplex=DUPLEX_HALF;
  1807. cmd->port=PORT_MII;
  1808. cmd->phy_address=(u8)adapterData->dwPhyAddress;
  1809. cmd->transceiver=XCVR_INTERNAL;
  1810. cmd->maxtxpkt=0;
  1811. cmd->maxrxpkt=0;
  1812. return 0;
  1813. }
  1814. static int smsc9500_set_settings(struct net_device *net, struct ethtool_cmd *cmd)
  1815. {
  1816. struct usbnet *dev = netdev_priv(net);
  1817. int result=-EFAULT;
  1818. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1819. u32 linkRequest = 0;
  1820. if (cmd->autoneg == AUTONEG_ENABLE) {
  1821. u32 mask = (ADVERTISED_100baseT_Half |
  1822. ADVERTISED_100baseT_Full |
  1823. ADVERTISED_10baseT_Half |
  1824. ADVERTISED_10baseT_Full);
  1825. if (cmd->advertising & ~mask)
  1826. return -EINVAL;
  1827. if (cmd->advertising & ADVERTISED_100baseT_Full)
  1828. linkRequest |= LINK_SPEED_100FD;
  1829. if (cmd->advertising & ADVERTISED_100baseT_Half)
  1830. linkRequest |= LINK_SPEED_100HD;
  1831. if (cmd->advertising & ADVERTISED_10baseT_Full)
  1832. linkRequest |= LINK_SPEED_10FD;
  1833. if (cmd->advertising & ADVERTISED_10baseT_Half)
  1834. linkRequest |= LINK_SPEED_10HD;
  1835. linkRequest |= LINK_AUTO_NEGOTIATE;
  1836. } else {
  1837. if (!((cmd->speed == SPEED_10) || (cmd->speed == SPEED_100)))
  1838. return -EOPNOTSUPP;
  1839. if(cmd->speed == SPEED_100){
  1840. if(cmd->duplex == DUPLEX_FULL){
  1841. linkRequest |= LINK_SPEED_100FD;
  1842. }else{
  1843. linkRequest |= LINK_SPEED_100HD;
  1844. }
  1845. }else{
  1846. if(cmd->duplex == DUPLEX_FULL){
  1847. linkRequest |= LINK_SPEED_10FD;
  1848. }else{
  1849. linkRequest |= LINK_SPEED_10HD;
  1850. }
  1851. }
  1852. }
  1853. linkRequest |= adapterData->dwLinkSettings & (LINK_SYMMETRIC_PAUSE | LINK_ASYMMETRIC_PAUSE); //Keep flow control setting
  1854. adapterData->dwLinkSettings = linkRequest;
  1855. adapterData->dwSavedLinkSettings = linkRequest;
  1856. if(phy_SetLink(dev, adapterData->dwLinkSettings) == SMSC9500_SUCCESS){
  1857. result=0;
  1858. }
  1859. return result;
  1860. }
  1861. void smsc9500_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info)
  1862. {
  1863. struct usbnet *dev = netdev_priv(net);
  1864. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1865. strcpy(info->driver,"Smsc9500");
  1866. memset(&info->version,0,sizeof(info->version));
  1867. sprintf(info->version,"%lX.%02lX.%02lX",
  1868. (DRIVER_VERSION>>16),(DRIVER_VERSION>>8)&0xFF,(DRIVER_VERSION&0xFFUL));
  1869. memset(&info->fw_version,0,sizeof(info->fw_version));
  1870. sprintf(info->fw_version,"%lu",(adapterData->dwIdRev)&0xFFFFUL);
  1871. memset(&info->bus_info,0,sizeof(info->bus_info));
  1872. memset(&info->reserved1,0,sizeof(info->reserved1));
  1873. memset(&info->reserved2,0,sizeof(info->reserved2));
  1874. info->n_stats=0;
  1875. info->testinfo_len=0;
  1876. info->eedump_len=0;
  1877. info->regdump_len=0;
  1878. }
  1879. static int smsc9500_regs_len(struct net_device *dev)
  1880. {
  1881. /* all smsc9500 registers plus all phy registers */
  1882. return 0x200 + (32 * sizeof(u32));
  1883. }
  1884. static void
  1885. smsc9500_get_regs(struct net_device *net, struct ethtool_regs *regs,
  1886. void *buf)
  1887. {
  1888. struct usbnet *dev = netdev_priv(net);
  1889. unsigned int i, j = 0;
  1890. u32 *data = buf;
  1891. smsc9500_read_reg(dev, ID_REV,&regs->version);
  1892. for (i = 0; i < 0x200; i += (sizeof(u32)))
  1893. smsc9500_read_reg(dev, i,&data[j++]);
  1894. for (i = 0; i <= 31; i++)
  1895. smsc9500_read_phy(dev, i,&data[j++]);
  1896. }
  1897. int smsc9500_nway_restart (struct usbnet *dev)
  1898. {
  1899. uint bmcr;
  1900. int r = -EINVAL;
  1901. /* if autoneg is off, it's an error */
  1902. smsc9500_read_phy(dev, PHY_BCR,&bmcr);
  1903. if (bmcr & PHY_BCR_AUTO_NEG_ENABLE_) {
  1904. bmcr |= PHY_BCR_RESTART_AUTO_NEG_;
  1905. smsc9500_write_phy(dev, PHY_BCR, bmcr);
  1906. r = 0;
  1907. }
  1908. return r;
  1909. }
  1910. int smsc9500_nway_reset(struct net_device *net)
  1911. {
  1912. struct usbnet *dev = netdev_priv(net);
  1913. return smsc9500_nway_restart(dev);
  1914. }
  1915. static u32 smsc9500_get_link (struct net_device *net)
  1916. {
  1917. struct usbnet *dev = netdev_priv(net);
  1918. u32 wRegBSR;
  1919. /* read PHY_BSR twice: link status bit is LL */
  1920. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_BSR,&wRegBSR));
  1921. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_BSR,&wRegBSR));
  1922. if(!(wRegBSR & PHY_BSR_LINK_STATUS_)) {//Link down
  1923. return 0;
  1924. } else {
  1925. return 1;
  1926. }
  1927. DONE:
  1928. return 0;
  1929. }
  1930. static u32 smsc9500_get_msglevel (struct net_device *net)
  1931. {
  1932. struct usbnet *dev = netdev_priv(net);
  1933. return dev->msg_enable;
  1934. }
  1935. static void smsc9500_set_msglevel (struct net_device *net, u32 level)
  1936. {
  1937. struct usbnet *dev = netdev_priv(net);
  1938. dev->msg_enable = level;
  1939. }
  1940. static void
  1941. smsc9500_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
  1942. {
  1943. struct usbnet *dev = netdev_priv(net);
  1944. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1945. wolinfo->supported=(WAKE_PHY | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_MAGIC);
  1946. wolinfo->wolopts= adapterData->WolWakeupOpts;
  1947. }
  1948. static int
  1949. smsc9500_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
  1950. {
  1951. struct usbnet *dev = netdev_priv(net);
  1952. int result=-EFAULT;
  1953. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1954. adapterData->WolWakeupOpts = wolinfo->wolopts;
  1955. result=0;
  1956. return result;
  1957. }
  1958. static BOOLEAN IsEepromContentValid(struct usbnet *dev)
  1959. {
  1960. u32 tmp, strapVal, idRev;
  1961. BOOLEAN validContent = FALSE;
  1962. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1963. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, ID_REV, &idRev));
  1964. idRev = idRev >> 16;
  1965. if((idRev == ID_REV_9500_CHIPID) || (idRev == ID_REV_9500A_CHIPID)) {
  1966. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, STRAP_DBG, &strapVal));
  1967. if (strapVal & EEPROM_DISABLE) {
  1968. SMSC_WARNING("EEPROM disable strap is set\n");
  1969. adapterData->eepromContentValid = FALSE;
  1970. return FALSE;
  1971. }
  1972. }
  1973. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, E2P_CMD, &tmp));
  1974. if (tmp & E2P_CMD_LOADED_)
  1975. {
  1976. validContent = TRUE;
  1977. } else {
  1978. SMSC_TRACE(DBG_INIT, "EEPROM content not valid, not loaded\n");
  1979. validContent = FALSE;
  1980. }
  1981. DONE:
  1982. adapterData->eepromContentValid = validContent;
  1983. return validContent;
  1984. }
  1985. static int smsc9500_eeprom_size(struct usbnet *dev)
  1986. {
  1987. u32 tmp, strapVal, idRev;
  1988. int size = 0;
  1989. BOOLEAN validContent = FALSE;
  1990. u32 start, end;
  1991. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  1992. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, ID_REV, &idRev));
  1993. idRev = idRev >> 16;
  1994. if((idRev == ID_REV_9500_CHIPID) || (idRev == ID_REV_9500A_CHIPID)) {
  1995. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, STRAP_DBG, &strapVal));
  1996. if (strapVal & EEPROM_DISABLE) {
  1997. SMSC_WARNING("EEPROM disable strap is set\n");
  1998. size = 0;
  1999. adapterData->eepromContentValid = FALSE;
  2000. return size;
  2001. } else if (!(strapVal & EEPROM_SIZE)) {
  2002. size = 128;
  2003. goto CheckValid;
  2004. }
  2005. }
  2006. if(smsc9500_read_eeprom(dev, 0, sizeof(u32), (BYTE*)&start) < 0) {
  2007. goto DONE;
  2008. }
  2009. if(smsc9500_read_eeprom(dev, 256, sizeof(u32), (BYTE*)&end) < 0) {
  2010. goto DONE;
  2011. }
  2012. /* write to 256 the inverse value of start */
  2013. tmp = ~start;
  2014. if(smsc9500_write_eeprom(dev, 256, sizeof(u32), (BYTE*)&tmp) < 0) {
  2015. goto DONE;
  2016. }
  2017. /* read the location 0 again */
  2018. if(smsc9500_read_eeprom(dev, 0, sizeof(u32), (BYTE*)&tmp) < 0) {
  2019. goto DONE;
  2020. }
  2021. if (tmp != start) {
  2022. /* restore the value of location 0 */
  2023. if(smsc9500_write_eeprom(dev, 0, sizeof(u32), (BYTE*)&start) < 0) {
  2024. goto DONE;
  2025. }
  2026. /* 256 byte eeprom */
  2027. size = 256;
  2028. } else {
  2029. /* restore the value of location 0 */
  2030. if(smsc9500_write_eeprom(dev, 256, sizeof(u32), (BYTE*)&end) < 0) {
  2031. goto DONE;
  2032. }
  2033. /* 512 byte eeprom */
  2034. size = 512;
  2035. }
  2036. CheckValid:
  2037. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, E2P_CMD, &tmp));
  2038. if (tmp & E2P_CMD_LOADED_)
  2039. {
  2040. validContent = TRUE;
  2041. } else {
  2042. validContent = FALSE;
  2043. }
  2044. DONE:
  2045. adapterData->eepromContentValid = validContent;
  2046. return size;
  2047. }
  2048. static int smsc9500_get_eeprom_len(struct net_device *net)
  2049. {
  2050. struct usbnet *dev = netdev_priv(net);
  2051. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2052. return adapterData->eepromSize = smsc9500_eeprom_size(dev);
  2053. }
  2054. static int smsc9500_get_eeprom(struct net_device *netdev, struct ethtool_eeprom *ee, u8 *data)
  2055. {
  2056. struct usbnet *dev = netdev_priv(netdev);
  2057. int offset = ee->offset;
  2058. int len = ee->len;
  2059. int result = 0;
  2060. PADAPTER_DATA adapterData = (PADAPTER_DATA)(dev->data[0]);
  2061. ee->magic = LAN9500_EEPROM_MAGIC;
  2062. adapterData->eepromSize = smsc9500_eeprom_size(dev);
  2063. if (len == 0) {
  2064. return 0;
  2065. }
  2066. if (offset + len > adapterData->eepromSize) {
  2067. SMSC_WARNING("EEPROM address is out of range");
  2068. result = -EINVAL;
  2069. } else {
  2070. if(smsc9500_read_eeprom(dev, offset, len, data) < 0){
  2071. result = -EFAULT;
  2072. }
  2073. }
  2074. return result;
  2075. }
  2076. static int smsc9500_set_eeprom(struct net_device *netdev, struct ethtool_eeprom *ee, u8 *data)
  2077. {
  2078. struct usbnet *dev = netdev_priv(netdev);
  2079. int offset = ee->offset;
  2080. int len = ee->len;
  2081. int result = 0;
  2082. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2083. adapterData->eepromSize = smsc9500_eeprom_size(dev);
  2084. if (len == 0) {
  2085. return 0;
  2086. }
  2087. if (offset + len > adapterData->eepromSize) {
  2088. SMSC_WARNING("EEPROM address is out of range");
  2089. result = -EINVAL;
  2090. return result;
  2091. }
  2092. if (ee->magic != LAN9500_EEPROM_MAGIC) {
  2093. SMSC_WARNING("EEPROM: magic value mismatch, writing fail, magic = 0x%x", ee->magic);
  2094. result = -EFAULT;
  2095. return result;
  2096. }
  2097. if (smsc9500_write_eeprom(dev, offset, len, data) < 0) {
  2098. result=-EFAULT;
  2099. }
  2100. return result;
  2101. }
  2102. #if (LINUX_VERSION_CODE <= KERNEL_VERSION(3,2,31))
  2103. static u32 smsc9500_ethtool_get_tx_csum(struct net_device *netdev)
  2104. {
  2105. struct usbnet *dev = netdev_priv(netdev);
  2106. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2107. return adapterData->UseTxCsum;
  2108. }
  2109. static u32 smsc9500_ethtool_get_rx_csum(struct net_device *netdev)
  2110. {
  2111. struct usbnet *dev = netdev_priv(netdev);
  2112. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2113. return adapterData->UseRxCsum;
  2114. }
  2115. /* Enable or disable Tx & Rx checksum offload engines */
  2116. static int smsc9500_set_csums(struct usbnet *dev)
  2117. {
  2118. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2119. u32 read_buf;
  2120. int ret = smsc9500_read_reg(dev, COE_CR, &read_buf);
  2121. if (ret < 0) {
  2122. SMSC_WARNING("Failed to read COE_CR: %d\n", ret);
  2123. return ret;
  2124. }
  2125. if (adapterData->UseTxCsum)
  2126. read_buf |= Tx_COE_EN_;
  2127. else
  2128. read_buf &= ~Tx_COE_EN_;
  2129. if (adapterData->UseRxCsum)
  2130. read_buf |= Rx_COE_EN_;
  2131. else
  2132. read_buf &= ~Rx_COE_EN_;
  2133. ret = smsc9500_write_reg(dev, COE_CR, read_buf);
  2134. if (ret < 0) {
  2135. SMSC_WARNING("Failed to write COE_CR: %d\n", ret);
  2136. return ret;
  2137. }
  2138. return 0;
  2139. }
  2140. static int smsc9500_ethtool_set_tx_csum(struct net_device *netdev, u32 val)
  2141. {
  2142. struct usbnet *dev = netdev_priv(netdev);
  2143. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2144. adapterData->UseTxCsum = !!val;
  2145. if (adapterData->UseTxCsum)
  2146. netdev->features |= NETIF_F_HW_CSUM;
  2147. else
  2148. netdev->features &= ~NETIF_F_HW_CSUM;
  2149. return smsc9500_set_csums(dev);
  2150. }
  2151. static int smsc9500_ethtool_set_rx_csum(struct net_device *netdev, u32 val)
  2152. {
  2153. struct usbnet *dev = netdev_priv(netdev);
  2154. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2155. adapterData->UseRxCsum = !!val;
  2156. return smsc9500_set_csums(dev);
  2157. }
  2158. #endif
  2159. static void smsc9500_get_ethtool_stats(struct net_device *netdev,struct ethtool_stats *stats, u64 *data)
  2160. {
  2161. struct usbnet *dev = netdev_priv(netdev);
  2162. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2163. char statistics[sizeof(SMSC9500_RX_STATS) + sizeof(SMSC9500_TX_STATS)];
  2164. //Get statistics counters
  2165. if(smsc9500_get_stats(dev, statistics) > 0){
  2166. UpdateStatCounters(dev,statistics);
  2167. }
  2168. data[0]=dev->stats.rx_packets;
  2169. data[1]=dev->stats.tx_packets;
  2170. data[2]=dev->stats.rx_bytes;
  2171. data[3]=dev->stats.tx_bytes;
  2172. data[4]=dev->stats.rx_errors;
  2173. data[5]=dev->stats.tx_errors;
  2174. data[6]=dev->stats.tx_dropped;
  2175. data[7]=dev->stats.rx_dropped;
  2176. data[8]=dev->stats.rx_length_errors;
  2177. data[9]=dev->stats.rx_over_errors;
  2178. data[10]=dev->stats.rx_crc_errors;
  2179. data[11]=dev->stats.rx_frame_errors;
  2180. data[12]=adapterData->RxGoodFrames;
  2181. data[13]=adapterData->RxCrcErrors;
  2182. data[14]=adapterData->RxRuntFrameErrors;
  2183. data[15]=adapterData->RxAlignmentErrors;
  2184. data[16]=adapterData->RxFrameTooLongError;
  2185. data[17]=adapterData->RxLaterCollisionError;
  2186. data[18]=adapterData->RxBadFrames;
  2187. data[19]=adapterData->RxFifoDroppedFrames;
  2188. data[20]=adapterData->TxGoodFrames;
  2189. data[21]=adapterData->TxPauseFrames;
  2190. data[22]=adapterData->TxSingleCollisions;
  2191. data[23]=adapterData->TxMultipleCollisions;
  2192. data[24]=adapterData->TxExcessiveCollisionErrors;
  2193. data[25]=adapterData->TxLateCollisionErrors;
  2194. data[26]=adapterData->TxBufferUnderrunErrors;
  2195. data[27]=adapterData->TxExcessiveDeferralErrors;
  2196. data[28]=adapterData->TxCarrierErrors;
  2197. data[29]=adapterData->TxBadFrames;
  2198. }
  2199. static void smsc9500_get_strings(struct net_device *netdev, u32 stringset,u8 *data)
  2200. {
  2201. memcpy(data, ethtool_stats_keys, sizeof(ethtool_stats_keys));
  2202. }
  2203. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
  2204. static int smsc9500_get_sset_count(struct net_device *netdev)
  2205. {
  2206. return ARRAY_SIZE(ethtool_stats_keys);
  2207. }
  2208. #else
  2209. static int smsc9500_get_sset_count(struct net_device *netdev, int sset)
  2210. {
  2211. switch (sset) {
  2212. case ETH_SS_STATS:
  2213. return ARRAY_SIZE(ethtool_stats_keys);
  2214. default:
  2215. return -EOPNOTSUPP;
  2216. }
  2217. }
  2218. #endif
  2219. /* We need to override some ethtool_ops so we require our
  2220. own structure so we don't interfere with other usbnet
  2221. devices that may be connected at the same time. */
  2222. static struct ethtool_ops smsc9500_ethtool_ops = {
  2223. .get_settings = smsc9500_get_settings,
  2224. .set_settings = smsc9500_set_settings,
  2225. .get_drvinfo = smsc9500_get_drvinfo,
  2226. .get_regs_len = smsc9500_regs_len,
  2227. .get_regs = smsc9500_get_regs,
  2228. .get_wol = smsc9500_get_wol,
  2229. .set_wol = smsc9500_set_wol,
  2230. .get_msglevel = smsc9500_get_msglevel,
  2231. .set_msglevel = smsc9500_set_msglevel,
  2232. .nway_reset = smsc9500_nway_reset,
  2233. .get_link = smsc9500_get_link,
  2234. .get_eeprom_len = smsc9500_get_eeprom_len,
  2235. .get_eeprom = smsc9500_get_eeprom,
  2236. .set_eeprom = smsc9500_set_eeprom,
  2237. #if (LINUX_VERSION_CODE <= KERNEL_VERSION(3,2,31))
  2238. .get_tx_csum = smsc9500_ethtool_get_tx_csum,
  2239. .set_tx_csum = smsc9500_ethtool_set_tx_csum,
  2240. .get_rx_csum = smsc9500_ethtool_get_rx_csum,
  2241. .set_rx_csum = smsc9500_ethtool_set_rx_csum,
  2242. #endif
  2243. .get_strings = smsc9500_get_strings,
  2244. .get_ethtool_stats = smsc9500_get_ethtool_stats,
  2245. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
  2246. .get_stats_count = smsc9500_get_sset_count,
  2247. #else
  2248. .get_sset_count = smsc9500_get_sset_count,
  2249. #endif
  2250. };
  2251. static int Smsc9500_do_ioctl(
  2252. struct net_device *netdev,
  2253. struct ifreq *ifr,
  2254. int cmd)
  2255. {
  2256. int result=0;
  2257. struct usbnet *dev=netdev_priv(netdev);
  2258. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2259. void __user *userAddr=NULL;
  2260. SMSC_TRACE(DBG_IOCTL,"---->Smsc9500_do_ioctl");
  2261. if(netdev==NULL) {
  2262. SMSC_WARNING("netdev==NULL");
  2263. result=-EFAULT;
  2264. goto DONE;
  2265. }
  2266. if(ifr==NULL) {
  2267. SMSC_WARNING("ifr==NULL");
  2268. result=-EFAULT;
  2269. goto DONE;
  2270. }
  2271. userAddr=ifr->ifr_data;
  2272. switch(cmd) {
  2273. case SIOCGMIIPHY:
  2274. case SIOCDEVPRIVATE:
  2275. SMSC_TRACE(DBG_IOCTL,"SIOCGMIIPHY");
  2276. if(adapterData->LanInitialized) {
  2277. struct mii_ioctl_data *miiData=
  2278. (struct mii_ioctl_data *)&(ifr->ifr_data);
  2279. miiData->phy_id=1;
  2280. };
  2281. break;
  2282. case SIOCGMIIREG:
  2283. case SIOCDEVPRIVATE+1:
  2284. SMSC_TRACE(DBG_IOCTL,"SIOCGMIIREG");
  2285. if(adapterData->LanInitialized) {
  2286. struct mii_ioctl_data *miiData=
  2287. (struct mii_ioctl_data *)&(ifr->ifr_data);
  2288. {
  2289. u32 dwValue;
  2290. if(smsc9500_read_phy(dev,miiData->reg_num,&dwValue) < 0){
  2291. result = -EFAULT;
  2292. }
  2293. miiData->val_out=(u16)dwValue;
  2294. }
  2295. };break;
  2296. case SIOCSMIIREG:
  2297. case SIOCDEVPRIVATE+2:
  2298. SMSC_TRACE(DBG_IOCTL,"SIOCSMIIREG");
  2299. if(adapterData->LanInitialized) {
  2300. struct mii_ioctl_data *miiData=
  2301. (struct mii_ioctl_data *)&(ifr->ifr_data);
  2302. {
  2303. u32 dwValue;
  2304. dwValue=miiData->val_in;
  2305. if(smsc9500_write_phy(dev,miiData->reg_num, dwValue) < 0){
  2306. result = -EFAULT;
  2307. }
  2308. }
  2309. };break;
  2310. case SMSC9500_IOCTL:
  2311. result=smsc9500_private_ioctl(adapterData, dev, (PSMSC9500_IOCTL_DATA)userAddr);
  2312. break;
  2313. default:
  2314. result=-EOPNOTSUPP;
  2315. break;
  2316. }
  2317. DONE:
  2318. SMSC_TRACE(DBG_IOCTL,"<--Smsc9500_do_ioctl");
  2319. return result;
  2320. }
  2321. static int smsc9500_private_ioctl(PADAPTER_DATA privateData, struct usbnet *dev, PSMSC9500_IOCTL_DATA ioctlData)
  2322. {
  2323. BOOLEAN success = FALSE;
  2324. int i;
  2325. u32 dwBuf, offset;
  2326. if (ioctlData == NULL) {
  2327. return SMSC9500_FAIL;
  2328. }
  2329. if(ioctlData->dwSignature!=SMSC9500_APP_SIGNATURE) {
  2330. goto DONE;
  2331. }
  2332. switch(ioctlData->dwCommand) {
  2333. case COMMAND_GET_SIGNATURE:
  2334. success=TRUE;
  2335. break;
  2336. case COMMAND_GET_CONFIGURATION:
  2337. privateData->eepromSize = smsc9500_eeprom_size(dev);
  2338. ioctlData->Data[0]=DRIVER_VERSION;
  2339. ioctlData->Data[1]=link_mode;
  2340. ioctlData->Data[2] = privateData->macAddrHi16;
  2341. ioctlData->Data[3] = privateData->MmacAddrLo32;
  2342. ioctlData->Data[4]=debug_mode;
  2343. ioctlData->Data[5]=privateData->dwIdRev;
  2344. ioctlData->Data[6]=privateData->dwFpgaRev;
  2345. ioctlData->Data[7] = 1;
  2346. ioctlData->Data[8]=privateData->dwPhyId;
  2347. ioctlData->Data[9]=privateData->bPhyModel;
  2348. ioctlData->Data[10]=privateData->bPhyRev;
  2349. ioctlData->Data[11]=privateData->dwLinkSpeed;
  2350. ioctlData->Data[12] = privateData->eepromSize / 128; //Unit is 128B
  2351. sprintf(ioctlData->Strng1,"%s, %s",__DATE__,__TIME__);
  2352. success=TRUE;
  2353. break;
  2354. case COMMAND_LAN_GET_REG:
  2355. offset = ioctlData->Data[0];
  2356. if((ioctlData->Data[0] <= LAN_REGISTER_RANGE) && ((ioctlData->Data[0]&0x3UL)==0))
  2357. {
  2358. if(smsc9500_read_reg(dev, offset, &dwBuf) >= 0){
  2359. ioctlData->Data[1] = dwBuf;
  2360. success=TRUE;
  2361. }
  2362. } else {
  2363. SMSC_WARNING("Reading LAN9500 Mem Map Failed");
  2364. goto MEM_MAP_ACCESS_FAILED;
  2365. }
  2366. break;
  2367. case COMMAND_LAN_SET_REG:
  2368. if((ioctlData->Data[0] <= LAN_REGISTER_RANGE) && ((ioctlData->Data[0]&0x3UL)==0))
  2369. {
  2370. offset = ioctlData->Data[0];
  2371. dwBuf = ioctlData->Data[1];
  2372. if(smsc9500_write_reg(dev, offset, dwBuf) >= 0){
  2373. success=TRUE;
  2374. }
  2375. } else {
  2376. SMSC_WARNING("Writing LAN9500 Mem Map Failed");
  2377. MEM_MAP_ACCESS_FAILED:
  2378. SMSC_WARNING(" Invalid offset == 0x%08lX",ioctlData->Data[0]);
  2379. if(ioctlData->Data[0] > LAN_REGISTER_RANGE) {
  2380. SMSC_WARNING(" Out of range");
  2381. }
  2382. if(ioctlData->Data[0]&0x3UL) {
  2383. SMSC_WARNING(" Not u32 aligned");
  2384. }
  2385. }
  2386. break;
  2387. case COMMAND_MAC_GET_REG:
  2388. if((ioctlData->Data[0] >= MAC_REGISTER_RANGE_MIN)&& (ioctlData->Data[0] <= MAC_REGISTER_RANGE_MAX) && ((ioctlData->Data[0]&0x3UL)==0)) {
  2389. offset = ioctlData->Data[0];
  2390. if(smsc9500_read_reg(dev, offset, &dwBuf) >= 0){
  2391. ioctlData->Data[1] = dwBuf;
  2392. success=TRUE;
  2393. }
  2394. } else {
  2395. SMSC_WARNING("Reading Mac Register Failed");
  2396. goto MAC_ACCESS_FAILURE;
  2397. }
  2398. break;
  2399. case COMMAND_MAC_SET_REG:
  2400. if((ioctlData->Data[0] >= MAC_REGISTER_RANGE_MIN)&& (ioctlData->Data[0] <= MAC_REGISTER_RANGE_MAX) && ((ioctlData->Data[0]&0x3UL)==0)) {
  2401. offset = ioctlData->Data[0];
  2402. dwBuf = ioctlData->Data[1];
  2403. if(smsc9500_write_reg(dev, offset, dwBuf) >= 0){
  2404. ioctlData->Data[1] = dwBuf;
  2405. success=TRUE;
  2406. }
  2407. } else {
  2408. SMSC_WARNING("Writing Mac Register Failed");
  2409. MAC_ACCESS_FAILURE:
  2410. if(!(privateData->LanInitialized)) {
  2411. SMSC_WARNING(" LAN Not Initialized,");
  2412. SMSC_WARNING(" Use ifconfig to bring interface UP");
  2413. }
  2414. if(!((ioctlData->Data[0] >= MAC_REGISTER_RANGE_MIN)&& (ioctlData->Data[0] <= MAC_REGISTER_RANGE_MAX))) {
  2415. SMSC_WARNING(" Invalid index == 0x%08lX",ioctlData->Data[0]);
  2416. }
  2417. }
  2418. break;
  2419. case COMMAND_PHY_GET_REG:
  2420. if((ioctlData->Data[0]<32)&&(privateData->LanInitialized)) {
  2421. offset = ioctlData->Data[0];
  2422. if(smsc9500_read_phy(dev,offset, &dwBuf) >= 0){
  2423. success=TRUE;
  2424. ioctlData->Data[1] = dwBuf;
  2425. }
  2426. } else {
  2427. SMSC_WARNING("Reading Phy Register Failed");
  2428. goto PHY_ACCESS_FAILURE;
  2429. }
  2430. break;
  2431. case COMMAND_PHY_SET_REG:
  2432. if((ioctlData->Data[0]<32)&&(privateData->LanInitialized)) {
  2433. offset = ioctlData->Data[0];
  2434. dwBuf = ioctlData->Data[1];
  2435. if(smsc9500_write_phy(dev,offset, dwBuf) >= 0){
  2436. success=TRUE;
  2437. }
  2438. } else {
  2439. SMSC_WARNING("Writing Phy Register Failed");
  2440. PHY_ACCESS_FAILURE:
  2441. if(!(privateData->LanInitialized)) {
  2442. SMSC_WARNING(" Lan Not Initialized,");
  2443. SMSC_WARNING(" Use ifconfig to bring interface UP");
  2444. }
  2445. if(!(ioctlData->Data[0]<32)) {
  2446. SMSC_WARNING(" Invalid index == 0x%ld",ioctlData->Data[0]);
  2447. }
  2448. }
  2449. break;
  2450. case COMMAND_GET_EEPROM:
  2451. {
  2452. BYTE cBuf;
  2453. offset = ioctlData->Data[0];
  2454. privateData->eepromSize = smsc9500_eeprom_size(dev);
  2455. if(offset < privateData->eepromSize) {
  2456. if(smsc9500_read_eeprom(dev, offset, 1, &cBuf) >= 0){
  2457. success = TRUE;
  2458. ioctlData->Data[1] = cBuf;
  2459. }
  2460. } else {
  2461. SMSC_WARNING("Reading EEPROM Failed");
  2462. }
  2463. }
  2464. break;
  2465. case COMMAND_SET_EEPROM:
  2466. {
  2467. BYTE cBuf;
  2468. offset = ioctlData->Data[0];
  2469. cBuf = (BYTE)ioctlData->Data[1];
  2470. privateData->eepromSize = smsc9500_eeprom_size(dev);
  2471. if(offset < privateData->eepromSize) {
  2472. if(smsc9500_write_eeprom(dev, offset, 1, &cBuf) >= 0){
  2473. success=TRUE;
  2474. }
  2475. } else {
  2476. SMSC_WARNING("Writing EEPROM Failed");
  2477. if(!(offset < privateData->eepromSize)) {
  2478. SMSC_WARNING(" Invalid eeprom offset == 0x%d",offset);
  2479. }
  2480. }
  2481. }
  2482. break;
  2483. case COMMAND_SET_EEPROM_BUFFER:
  2484. {
  2485. unsigned int len;
  2486. BYTE * dataBuf;
  2487. offset = ioctlData->Data[0];
  2488. len = ioctlData->Data[1];
  2489. dataBuf = (BYTE *)&ioctlData->Data[2];
  2490. privateData->eepromSize = smsc9500_eeprom_size(dev);
  2491. if(offset < privateData->eepromSize) {
  2492. if(smsc9500_write_eeprom(dev, offset, len, dataBuf) >= 0){
  2493. success=TRUE;
  2494. }
  2495. } else {
  2496. SMSC_WARNING("Writing EEPROM Failed");
  2497. if(!(offset < privateData->eepromSize)) {
  2498. SMSC_WARNING(" Invalid eeprom offset == 0x%d",offset);
  2499. }
  2500. }
  2501. }
  2502. break;
  2503. case COMMAND_DUMP_LAN_REGS:
  2504. success=TRUE;
  2505. for(i=0; i<MAX_LAN_REG_NUM; i++){
  2506. if(smsc9500_read_reg(dev, LanRegMap[i], &dwBuf) < 0){
  2507. SMSC_WARNING("Failed to read LAN reg 0x%x", (unsigned int)LanRegMap[i]);
  2508. success = FALSE;
  2509. }else{
  2510. ioctlData->Data[i] = dwBuf;
  2511. }
  2512. }
  2513. break;
  2514. case COMMAND_DUMP_MAC_REGS:
  2515. if(privateData->LanInitialized) {
  2516. success=TRUE;
  2517. for(i=0; i<MAX_MAC_REG_NUM; i++){
  2518. if(smsc9500_read_reg(dev, MacRegMap[i], &dwBuf) < 0){
  2519. SMSC_WARNING("Failed to read MAC reg 0x%x", (unsigned int)MacRegMap[i]);
  2520. success = FALSE;
  2521. }else{
  2522. ioctlData->Data[i] = dwBuf;
  2523. }
  2524. }
  2525. } else {
  2526. SMSC_WARNING("Mac Not Initialized,");
  2527. SMSC_WARNING(" Use ifconfig to bring interface UP");
  2528. }
  2529. break;
  2530. case COMMAND_DUMP_PHY_REGS:
  2531. if(privateData->LanInitialized) {
  2532. success=TRUE;
  2533. for(i=0; i<MAX_PHY_REG_NUM; i++){
  2534. if(smsc9500_read_phy(dev, PhyRegMap[i], &dwBuf) < 0){
  2535. SMSC_WARNING("Failed to read PHY reg 0x%x", (unsigned int)PhyRegMap[i]);
  2536. success = FALSE;
  2537. }else{
  2538. ioctlData->Data[i] = dwBuf;
  2539. }
  2540. }
  2541. } else {
  2542. SMSC_WARNING("Phy Not Initialized,");
  2543. SMSC_WARNING(" Use ifconfig to bring interface UP");
  2544. }
  2545. break;
  2546. case COMMAND_DUMP_EEPROM:
  2547. {
  2548. success=TRUE;
  2549. privateData->eepromSize = smsc9500_eeprom_size(dev);
  2550. if(smsc9500_read_eeprom(dev, 0, privateData->eepromSize, (BYTE*)ioctlData->Data) < 0){
  2551. success=FALSE;
  2552. }
  2553. };break;
  2554. case COMMAND_GET_MAC_ADDRESS:
  2555. if(privateData->LanInitialized) {
  2556. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, ADDRH, &dwBuf));
  2557. ioctlData->Data[0] = dwBuf;
  2558. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, ADDRL, &dwBuf));
  2559. ioctlData->Data[1] = dwBuf;
  2560. success=TRUE;
  2561. } else {
  2562. SMSC_WARNING("Lan Not Initialized,");
  2563. SMSC_WARNING(" Use ifconfig to bring interface UP");
  2564. }
  2565. break;
  2566. case COMMAND_SET_MAC_ADDRESS:
  2567. if(privateData->LanInitialized)
  2568. {
  2569. u32 dwLow32=ioctlData->Data[1];
  2570. u32 dwHigh16=ioctlData->Data[0];
  2571. if((((dwHigh16 & 0xFFFF) == 0x0UL) && (dwLow32 == 0x0UL))
  2572. || (0x01 & LOBYTE(LOWORD(dwLow32)))) {
  2573. SMSC_WARNING("Not a Valid MAC Address");
  2574. } else {
  2575. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, ADDRH, dwHigh16));
  2576. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, ADDRL, dwLow32));
  2577. dev->net->dev_addr[0]=LOBYTE(LOWORD(dwLow32));
  2578. dev->net->dev_addr[1]=HIBYTE(LOWORD(dwLow32));
  2579. dev->net->dev_addr[2]=LOBYTE(HIWORD(dwLow32));
  2580. dev->net->dev_addr[3]=HIBYTE(HIWORD(dwLow32));
  2581. dev->net->dev_addr[4]=LOBYTE(LOWORD(dwHigh16));
  2582. dev->net->dev_addr[5]=HIBYTE(LOWORD(dwHigh16));
  2583. success=TRUE;
  2584. }
  2585. } else {
  2586. SMSC_WARNING("Lan Not Initialized,");
  2587. SMSC_WARNING("Use ifconfig to bring interface UP");
  2588. };break;
  2589. case COMMAND_LOAD_MAC_ADDRESS:
  2590. if(privateData->LanInitialized) {
  2591. if (privateData->eepromContentValid == TRUE) {
  2592. if(smsc9500_read_eeprom(dev, EEPROM_MAC_OFFSET, 6, dev->net->dev_addr) == 0) {
  2593. dwBuf = dev->net->dev_addr[0] | dev->net->dev_addr[1] << 8 | dev->net->dev_addr[2] << 16 | dev->net->dev_addr[3] << 24;
  2594. ioctlData->Data[1] = dwBuf;
  2595. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, ADDRL, ioctlData->Data[1]));
  2596. dwBuf = dev->net->dev_addr[4] | dev->net->dev_addr[5] << 8;
  2597. ioctlData->Data[0] = dwBuf;
  2598. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, ADDRH, ioctlData->Data[0]));
  2599. success=TRUE;
  2600. } else {
  2601. SMSC_WARNING("Failed to Load Mac Address");
  2602. }
  2603. } else {
  2604. SMSC_WARNING("EEPROM contents not valid");
  2605. }
  2606. } else {
  2607. SMSC_WARNING("Lan Not Initialized");
  2608. SMSC_WARNING("Use ifconfig to bring interface UP");
  2609. };break;
  2610. case COMMAND_SAVE_MAC_ADDRESS:
  2611. if(privateData->LanInitialized) {
  2612. if (privateData->eepromContentValid == TRUE) {
  2613. u32 dwLow32 = ioctlData->Data[1];
  2614. u32 dwHigh16 = ioctlData->Data[0];
  2615. cpu_to_le32s((u32*)&dwLow32);
  2616. cpu_to_le32s((u32*)&dwHigh16);
  2617. if((smsc9500_write_eeprom(dev, EEPROM_MAC_OFFSET, 4, (BYTE*)&dwLow32) == 0) &&
  2618. (smsc9500_write_eeprom(dev, EEPROM_MAC_OFFSET+4, 2, (BYTE*)&dwHigh16) == 0)) {
  2619. success=TRUE;
  2620. }
  2621. } else {
  2622. SMSC_WARNING("EEPROM contents not valid");
  2623. }
  2624. } else {
  2625. SMSC_WARNING("Lan Not Initialized,");
  2626. SMSC_WARNING("Use ifconfig to bring interface UP");
  2627. };break;
  2628. case COMMAND_SET_DEBUG_MODE:
  2629. debug_mode=ioctlData->Data[0];
  2630. if(debug_mode&0x04UL) {
  2631. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, GPIO_CFG, 0x00670700UL));
  2632. success=TRUE;
  2633. } else {
  2634. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, GPIO_CFG, 0x70070000));
  2635. success=TRUE;
  2636. }
  2637. success=TRUE;
  2638. break;
  2639. case COMMAND_SET_LINK_MODE:
  2640. link_mode=(ioctlData->Data[0]&0x7FUL);
  2641. if(privateData->LanInitialized) {
  2642. phy_SetLink(dev,link_mode);
  2643. }
  2644. success=TRUE;
  2645. break;
  2646. case COMMAND_GET_LINK_MODE:
  2647. ioctlData->Data[0]=link_mode;
  2648. success=TRUE;
  2649. break;
  2650. case COMMAND_CHECK_LINK:
  2651. Phy_UpdateLinkMode(dev);
  2652. success=TRUE;
  2653. break;
  2654. case COMMAND_GET_ERRORS:
  2655. ioctlData->Data[0] = dev->extra_error_cnts.tx_epipe;
  2656. ioctlData->Data[1] = dev->extra_error_cnts.tx_eproto;
  2657. ioctlData->Data[2] = dev->extra_error_cnts.tx_etimeout;
  2658. ioctlData->Data[3] = dev->extra_error_cnts.tx_eilseq;
  2659. ioctlData->Data[4] = dev->extra_error_cnts.rx_epipe;
  2660. ioctlData->Data[5] = dev->extra_error_cnts.rx_eproto;
  2661. ioctlData->Data[6] = dev->extra_error_cnts.rx_etimeout;
  2662. ioctlData->Data[7] = dev->extra_error_cnts.rx_eilseq;
  2663. ioctlData->Data[8] = dev->extra_error_cnts.rx_eoverflow;
  2664. success = TRUE;
  2665. break;
  2666. case COMMAND_READ_BYTE:
  2667. ioctlData->Data[1]=(*((volatile BYTE *)(ioctlData->Data[0])));
  2668. success=TRUE;
  2669. break;
  2670. case COMMAND_READ_WORD:
  2671. ioctlData->Data[1]=(*((volatile u16 *)(ioctlData->Data[0])));
  2672. success=TRUE;
  2673. break;
  2674. case COMMAND_READ_DWORD:
  2675. ioctlData->Data[1]=(*((volatile u32 *)(ioctlData->Data[0])));
  2676. success=TRUE;
  2677. break;
  2678. case COMMAND_WRITE_BYTE:
  2679. (*((volatile BYTE *)(ioctlData->Data[0])))=
  2680. ((BYTE)(ioctlData->Data[1]));
  2681. success=TRUE;
  2682. break;
  2683. case COMMAND_WRITE_WORD:
  2684. (*((volatile u16 *)(ioctlData->Data[0])))=
  2685. ((u16)(ioctlData->Data[1]));
  2686. success=TRUE;
  2687. break;
  2688. case COMMAND_WRITE_DWORD:
  2689. (*((volatile u32 *)(ioctlData->Data[0])))=
  2690. ((u32)(ioctlData->Data[1]));
  2691. success=TRUE;
  2692. break;
  2693. case COMMAND_SET_AMDIX_STS:
  2694. auto_mdix=(ioctlData->Data[0]);
  2695. if(privateData->LanInitialized) {
  2696. Phy_SetAutoMdix(dev, (u16)auto_mdix);
  2697. }
  2698. success=TRUE;
  2699. break;
  2700. case COMMAND_GET_AMDIX_STS:
  2701. ioctlData->Data[0]=auto_mdix;
  2702. success=TRUE;
  2703. break;
  2704. default:break;//make lint happy
  2705. }
  2706. DONE:
  2707. if((success)&&(ioctlData!=NULL)) {
  2708. ioctlData->dwSignature=SMSC9500_DRIVER_SIGNATURE;
  2709. return SMSC9500_SUCCESS;
  2710. }
  2711. return SMSC9500_FAIL;
  2712. }
  2713. //#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29))
  2714. static int smsc9500_eth_mac_addr(struct net_device *netdev, void *p)
  2715. {
  2716. struct usbnet *dev = netdev_priv(netdev);
  2717. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2718. struct sockaddr *addr = p;
  2719. if (netif_running(netdev))
  2720. return -EBUSY;
  2721. if (!is_valid_ether_addr((u8 *)addr->sa_data))
  2722. return -EADDRNOTAVAIL;
  2723. memcpy(dev->net->dev_addr, addr->sa_data, ETH_ALEN);
  2724. adapterData->MmacAddrLo32 = dev->net->dev_addr[0] | dev->net->dev_addr[1] << 8 |
  2725. dev->net->dev_addr[2] << 16 | dev->net->dev_addr[3] << 24;
  2726. adapterData->macAddrHi16 = dev->net->dev_addr[4] | dev->net->dev_addr[5] << 8;
  2727. return 0;
  2728. }
  2729. //#endif
  2730. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29))
  2731. static const struct net_device_ops smsc95xx_netdev_ops =
  2732. {
  2733. .ndo_open = smscusbnet_open,
  2734. .ndo_stop = smscusbnet_stop,
  2735. .ndo_start_xmit = smscusbnet_start_xmit,
  2736. .ndo_tx_timeout = smscusbnet_tx_timeout,
  2737. .ndo_change_mtu = smscusbnet_change_mtu,
  2738. .ndo_set_mac_address = smsc9500_eth_mac_addr,
  2739. .ndo_validate_addr = eth_validate_addr,
  2740. .ndo_do_ioctl = Smsc9500_do_ioctl,
  2741. #if (LINUX_VERSION_CODE <= KERNEL_VERSION(3,1,10))
  2742. .ndo_set_multicast_list = smsc9500_set_multicast,
  2743. #else
  2744. .ndo_set_rx_mode=smsc9500_set_multicast,
  2745. #endif
  2746. .ndo_get_stats = smscusbnet_get_stats,
  2747. };
  2748. #endif //linux 2.6.29
  2749. static int smsc9500_bind(struct usbnet *dev, struct usb_interface *intf)
  2750. {
  2751. int ret=0;
  2752. PADAPTER_DATA adapterData=NULL;
  2753. u32 dwBuf;
  2754. char version[15];
  2755. SMSC_TRACE(DBG_INIT,"---------->in smsc9500_bind\n");
  2756. //Init system control and status regsiter map
  2757. LanRegMap[LAN_REG_ID_REV] = ID_REV;
  2758. LanRegMap[LAN_REG_FPGA_REV] = FPGA_REV;
  2759. LanRegMap[LAN_REG_INT_STS] = INT_STS;
  2760. LanRegMap[LAN_REG_RX_CFG] = RX_CFG;
  2761. LanRegMap[LAN_REG_TX_CFG] = TX_CFG;
  2762. LanRegMap[LAN_REG_HW_CFG] = HW_CFG;
  2763. LanRegMap[LAN_REG_RX_FIFO_INF] = RX_FIFO_INF;
  2764. LanRegMap[LAN_REG_TX_FIFO_INF] = TX_FIFO_INF;
  2765. LanRegMap[LAN_REG_PMT_CTRL] = PM_CTRL;
  2766. LanRegMap[LAN_REG_LED_GPIO_CFG] = LED_GPIO_CFG;
  2767. LanRegMap[LAN_REG_GPIO_CFG] = GPIO_CFG;
  2768. LanRegMap[LAN_REG_AFC_CFG] = AFC_CFG;
  2769. LanRegMap[LAN_REG_E2P_CMD] = E2P_CMD;
  2770. LanRegMap[LAN_REG_E2P_DATA] = E2P_DATA;
  2771. LanRegMap[LAN_REG_BURST_CAP] = BURST_CAP;
  2772. LanRegMap[LAN_REG_STRAP_DBG] = STRAP_DBG;
  2773. LanRegMap[LAN_REG_DP_SEL] = DP_SEL;
  2774. LanRegMap[LAN_REG_DP_CMD] = DP_CMD;
  2775. LanRegMap[LAN_REG_DP_ADDR] = DP_ADDR;
  2776. LanRegMap[LAN_REG_DP_DATA0] = DP_DATA0;
  2777. LanRegMap[LAN_REG_DP_DATA1] = DP_DATA1;
  2778. LanRegMap[LAN_REG_GPIO_WAKE] = GPIO_WAKE;
  2779. LanRegMap[LAN_REG_INT_EP_CTL] = INT_EP_CTL;
  2780. LanRegMap[LAN_REG_BULK_IN_DLY] = BULK_IN_DLY;
  2781. //Init MAC register map
  2782. MacRegMap[MAC_REG_MAC_CR] = MAC_CR;
  2783. MacRegMap[MAC_REG_ADDRH] = ADDRH;
  2784. MacRegMap[MAC_REG_ADDRL] = ADDRL;
  2785. MacRegMap[MAC_REG_HASHH] = HASHH;
  2786. MacRegMap[MAC_REG_HASHL] = HASHL;
  2787. MacRegMap[MAC_REG_MII_ADDR] = MII_ADDR;
  2788. MacRegMap[MAC_REG_MII_DATA] = MII_DATA;
  2789. MacRegMap[MAC_REG_FLOW] = FLOW;
  2790. MacRegMap[MAC_REG_VLAN1] = VLAN1;
  2791. MacRegMap[MAC_REG_VLAN2] = VLAN2;
  2792. MacRegMap[MAC_REG_WUFF] = WUFF;
  2793. MacRegMap[MAC_REG_WUCSR] = WUCSR;
  2794. MacRegMap[MAC_REG_COE_CR] = COE_CR;
  2795. //Init PHY map
  2796. PhyRegMap[PHY_REG_BCR] = PHY_BCR;
  2797. PhyRegMap[PHY_REG_BSR] = PHY_BSR;
  2798. PhyRegMap[PHY_REG_ID1] = PHY_ID_1;
  2799. PhyRegMap[PHY_REG_ID2] = PHY_ID_2;
  2800. PhyRegMap[PHY_REG_ANEG_ADV] = PHY_ANEG_ADV;
  2801. PhyRegMap[PHY_REG_ANEG_LPA] = PHY_ANEG_LPA;
  2802. PhyRegMap[PHY_REG_ANEG_ER] = PHY_ANEG_REG;
  2803. PhyRegMap[PHY_REG_SILICON_REV] = PHY_SILICON_REV;
  2804. PhyRegMap[PHY_REG_MODE_CTRL_STS] = PHY_MODE_CTRL_STS;
  2805. PhyRegMap[PHY_REG_SPECIAL_MODES] = PHY_SPECIAL_MODES;
  2806. PhyRegMap[PHY_REG_TSTCNTL] = PHY_TSTCNTL;
  2807. PhyRegMap[PHY_REG_TSTREAD1] = PHY_TSTREAD1;
  2808. PhyRegMap[PHY_REG_TSTREAD2] = PHY_TSTREAD2;
  2809. PhyRegMap[PHY_REG_TSTWRITE] = PHY_TSTWRITE;
  2810. PhyRegMap[PHY_REG_SPECIAL_CTRL_STS] = PHY_SPECIAL_CTRL_STS;
  2811. PhyRegMap[PHY_REG_SITC] = PHY_SITC;
  2812. PhyRegMap[PHY_REG_INT_SRC] = PHY_INT_SRC;
  2813. PhyRegMap[PHY_REG_INT_MASK] = PHY_INT_MASK;
  2814. PhyRegMap[PHY_REG_SPECIAL] = PHY_SPECIAL;
  2815. sprintf(version,"%lX.%02lX.%02lX",
  2816. (DRIVER_VERSION>>16),(DRIVER_VERSION>>8)&0xFF,(DRIVER_VERSION&0xFFUL));
  2817. SMSC_TRACE(DBG_INIT,"Driver smsc9500.ko verison %s, built on %s, %s",version, __TIME__, __DATE__);
  2818. ret=smscusbnet_get_endpoints(dev,intf);
  2819. if (ret<0)
  2820. goto out1;
  2821. dev->data[0]=(unsigned long) kmalloc(sizeof(ADAPTER_DATA),GFP_KERNEL);
  2822. if((PADAPTER_DATA)dev->data[0]==NULL) {
  2823. SMSC_WARNING("Unable to allocate ADAPTER_DATA");
  2824. ret=-ENOMEM;
  2825. goto out1;
  2826. }
  2827. memset((PADAPTER_DATA)dev->data[0],0,sizeof(ADAPTER_DATA));
  2828. adapterData=(PADAPTER_DATA)(dev->data[0]);
  2829. sema_init(&adapterData->phy_mutex, 1);
  2830. sema_init(&adapterData->eeprom_mutex, 1);
  2831. sema_init(&adapterData->internal_ram_mutex, 1);
  2832. sema_init(&adapterData->RxFilterLock, 1);
  2833. if ((ret = smsc9500_read_reg(dev,HW_CFG,&dwBuf)< 0)) {
  2834. SMSC_WARNING("Failed to read HW_CFG: %d", ret);
  2835. return ret;
  2836. }
  2837. if(dwBuf & HW_CFG_SMDET_STS){
  2838. SMSC_TRACE(DBG_INIT,"Come back from net detach");
  2839. }
  2840. adapterData->macAddrHi16 = mac_addr_hi16;
  2841. adapterData->MmacAddrLo32 = mac_addr_lo32;
  2842. /* set initial value for eeprom related variables */
  2843. adapterData->eepromContentValid = IsEepromContentValid(dev);
  2844. adapterData->eepromSize = smsc9500_eeprom_size(dev);
  2845. //Init all registers
  2846. ret = smsc9500_reset(dev);
  2847. if(ret < 0)goto out1;
  2848. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29))
  2849. dev->net->do_ioctl = Smsc9500_do_ioctl;
  2850. dev->net->set_multicast_list = smsc9500_set_multicast;
  2851. dev->net->set_mac_address = smsc9500_eth_mac_addr;
  2852. #else
  2853. dev->net->netdev_ops = &smsc95xx_netdev_ops;
  2854. #endif //2.6.29
  2855. dev->net->ethtool_ops = &smsc9500_ethtool_ops;
  2856. dev->net->flags|=IFF_MULTICAST;
  2857. dev->linkDownSuspend = linkdownsuspend;
  2858. dev->dynamicSuspend = dynamicsuspend;
  2859. if(dev->udev->config->desc.bmAttributes & USB_CONFIG_ATT_WAKEUP) {
  2860. SMSC_TRACE(DBG_INIT,"The device is configed to support remote wakes\n");
  2861. } else {
  2862. SMSC_WARNING("The device is not configed to support remote wakes , Over write to disable linkdownsuspend and dynamicsuspend \n");
  2863. if(dev->dynamicSuspend || dev->linkDownSuspend){
  2864. dev->dynamicSuspend = dev->linkDownSuspend = 0;
  2865. }
  2866. }
  2867. #ifndef CONFIG_PM
  2868. if(dev->dynamicSuspend || dev->linkDownSuspend){
  2869. SMSC_WARNING("Power management has to be enabled in the kernel configuration to support dynamicsuspend and linkdownsuspend");
  2870. dev->dynamicSuspend = dev->linkDownSuspend = 0;
  2871. }
  2872. #endif //CONFIG_PM
  2873. #ifndef CONFIG_USB_SUSPEND
  2874. if(dev->dynamicSuspend || dev->linkDownSuspend){
  2875. SMSC_WARNING("Usb suspend has to be enabled in the kernel configuration to support dynamicsuspend and linkdownsuspend");
  2876. dev->dynamicSuspend = dev->linkDownSuspend = 0;
  2877. }
  2878. #endif //CONFIG_USB_SUSPEND
  2879. if(dev->chipDependFeatures[FEATURE_SMARTDETACH]){
  2880. dev->netDetach = netdetach;
  2881. //If net detach is enabled, link down suspend should be disabled
  2882. if(dev->netDetach)dev->linkDownSuspend = 0;
  2883. }
  2884. #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)) && defined(CONFIG_PM)
  2885. if(dev->dynamicSuspend || dev->linkDownSuspend){
  2886. #if ((LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35)))
  2887. if(dev->udev->autosuspend_disabled){
  2888. #endif
  2889. SMSC_WARNING("Autosuspend should be enabled by shell cmd \"echo auto > /sys/bus/usb/devices/X-XX/power/level\"");
  2890. #if ((LINUX_VERSION_CODE > KERNEL_VERSION(2,6,21)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35)))
  2891. }
  2892. #endif
  2893. }
  2894. #endif
  2895. adapterData->UseScatterGather=scatter_gather;
  2896. adapterData->UseTxCsum=tx_Csum;
  2897. adapterData->UseRxCsum=rx_Csum;
  2898. if (scatter_gather)
  2899. SMSC_TRACE(DBG_INIT,"Tx Scatter-Gather");
  2900. if (tx_Csum)
  2901. SMSC_TRACE(DBG_INIT,"Tx HW Checksum");
  2902. if (rx_Csum)
  2903. SMSC_TRACE(DBG_INIT,"Rx HW Checksum");
  2904. if(adapterData->UseScatterGather) {
  2905. if(adapterData->UseTxCsum)
  2906. dev->net->features = (NETIF_F_HW_CSUM | NETIF_F_SG | NETIF_F_FRAGLIST);
  2907. else
  2908. dev->net->features = (NETIF_F_SG | NETIF_F_FRAGLIST); // Kernel will turn off SG in this case.
  2909. }
  2910. else {
  2911. if(adapterData->UseTxCsum)
  2912. dev->net->features = (NETIF_F_HW_CSUM);
  2913. else
  2914. dev->net->features = 0;
  2915. }
  2916. adapterData->dwTxQueueDisableMask=0;
  2917. spin_lock_init(&(adapterData->TxQueueLock));
  2918. adapterData->TxInitialized=TRUE;
  2919. adapterData->WolWakeupOpts= WAKE_PHY;
  2920. adapterData->LinkActLedCfg = LinkActLedCfg;
  2921. adapterData->LinkLedOnGpio = LinkLedOnGpio;
  2922. adapterData->LinkLedOnGpioBufType = LinkLedBufType;
  2923. adapterData->LinkLedOnGpioPolarity = LinkLedPolarity;
  2924. adapterData->LanInitialized=TRUE;
  2925. SMSC_TRACE(DBG_LINK_CHANGE, "LINK OFF in BIND");
  2926. netif_carrier_off(dev->net);
  2927. if (dynamicsuspend || linkdownsuspend)
  2928. usb_enable_autosuspend(dev->udev);
  2929. SMSC_TRACE(DBG_INIT,"<--------out of bind, return 0\n");
  2930. return 0;
  2931. if (adapterData != NULL){
  2932. kfree(adapterData);
  2933. adapterData=NULL;
  2934. }
  2935. out1:
  2936. SMSC_TRACE(DBG_INIT,"<--------bind out1, return %d\n",ret);
  2937. return ret;
  2938. }
  2939. static void smsc9500_unbind(struct usbnet *dev, struct usb_interface *intf)
  2940. {
  2941. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2942. SMSC_TRACE(DBG_CLOSE,"------->in smsc9500_unbind\n");
  2943. if (adapterData != NULL){
  2944. SMSC_TRACE(DBG_CLOSE,"free adapterData\n");
  2945. kfree(adapterData);
  2946. adapterData=NULL;
  2947. }
  2948. SMSC_TRACE(DBG_CLOSE,"<-------out of smsc9500_unbind\n");
  2949. }
  2950. static int smsc9500_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
  2951. {
  2952. u8 *head;
  2953. u16 size;
  2954. u32 header,AlignCount=0;
  2955. char *packet;
  2956. struct sk_buff *ax_skb;
  2957. int ret = RX_FIXUP_VALID_SKB;
  2958. u16 *vlan_tag;
  2959. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  2960. SMSC_TRACE(DBG_RX,"------->in smsc9500_rx_fixup\n");
  2961. head = (u8 *) skb->data;
  2962. memcpy(&header, head, sizeof(header));
  2963. le32_to_cpus(&header);
  2964. #ifdef RX_OFFSET
  2965. skb_pull(skb, 4 + NET_IP_ALIGN); //two extra for ip header alignment
  2966. packet = (char *)skb->data;
  2967. #else
  2968. packet = head + sizeof(header);
  2969. skb_pull(skb, 4);
  2970. #endif //RX_OFFSET
  2971. while (skb->len > 0) {
  2972. /* get the packet length */
  2973. size = (u16) ((header & RX_STS_FL_)>>16);
  2974. #ifdef RX_OFFSET
  2975. AlignCount = (STATUS_WORD_LEN - ((size + NET_IP_ALIGN) % STATUS_WORD_LEN)) % STATUS_WORD_LEN;
  2976. #else
  2977. AlignCount = (STATUS_WORD_LEN - (size % STATUS_WORD_LEN)) % STATUS_WORD_LEN;
  2978. #endif
  2979. if(header & RX_STS_ES_){
  2980. dev->stats.rx_errors++;
  2981. // dev->stats.rx_dropped++;
  2982. if(header & RX_STS_CRC_){
  2983. dev->stats.rx_crc_errors++;
  2984. }else{
  2985. if(header & (RX_STS_TL_ | RX_STS_RF_)){
  2986. dev->stats.rx_frame_errors++;
  2987. }
  2988. if(((header & RX_STS_LE_) != 0L) && ((header & RX_STS_FT_)==0L)){
  2989. dev->stats.rx_length_errors++;
  2990. }
  2991. }
  2992. if(size == skb->len){//last packet
  2993. return RX_FIXUP_INVALID_SKB;
  2994. }else{
  2995. skb_pull(skb, size+AlignCount);
  2996. if (skb->len == 0) {
  2997. ret = RX_FIXUP_INVALID_SKB;
  2998. return ret;
  2999. }
  3000. goto NEXT_PACKET;
  3001. }
  3002. }
  3003. if ((size == skb->len)){
  3004. if (adapterData->UseRxCsum) {
  3005. u16 wHwCsum;
  3006. #ifdef NET_SKBUFF_DATA_USES_OFFSET
  3007. wHwCsum = *(u16*)(skb_tail_pointer(skb) - 2);
  3008. #else
  3009. wHwCsum = *(u16*)(skb->tail - 2);
  3010. #endif
  3011. skb->csum = wHwCsum;
  3012. }
  3013. if (adapterData->UseRxCsum)
  3014. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
  3015. skb->ip_summed = CHECKSUM_HW;
  3016. #else
  3017. skb->ip_summed = CHECKSUM_COMPLETE;
  3018. #endif
  3019. else
  3020. skb->ip_summed = CHECKSUM_NONE;
  3021. if (adapterData->UseRxCsum)
  3022. {
  3023. skb_trim(skb,size-2-4);
  3024. }
  3025. else
  3026. {
  3027. skb_trim(skb,size-4);
  3028. }
  3029. #ifdef RX_SKB_COPY
  3030. //FIXME: Kernel calculate received size based on skb->truesize, which holds total buffer size.
  3031. //If we allocate a big skb buffer, but only part of buffer hold valid data like turbo mode did,
  3032. //Kernel accumulate received data with skb->truesize, so total received data might be over limit. But
  3033. //actual data size isn't, then kernel may drop the subsequent packets.
  3034. if(TurboMode){
  3035. ax_skb = alloc_skb (skb->len + NET_IP_ALIGN, GFP_ATOMIC);
  3036. skb_reserve (ax_skb, NET_IP_ALIGN);
  3037. skb_put(ax_skb, skb->len);
  3038. memcpy(ax_skb->data, skb->data, skb->len);
  3039. vlan_tag = (u16*)&ax_skb->cb[0];
  3040. *vlan_tag = VLAN_DUMMY; //Reserved value
  3041. smscusbnet_skb_return(dev, ax_skb);
  3042. ret = RX_FIXUP_INVALID_SKB;
  3043. }else{
  3044. ret = RX_FIXUP_VALID_SKB;
  3045. vlan_tag = (u16*)&skb->cb[0];
  3046. *vlan_tag = VLAN_DUMMY; //Reserved value
  3047. }
  3048. #else
  3049. //FIXME: We are not supposed to change truesize, but this is the easy way to cheat kernel without memory copy
  3050. skb->truesize = skb->len + sizeof(struct sk_buff);
  3051. vlan_tag = (u16*)&skb->cb[0];
  3052. *vlan_tag = VLAN_DUMMY; //Reserved value
  3053. #endif
  3054. return ret;
  3055. }
  3056. if (size > (ETH_FRAME_LEN+12)) { // ETH_FRAME_LEN+4(CRC)+2(COE)+4(Vlan)
  3057. SMSC_TRACE(DBG_RX,"size > (ETH_FRAME_LEN+12), hearder= 0x%08x\n", header);
  3058. return RX_FIXUP_ERROR;
  3059. }
  3060. #ifndef RX_SKB_COPY
  3061. ax_skb = skb_clone(skb, GFP_ATOMIC);
  3062. #else
  3063. ax_skb = alloc_skb (size + NET_IP_ALIGN, GFP_ATOMIC);
  3064. skb_reserve (ax_skb, NET_IP_ALIGN);
  3065. #endif
  3066. if (ax_skb) {
  3067. #ifndef RX_SKB_COPY
  3068. ax_skb->len = size;
  3069. ax_skb->data = (u8 *)packet;
  3070. skb_trim(ax_skb, 0);
  3071. skb_put(ax_skb, size);
  3072. #else
  3073. skb_put(ax_skb, size);
  3074. memcpy(ax_skb->data, packet, size);
  3075. #endif
  3076. if (adapterData->UseRxCsum) {
  3077. u16 wHwCsum;
  3078. #ifdef NET_SKBUFF_DATA_USES_OFFSET
  3079. wHwCsum = *(u16*)(skb_tail_pointer(ax_skb) - 2);
  3080. #else
  3081. wHwCsum = *(u16*)(ax_skb->tail - 2);
  3082. #endif
  3083. ax_skb->csum = wHwCsum;
  3084. }
  3085. if (adapterData->UseRxCsum)
  3086. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
  3087. ax_skb->ip_summed = CHECKSUM_HW;
  3088. #else
  3089. ax_skb->ip_summed = CHECKSUM_COMPLETE;
  3090. #endif
  3091. else
  3092. ax_skb->ip_summed = CHECKSUM_NONE;
  3093. if (adapterData->UseRxCsum)
  3094. {
  3095. skb_trim(ax_skb,size-2-4);
  3096. }
  3097. else
  3098. {
  3099. skb_trim(ax_skb,size-4);
  3100. }
  3101. #ifndef RX_SKB_COPY
  3102. //FIXME: We are not supposed to change truesize, but this is the easy way to cheat kernel without memory copy
  3103. ax_skb->truesize = ax_skb->len + sizeof(struct sk_buff);
  3104. #endif
  3105. vlan_tag = (u16*)&ax_skb->cb[0];
  3106. *vlan_tag = VLAN_DUMMY; //Reserved value
  3107. smscusbnet_skb_return(dev, ax_skb);
  3108. } else {
  3109. SMSC_TRACE(DBG_RX,"no ax_skb\n");
  3110. return RX_FIXUP_ERROR;
  3111. }
  3112. skb_pull(skb, size+AlignCount);
  3113. if (skb->len == 0) {
  3114. SMSC_TRACE(DBG_RX,"skb->len==0 left\n");
  3115. break;
  3116. }
  3117. NEXT_PACKET:
  3118. head = (u8 *) skb->data;
  3119. memcpy(&header, head, sizeof(header));
  3120. le32_to_cpus(&header);
  3121. #ifdef RX_OFFSET
  3122. skb_pull(skb, 4 + NET_IP_ALIGN); //two extra for ip header alignment
  3123. packet = (char *)skb->data;
  3124. #else
  3125. packet = head + sizeof(header);
  3126. skb_pull(skb, 4);
  3127. #endif //RX_OFFSET
  3128. }
  3129. if (skb->len < 0) {
  3130. SMSC_WARNING("invalid rx length<0 %d", skb->len);
  3131. return RX_FIXUP_ERROR;
  3132. }
  3133. SMSC_TRACE(DBG_RX,"<-------out of smsc9500_rx_fixup\n");
  3134. return ret;
  3135. }
  3136. static struct sk_buff *smsc9500_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
  3137. int flags)
  3138. {
  3139. int headroom = skb_headroom(skb);
  3140. int tailroom = skb_tailroom(skb);
  3141. int SkbSize,CopySize,AlignmentSize;
  3142. u8 * prt;
  3143. int i;
  3144. unsigned skbFragCnt = skb_shinfo(skb)->nr_frags + 1;
  3145. u32 TxCommandA,TxCommandB;
  3146. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  3147. SMSC_TRACE(DBG_TX,"in smsc9500_tx_fixup\n");
  3148. if (adapterData->UseTxCsum) {
  3149. u32 dwTxCsumPreamble=0;
  3150. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
  3151. if (skb->ip_summed == CHECKSUM_HW)
  3152. {
  3153. int Chsum_start_offset=0;
  3154. CalculateTxChecksumOffset(
  3155. skb,
  3156. &Chsum_start_offset);
  3157. /* tx checksum problem workaround */
  3158. if (skb->len <= 45) {
  3159. u32 csum;
  3160. csum = csum_partial(skb->data + Chsum_start_offset, skb->len - (skb->data + Chsum_start_offset - skb->data), 0);
  3161. *((u16 *)(skb->data + Chsum_start_offset + skb->csum)) = csum_fold(csum);
  3162. goto Non_CheckSumOffLoad;
  3163. }
  3164. dwTxCsumPreamble=(((u16) (Chsum_start_offset + skb->csum)) << 16) | ((u16) Chsum_start_offset);
  3165. }
  3166. #else
  3167. if (skb->ip_summed == CHECKSUM_PARTIAL)
  3168. {
  3169. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22))
  3170. int Chsum_start_offset=0;
  3171. CalculateTxChecksumOffset(
  3172. skb,
  3173. &Chsum_start_offset);
  3174. /* tx checksum problem workaround */
  3175. if (skb->len <= 45) {
  3176. u32 csum;
  3177. csum = csum_partial(skb->data + Chsum_start_offset, skb->len - (skb->data + Chsum_start_offset - skb->data), 0);
  3178. *((u16 *)(skb->data + Chsum_start_offset + skb->csum)) = csum_fold(csum);
  3179. goto Non_CheckSumOffLoad;
  3180. }
  3181. dwTxCsumPreamble=(((u16) (Chsum_start_offset + skb->csum)) << 16) | ((u16) Chsum_start_offset);
  3182. #else
  3183. /* tx checksum problem workaround */
  3184. if (skb->len <= 45) {
  3185. u32 csum;
  3186. csum = csum_partial(skb->head + skb->csum_start, skb->len - (skb->head + skb->csum_start - skb->data), 0);
  3187. *((u16 *)(skb->head + (skb->csum_start + skb->csum_offset))) = csum_fold(csum);
  3188. goto Non_CheckSumOffLoad;
  3189. }
  3190. dwTxCsumPreamble=(((u16) (skb->csum_offset+skb->csum_start-(skb->data - skb->head))) << 16)
  3191. | ((u16) (skb->csum_start-(skb->data - skb->head)));
  3192. #endif
  3193. }
  3194. #endif
  3195. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
  3196. if(skb->ip_summed == CHECKSUM_HW)
  3197. #else
  3198. if(skb->ip_summed == CHECKSUM_PARTIAL)
  3199. #endif
  3200. {
  3201. if (skbFragCnt ==1) {
  3202. // ip_summed, one Fragament
  3203. SMSC_TRACE(DBG_TX,"ip_summed, Onefrag\n");
  3204. AlignmentSize = skb->len % STATUS_WORD_LEN;
  3205. if(AlignmentSize)AlignmentSize = STATUS_WORD_LEN - AlignmentSize;
  3206. if (tx_skb_clone && (!skb_cloned(skb))
  3207. && ((headroom + tailroom) >= (12 + AlignmentSize))) {
  3208. if( (headroom < 12 ) || (tailroom < AlignmentSize) ){
  3209. skb->data = memmove(skb->head +12, skb->data, skb->len);
  3210. SkbSize = skb->len;
  3211. skb_trim(skb, 0);
  3212. skb_put(skb, SkbSize);
  3213. }
  3214. } else {
  3215. struct sk_buff *skb2;
  3216. skb2 = skb_copy_expand(skb, 12, AlignmentSize, flags);
  3217. dev_kfree_skb_any(skb);
  3218. skb = skb2;
  3219. if (!skb)
  3220. return NULL;
  3221. }
  3222. skb_push(skb, STATUS_WORD_LEN);
  3223. memcpy(skb->data, &dwTxCsumPreamble, STATUS_WORD_LEN);
  3224. skb_push(skb, STATUS_WORD_LEN);
  3225. TxCommandB=(u32)(skb->len-STATUS_WORD_LEN)|TX_CMD_B_CSUM_ENABLE;
  3226. cpu_to_le32s((u32*)&TxCommandB);
  3227. memcpy(skb->data, &TxCommandB, STATUS_WORD_LEN);
  3228. skb_push(skb, STATUS_WORD_LEN);
  3229. TxCommandA= TX_CMD_A_FIRST_SEG_ | TX_CMD_A_LAST_SEG_ | (u32)(skb->len-8);
  3230. cpu_to_le32s((u32*)&TxCommandA);
  3231. memcpy(skb->data, &TxCommandA, STATUS_WORD_LEN);
  3232. skb_put(skb, AlignmentSize);
  3233. return skb;
  3234. }
  3235. else {
  3236. // ip_summed, Multi Fragament
  3237. struct sk_buff *skb2;
  3238. SkbSize=skb->len+4*4*(skbFragCnt+1);
  3239. skb2 = dev_alloc_skb(SkbSize);
  3240. SMSC_TRACE(DBG_TX,"ip_summed, Multifrags\n");
  3241. if (!skb2)
  3242. return NULL;
  3243. skb_put(skb2, SkbSize);
  3244. {
  3245. TxCommandA=TX_CMD_A_FIRST_SEG_ |((u32)sizeof(u32));
  3246. TxCommandB=TX_CMD_B_CSUM_ENABLE |((u32)(skb->len+STATUS_WORD_LEN)) ;
  3247. cpu_to_le32s((u32*)&TxCommandA);
  3248. cpu_to_le32s((u32*)&TxCommandB);
  3249. memcpy(skb2->data, &TxCommandA, STATUS_WORD_LEN);
  3250. memcpy(skb2->data+STATUS_WORD_LEN, &TxCommandB, STATUS_WORD_LEN);
  3251. memcpy(skb2->data+8, &dwTxCsumPreamble, STATUS_WORD_LEN);
  3252. }
  3253. {
  3254. TxCommandA =
  3255. ((((unsigned long)(skb->data))&0x03UL)<<16) | //u32 alignment adjustment
  3256. ((u32)((skb->len)-(skb->data_len)));
  3257. TxCommandB=
  3258. ((u32)(skb->len+STATUS_WORD_LEN));
  3259. cpu_to_le32s((u32*)&TxCommandA);
  3260. cpu_to_le32s((u32*)&TxCommandB);
  3261. CopySize=((((u32)(skb->len - skb->data_len))+3+(((unsigned long)(skb->data))&0x03UL))>>2)*4;
  3262. memcpy(skb2->data + 12, &TxCommandA, STATUS_WORD_LEN);
  3263. memcpy(skb2->data + 12 + STATUS_WORD_LEN, &TxCommandB, STATUS_WORD_LEN);
  3264. memcpy(skb2->data + 12 + STATUS_WORD_LEN * 2, (u32 *)(((unsigned long)(skb->data))&0xFFFFFFFCUL),CopySize);
  3265. }
  3266. prt=(u8 *)skb2->data+20+CopySize;
  3267. for(i=1;i<skbFragCnt;i++)
  3268. {
  3269. skb_frag_t *frag = &skb_shinfo(skb)->frags[i - 1];
  3270. #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0))
  3271. void *frag_addr = ((unsigned char *) page_address(frag->page) + frag->page_offset);
  3272. #else
  3273. void *frag_addr = (void *)skb_frag_address(frag);
  3274. #endif
  3275. TxCommandA=
  3276. ((((unsigned long)(frag_addr))&0x03UL)<<16) | //alignment adjustment
  3277. ((u32)(frag->size));
  3278. if (i==(skbFragCnt-1)){
  3279. TxCommandA |= TX_CMD_A_LAST_SEG_ ;
  3280. }
  3281. TxCommandB= ((u32)(skb->len+STATUS_WORD_LEN));
  3282. cpu_to_le32s((u32*)&TxCommandA);
  3283. cpu_to_le32s((u32*)&TxCommandB);
  3284. memcpy(prt, &TxCommandA, STATUS_WORD_LEN);
  3285. prt=prt+STATUS_WORD_LEN;
  3286. memcpy(prt, &TxCommandB, STATUS_WORD_LEN);
  3287. prt=prt+STATUS_WORD_LEN;
  3288. CopySize=((((unsigned long)(frag->size))+3+(((unsigned long)(frag_addr))&0x03UL))>>2)*4;
  3289. memcpy(prt, (u32 *)(((unsigned long)(frag_addr))&0xFFFFFFFCUL),CopySize);
  3290. prt=prt+CopySize;
  3291. }
  3292. skb_trim(skb2,prt-skb2->data);
  3293. dev_kfree_skb_any(skb);
  3294. return skb2;
  3295. }
  3296. }
  3297. else {
  3298. if (skbFragCnt >1) {
  3299. //Non ip_summed, Multifrags
  3300. struct sk_buff *skb2;
  3301. SkbSize=skb->len+4*4*skbFragCnt;
  3302. skb2 = dev_alloc_skb(SkbSize);
  3303. SMSC_TRACE(DBG_TX,"Non ip_summed, Multifrags\n");
  3304. if (!skb2)
  3305. return NULL;
  3306. skb_put(skb2, SkbSize);
  3307. {
  3308. TxCommandA =((((unsigned long)(skb->data))&0x03UL)<<16) | //u32 alignment adjustment
  3309. TX_CMD_A_FIRST_SEG_ |
  3310. (u32)((skb->len)-(skb->data_len));
  3311. TxCommandB=TX_CMD_B_CSUM_ENABLE |((u32)(skb->len));
  3312. cpu_to_le32s((u32*)&TxCommandA);
  3313. cpu_to_le32s((u32*)&TxCommandB);
  3314. SMSC_TRACE(DBG_TX,"first frag. \n");
  3315. CopySize=((((unsigned long)((skb->len)-(skb->data_len)))+3+(((unsigned long)(skb->data))&0x03UL))>>2)*4;
  3316. memcpy(skb2->data, &TxCommandA, STATUS_WORD_LEN);
  3317. memcpy(skb2->data+STATUS_WORD_LEN, &TxCommandB, STATUS_WORD_LEN);
  3318. memcpy(skb2->data+STATUS_WORD_LEN*2, (void *)(((unsigned long)(skb->data))&0xFFFFFFFCUL),CopySize);
  3319. }
  3320. prt=(u8 *)skb2->data+8+CopySize;
  3321. for(i=1;i<skbFragCnt;i++)
  3322. {
  3323. skb_frag_t *frag = &skb_shinfo(skb)->frags[i - 1];
  3324. #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0))
  3325. void *frag_addr = ((unsigned char *)page_address(frag->page) + frag->page_offset);
  3326. #else
  3327. void *frag_addr = (void *)skb_frag_address(frag);
  3328. #endif
  3329. TxCommandA=
  3330. ((((unsigned long)(frag_addr))&0x03UL)<<16) | //u32 alignment adjustment
  3331. ((u32)(frag->size));
  3332. if (i==(skbFragCnt-1)){
  3333. TxCommandA |= TX_CMD_A_LAST_SEG_ ;
  3334. }
  3335. TxCommandB=((u32)(skb->len));
  3336. cpu_to_le32s((u32*)&TxCommandA);
  3337. cpu_to_le32s((u32*)&TxCommandB);
  3338. memcpy(prt, &TxCommandA, STATUS_WORD_LEN);
  3339. prt=prt+STATUS_WORD_LEN;
  3340. memcpy(prt, &TxCommandB, STATUS_WORD_LEN);
  3341. prt=prt+STATUS_WORD_LEN;
  3342. CopySize=((((unsigned long)(frag->size))+3+(((unsigned long)(frag_addr))&0x03UL))>>2)*4;
  3343. memcpy(prt, (void *)(((unsigned long)(frag_addr))&0xFFFFFFFCUL),CopySize);
  3344. prt=prt+CopySize;
  3345. }
  3346. skb_trim(skb2,prt-skb2->data);
  3347. dev_kfree_skb_any(skb);
  3348. SMSC_TRACE(DBG_TX,"return from Nonip_summed, Multifrags\n");
  3349. return skb2;
  3350. } else {
  3351. goto Non_CheckSumOffLoad;
  3352. }
  3353. }
  3354. }
  3355. else {
  3356. Non_CheckSumOffLoad:
  3357. //Non ip_summed, onefrag
  3358. SMSC_TRACE(DBG_TX,"Non ip_summed, onefrag\n");
  3359. AlignmentSize = skb->len % STATUS_WORD_LEN;
  3360. if(AlignmentSize)AlignmentSize = STATUS_WORD_LEN - AlignmentSize;
  3361. if (tx_skb_clone && (!skb_cloned(skb))
  3362. && ((headroom + tailroom) >= (2*STATUS_WORD_LEN + AlignmentSize))) {
  3363. if ((headroom < (2*STATUS_WORD_LEN)) || (tailroom < AlignmentSize)){
  3364. skb->data = memmove(skb->head + 2*STATUS_WORD_LEN, skb->data, skb->len);
  3365. SkbSize = skb->len;
  3366. skb_trim(skb, 0);
  3367. skb_put(skb, SkbSize);
  3368. }
  3369. } else {
  3370. struct sk_buff *skb2;
  3371. skb2 = skb_copy_expand(skb, 2*STATUS_WORD_LEN, AlignmentSize, flags);
  3372. dev_kfree_skb_any(skb);
  3373. skb = skb2;
  3374. if (!skb)
  3375. return NULL;
  3376. }
  3377. skb_push(skb, STATUS_WORD_LEN);
  3378. TxCommandB=(u32)(skb->len - STATUS_WORD_LEN);
  3379. cpu_to_le32s((u32*)&TxCommandB);
  3380. memcpy(skb->data, &TxCommandB, STATUS_WORD_LEN);
  3381. skb_push(skb, STATUS_WORD_LEN);
  3382. TxCommandA= TX_CMD_A_FIRST_SEG_ | TX_CMD_A_LAST_SEG_ | (u32)(skb->len - 2*STATUS_WORD_LEN);
  3383. cpu_to_le32s((u32*)&TxCommandA);
  3384. memcpy(skb->data, &TxCommandA, STATUS_WORD_LEN);
  3385. skb_put(skb, AlignmentSize);
  3386. return skb;
  3387. }
  3388. }
  3389. static int smsc9500_reset(struct usbnet *dev)
  3390. {
  3391. int ret=0,Timeout;
  3392. u32 dwReadBuf, dwAddrH, dwAddrL, dwWriteBuf,dwMacCr,DwTemp, dwBurstCap;
  3393. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  3394. SMSC_TRACE(DBG_INIT,"---------->smsc9500_reset\n");
  3395. if ((ret = smsc9500_read_reg(dev,HW_CFG,&dwReadBuf)< 0)) {
  3396. SMSC_WARNING("Failed to read HW_CFG: %d", ret);
  3397. return ret;
  3398. }
  3399. dwReadBuf |= HW_CFG_LRST_;
  3400. if ((ret = smsc9500_write_reg(dev, HW_CFG, dwReadBuf))<0)
  3401. {
  3402. SMSC_WARNING("Failed to write HW_CFG_LRST_ bit in HW_CFG register, ret = %d \n",ret);
  3403. return ret;
  3404. }
  3405. Timeout = 0;
  3406. do {
  3407. if ((ret = smsc9500_read_reg(dev,HW_CFG,&dwReadBuf)< 0)) {
  3408. SMSC_WARNING("Failed to read HW_CFG: %d", ret);
  3409. return ret;
  3410. }
  3411. msleep(100); /* wait for 100 us before trying again */
  3412. Timeout++;
  3413. } while ( (dwReadBuf & HW_CFG_LRST_) && (Timeout < 100));
  3414. if(Timeout >= 100)
  3415. {
  3416. SMSC_WARNING("Timeout waiting for completion of Lite Reset\n");
  3417. return SMSC9500_FAIL;
  3418. }
  3419. if((ret = smsc9500_read_reg(dev, ID_REV, &dev->chipID)) < 0){
  3420. SMSC_WARNING("Failed to read GPIO_CFG: %d", ret);
  3421. return ret;
  3422. }
  3423. dev->chipID = dev->chipID >> 16;
  3424. /*******Enable chip specific features**************/
  3425. if (dev->chipID == ID_REV_9512_CHIPID) {
  3426. dev->chipDependFeatures[FEATURE_WUFF_8] = TRUE;
  3427. } else if (dev->chipID == ID_REV_9500A_CHIPID) {
  3428. int i;
  3429. for(i=0; i<FEATURE_MAX_NO; i++)
  3430. dev->chipDependFeatures[i] = TRUE;
  3431. dev->chipDependFeatures[FEATURE_EEE] = FALSE;
  3432. } else if ((dev->chipID == PID_LAN9530) || (dev->chipID == PID_LAN9730) || (dev->chipID == PID_LAN89530)) {
  3433. int i;
  3434. for(i=0; i<FEATURE_MAX_NO; i++)
  3435. dev->chipDependFeatures[i] = TRUE;
  3436. }
  3437. if ((ret = smsc9500_read_reg(dev,PM_CTRL,&DwTemp)< 0)) {
  3438. SMSC_WARNING("Failed to read PM_CTRL: %d", ret);
  3439. return ret;
  3440. }
  3441. if ((ret = smsc9500_write_reg(dev, PM_CTRL, (DwTemp | PM_CTL_PHY_RST_))< 0)) {
  3442. SMSC_WARNING("Failed to write PM_CTRL: %d", ret);
  3443. return ret;
  3444. }
  3445. Timeout = 0;
  3446. do {
  3447. if ((ret = smsc9500_read_reg(dev,PM_CTRL,&dwReadBuf)< 0)) {
  3448. SMSC_WARNING("Failed to read PM_CTRL: %d", ret);
  3449. return ret;
  3450. }
  3451. msleep(100);
  3452. Timeout++;
  3453. } while ( (dwReadBuf & PM_CTL_PHY_RST_) && (Timeout < 100));
  3454. if(Timeout >= 100)
  3455. {
  3456. SMSC_WARNING("Timeout waiting for PHY Reset\n");
  3457. return SMSC9500_FAIL;
  3458. }
  3459. dwAddrH = 0x0000FFFFUL;
  3460. dwAddrL = 0xFFFFFFFF;
  3461. if(adapterData->macAddrHi16 != 0xFFFFFFFF || adapterData->MmacAddrLo32 != 0xFFFFFFFF){
  3462. dwAddrH = adapterData->macAddrHi16 & 0xFFFF;
  3463. dwAddrL = adapterData->MmacAddrLo32;
  3464. }else{
  3465. if((adapterData->eepromContentValid == TRUE) && (smsc9500_read_eeprom(dev, EEPROM_MAC_OFFSET, 6, dev->net->dev_addr) == 0)){
  3466. if (smsc9500_is_valid_ether_addr(dev->net->dev_addr)) {
  3467. dwAddrL = dev->net->dev_addr[0] | dev->net->dev_addr[1] << 8 | dev->net->dev_addr[2] << 16 | dev->net->dev_addr[3] << 24;
  3468. dwAddrH = dev->net->dev_addr[4] | dev->net->dev_addr[5] << 8;
  3469. }
  3470. }else{//LAN9500's descriptor RAM may provide Mac address
  3471. MAC_ADDR_IN_RAM macRam;
  3472. if(ReadDataPort(dev, RAMSEL_EEPROM, 0, sizeof(MAC_ADDR_IN_RAM)/4, (u32*)&macRam, NULL) == SMSC9500_SUCCESS){
  3473. cpu_to_le32s(&macRam.signature);
  3474. cpu_to_le32s(&macRam.MacAddrL);
  3475. cpu_to_le32s(&macRam.MacAddrH);
  3476. cpu_to_le16s(&macRam.crc);
  3477. cpu_to_le16s(&macRam.crcComplement);
  3478. if(macRam.signature == 0x736D7363){//Signature "smsc"
  3479. u16 crc = CalculateCrc16((BYTE *)&macRam, 12, FALSE);
  3480. if((crc == macRam.crc) && (crc == (u16)~macRam.crcComplement)){
  3481. dwAddrL = macRam.MacAddrL;
  3482. dwAddrH = macRam.MacAddrH;
  3483. }
  3484. }
  3485. }
  3486. }
  3487. }
  3488. //Mac address could be initialized by system firmware. Lan9500A will implement this way.
  3489. if((dwAddrH==0x0000FFFFUL)&&(dwAddrL==0xFFFFFFFF)){
  3490. if ((ret = smsc9500_read_reg(dev,ADDRL, &dwAddrL)< 0)) {
  3491. SMSC_WARNING("Failed to read ADDRL: %d", ret);
  3492. return ret;
  3493. }
  3494. if ((ret = smsc9500_read_reg(dev,ADDRH, &dwAddrH)< 0)) {
  3495. SMSC_WARNING("Failed to read ADDRH: %d", ret);
  3496. return ret;
  3497. }
  3498. }
  3499. if((((dwAddrH & 0xFFFF) == 0x0000FFFFUL) && (dwAddrL == 0xFFFFFFFF))
  3500. || (((dwAddrH & 0xFFFF) == 0x0UL) && (dwAddrL == 0x0UL))
  3501. || (0x01 & LOBYTE(LOWORD(dwAddrL))))
  3502. {
  3503. dwAddrH=0x00000070UL;
  3504. dwAddrL=0x110F8000UL;
  3505. SMSC_TRACE(DBG_INIT,"Mac Address is set by default to 0x%04X%08X\n",
  3506. dwAddrH,dwAddrL);
  3507. }
  3508. adapterData->macAddrHi16 = dwAddrH;
  3509. adapterData->MmacAddrLo32 = dwAddrL;
  3510. if ((ret = smsc9500_write_reg(dev,ADDRL, dwAddrL)< 0)) {
  3511. SMSC_WARNING("Failed to write ADDRL: %d", ret);
  3512. return ret;
  3513. }
  3514. if ((ret = smsc9500_write_reg(dev,ADDRH, dwAddrH)< 0)) {
  3515. SMSC_WARNING("Failed to write ADDRH: %d", ret);
  3516. return ret;
  3517. }
  3518. dev->net->dev_addr[0]=LOBYTE(LOWORD(dwAddrL));
  3519. dev->net->dev_addr[1]=HIBYTE(LOWORD(dwAddrL));
  3520. dev->net->dev_addr[2]=LOBYTE(HIWORD(dwAddrL));
  3521. dev->net->dev_addr[3]=HIBYTE(HIWORD(dwAddrL));
  3522. dev->net->dev_addr[4]=LOBYTE(LOWORD(dwAddrH));
  3523. dev->net->dev_addr[5]=HIBYTE(LOWORD(dwAddrH));
  3524. SMSC_TRACE(DBG_INIT,"dev->net->dev_addr %02x:%02x:%02x:%02x:%02x:%02x\n",
  3525. dev->net->dev_addr [0], dev->net->dev_addr [1],
  3526. dev->net->dev_addr [2], dev->net->dev_addr [3],
  3527. dev->net->dev_addr [4], dev->net->dev_addr [5]);
  3528. #ifdef PME_EEPROMLESS
  3529. if ((ret=EepromLessPMESetting(dev))<0)
  3530. return ret;
  3531. #endif
  3532. if (!(smscusbnet_IsOperationalMode(dev))) {
  3533. if ((ret = smsc9500_read_reg(dev,HW_CFG,&dwReadBuf)< 0)) {
  3534. SMSC_WARNING("Failed to read HW_CFG: %d", ret);
  3535. return ret;
  3536. }
  3537. SMSC_TRACE(DBG_INIT,"Read Value from HW_CFG : 0x%08x\n",dwReadBuf);
  3538. dwReadBuf |=HW_CFG_BIR_;
  3539. if ((ret = smsc9500_write_reg(dev, HW_CFG, dwReadBuf))<0)
  3540. {
  3541. SMSC_WARNING("Failed to write HW_CFG_BIR_ bit in HW_CFG register, ret = %d ",ret);
  3542. return ret;
  3543. }
  3544. if ((ret = smsc9500_read_reg(dev,HW_CFG,&dwReadBuf)< 0)) {
  3545. SMSC_WARNING("Failed to read HW_CFG: %d", ret);
  3546. return ret;
  3547. }
  3548. SMSC_TRACE(DBG_INIT,"Read Value from HW_CFG after writing HW_CFG_BIR_: 0x%08x\n",dwReadBuf);
  3549. }
  3550. if (TurboMode) {
  3551. if(dev->udev->speed == USB_SPEED_HIGH){
  3552. dev->rx_urb_size = DEFAULT_HS_BURST_CAP_SIZE;
  3553. dwBurstCap = DEFAULT_HS_BURST_CAP_SIZE / HS_USB_PKT_SIZE;
  3554. }else{
  3555. dev->rx_urb_size = DEFAULT_FS_BURST_CAP_SIZE;
  3556. dwBurstCap = DEFAULT_FS_BURST_CAP_SIZE / FS_USB_PKT_SIZE;
  3557. }
  3558. }else{
  3559. dwBurstCap = 0;
  3560. dev->rx_urb_size = MAX_SINGLE_PACKET_SIZE;
  3561. }
  3562. SMSC_TRACE(DBG_INIT,"rx_urb_size= %d\n", (int)dev->rx_urb_size);
  3563. if ((ret = smsc9500_write_reg(dev, BURST_CAP, dwBurstCap))<0)
  3564. {
  3565. SMSC_WARNING("Failed to write BURST_CAP");
  3566. return ret;
  3567. }
  3568. if ((ret = smsc9500_read_reg(dev,BURST_CAP,&dwReadBuf)< 0)) {
  3569. SMSC_WARNING("Failed to read BURST_CAP: %d", ret);
  3570. return ret;
  3571. }
  3572. SMSC_TRACE(DBG_INIT,"Read Value from BURST_CAP after writing: 0x%08x\n",dwReadBuf);
  3573. if ((ret = smsc9500_write_reg(dev, BULK_IN_DLY, bulkin_delay))<0)
  3574. {
  3575. SMSC_WARNING("Failed to write BULK_IN_DLY");
  3576. return ret;
  3577. }
  3578. if ((ret = smsc9500_read_reg(dev,BULK_IN_DLY,&dwReadBuf)< 0)) {
  3579. SMSC_WARNING("Failed to read BULK_IN_DLY: %d", ret);
  3580. return ret;
  3581. }
  3582. SMSC_TRACE(DBG_INIT,"Read Value from BULK_IN_DLY after writing: 0x%08x\n",dwReadBuf);
  3583. if ((ret = smsc9500_read_reg(dev,HW_CFG,&dwReadBuf)< 0)) {
  3584. SMSC_WARNING("Failed to read HW_CFG: %d", ret);
  3585. return ret;
  3586. }
  3587. SMSC_TRACE(DBG_INIT,"Read Value from HW_CFG: 0x%08x\n",dwReadBuf);
  3588. if (TurboMode) {
  3589. dwReadBuf |= (HW_CFG_MEF_|HW_CFG_BCE_);
  3590. }
  3591. #ifdef RX_OFFSET
  3592. dwReadBuf &= ~HW_CFG_RXDOFF_;
  3593. dwReadBuf |= NET_IP_ALIGN << 9; //set Rx data offset=2, Make IP header aligns on word boundary.
  3594. #endif
  3595. if ((ret = smsc9500_write_reg(dev, HW_CFG, dwReadBuf))<0)
  3596. {
  3597. SMSC_WARNING("Failed to write HW_CFG_BIR_ bit in HW_CFG register, ret = %d \n",ret);
  3598. return ret;
  3599. }
  3600. if ((ret = smsc9500_read_reg(dev,HW_CFG,&dwReadBuf)< 0)) {
  3601. SMSC_WARNING("Failed to read HW_CFG: %d", ret);
  3602. return ret;
  3603. }
  3604. SMSC_TRACE(DBG_INIT,"Read Value from HW_CFG after writing: 0x%08x\n",dwReadBuf);
  3605. if ((ret = smsc9500_write_reg(dev, INT_STS, 0xFFFFFFFFUL))<0)
  3606. {
  3607. SMSC_WARNING("Failed to write INT_STS register, ret = %d \n",ret);
  3608. return ret;
  3609. }
  3610. if ((ret = smsc9500_read_reg(dev,ID_REV,&dwReadBuf)< 0)) {
  3611. SMSC_WARNING("Failed to read ID_REV: %d", ret);
  3612. return ret;
  3613. }
  3614. adapterData->dwIdRev = dwReadBuf;
  3615. SMSC_TRACE(DBG_INIT,"ID_REV = 0x%08x\n",dwReadBuf);
  3616. if ((ret = smsc9500_read_reg(dev,FPGA_REV,&dwReadBuf)< 0)) {
  3617. SMSC_WARNING("Failed to read FPGA_REV: %d", ret);
  3618. return ret;
  3619. }
  3620. adapterData->dwFpgaRev = dwReadBuf;
  3621. SMSC_TRACE(DBG_INIT,"FPGA_REV = 0x%08x\n",dwReadBuf);
  3622. if (smscusbnet_IsOperationalMode(dev)) {
  3623. if ((ret = smsc9500_read_reg(dev,INT_EP_CTL,&dwReadBuf)< 0)) {
  3624. SMSC_WARNING("Failed to read INT_EP_CTL: %d", ret);
  3625. return ret;
  3626. }
  3627. SMSC_TRACE(DBG_INIT,"Read Value from INT_EP_CTL: 0x%08x\n",dwReadBuf);
  3628. dwReadBuf|=INT_EP_CTL_RX_FIFO_EN_;
  3629. if ((ret = smsc9500_write_reg(dev, INT_EP_CTL, dwReadBuf))<0)
  3630. {
  3631. SMSC_WARNING("Failed to write INT_EP_CTL register,ret = %d \n",ret);
  3632. return ret;
  3633. }
  3634. if ((ret = smsc9500_read_reg(dev,INT_EP_CTL,&dwReadBuf)< 0)) {
  3635. SMSC_WARNING("Failed to read INT_EP_CTL: %d", ret);
  3636. return ret;
  3637. }
  3638. SMSC_TRACE(DBG_INIT,"Read Value from INT_EP_CTLafter writing INT_EP_CTL_RX_FIFO_EN_: 0x%08x\n",dwReadBuf);
  3639. }
  3640. /* Set TX COE */
  3641. if(adapterData->UseTxCsum)
  3642. {
  3643. if ((ret = smsc9500_read_reg(dev, COE_CR,&dwReadBuf)< 0)) {
  3644. SMSC_WARNING("Failed to read COE_CR: %d", ret);
  3645. return ret;
  3646. }
  3647. dwReadBuf |= Tx_COE_EN_;
  3648. if ((ret = smsc9500_write_reg(dev, COE_CR, dwReadBuf)< 0)) {
  3649. SMSC_WARNING("Failed to write COE_CR: %d", ret);
  3650. return ret;
  3651. }
  3652. if ((ret = smsc9500_read_reg(dev, COE_CR,&DwTemp)< 0)) {
  3653. SMSC_WARNING("Failed to read COE_CR: %d", ret);
  3654. return ret;
  3655. }
  3656. SMSC_TRACE(DBG_INIT,"COE_CR = 0x%08x\n", DwTemp);
  3657. }
  3658. if ((ret = smsc9500_write_reg(dev, FLOW, 0x0UL)< 0)) {
  3659. SMSC_WARNING("Failed to write FLOW: %d", ret);
  3660. return ret;
  3661. }
  3662. if ((ret = smsc9500_write_reg(dev, AFC_CFG, AFC_CFG_DEFAULT)< 0)) {
  3663. SMSC_WARNING("Failed to write AFC_CFG: %d", ret);
  3664. return ret;
  3665. }
  3666. if ((ret = smsc9500_read_reg(dev, MAC_CR,&dwMacCr)< 0)) {
  3667. SMSC_WARNING("Failed to read MAC_CR: %d", ret);
  3668. return ret;
  3669. }
  3670. dwMacCr|=(MAC_CR_TXEN_);
  3671. if ((ret = smsc9500_write_reg(dev, MAC_CR, dwMacCr)< 0)) {
  3672. SMSC_WARNING("Failed to read MAC_CR: %d", ret);
  3673. return ret;
  3674. }
  3675. dwWriteBuf=TX_CFG_ON_;
  3676. if ((ret = smsc9500_write_reg(dev,TX_CFG, dwWriteBuf)< 0)) {
  3677. SMSC_WARNING("Failed to write TX_CFG: %d", ret);
  3678. return ret;
  3679. }
  3680. /* Set Vlan */
  3681. {
  3682. dwWriteBuf=(u32)ETH_P_8021Q;
  3683. if ((ret = smsc9500_write_reg(dev,VLAN1, dwWriteBuf)< 0)) {
  3684. SMSC_WARNING("Failed to write VAN1: %d", ret);
  3685. return ret;
  3686. }
  3687. }
  3688. /* Set Rx COE */
  3689. if (adapterData->UseRxCsum) {
  3690. if ((ret = smsc9500_read_reg(dev, COE_CR,&dwReadBuf)< 0)) {
  3691. SMSC_WARNING("Failed to read COE_CR: %d", ret);
  3692. return ret;
  3693. }
  3694. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15))
  3695. dwReadBuf|=(Rx_COE_EN_ | Rx_COE_MODE_);
  3696. #else
  3697. dwReadBuf|=Rx_COE_EN_;
  3698. #endif
  3699. if ((ret = smsc9500_write_reg(dev, COE_CR, dwReadBuf)< 0)) {
  3700. SMSC_WARNING("Failed to write COE_CR: %d", ret);
  3701. return ret;
  3702. }
  3703. if ((ret = smsc9500_read_reg(dev, COE_CR,&DwTemp)< 0)) {
  3704. SMSC_WARNING("Failed to read COE_CR: %d", ret);
  3705. return ret;
  3706. }
  3707. SMSC_TRACE(DBG_INIT,"COE_CR = 0x%08x\n", DwTemp);
  3708. }
  3709. if ((ret = smsc9500_read_reg(dev, MAC_CR,&dwMacCr)< 0)) {
  3710. SMSC_WARNING("Failed to read MAC_CR: %d", ret);
  3711. return ret;
  3712. }
  3713. dwMacCr|=MAC_CR_RXEN_;
  3714. if ((ret = smsc9500_write_reg(dev, MAC_CR, dwMacCr)< 0)) {
  3715. SMSC_WARNING("Failed to read MAC_CR: %d", ret);
  3716. return ret;
  3717. }
  3718. /* Enable the LEDs by default */
  3719. if ((ret = smsc9500_read_reg(dev, LED_GPIO_CFG,&DwTemp)< 0)) {
  3720. SMSC_WARNING("Failed to read LED_GPIO_CFG: %d", ret);
  3721. return ret;
  3722. }
  3723. DwTemp &= ~LED_GPIO_CFG_GPCTL_10_ | ~LED_GPIO_CFG_GPCTL_09_ | ~LED_GPIO_CFG_GPCTL_08_;
  3724. if((ret = smsc9500_write_reg( dev, LED_GPIO_CFG,
  3725. (LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_10_SH) |
  3726. (LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_09_SH) |
  3727. (LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_08_SH))) < 0)
  3728. {
  3729. SMSC_WARNING("Failed to write LED_GPIO_CFG: %d", ret);
  3730. return ret;
  3731. }
  3732. if (adapterData->LinkActLedCfg){ // Driver parameter enables separate Link and Activity LEDs in Thera 130
  3733. // Make sure that the device is LAN9500A
  3734. if ((ret = smsc9500_read_reg(dev, ID_REV,&DwTemp)< 0)) {
  3735. SMSC_WARNING("Failed to read ID_REV: %d", ret);
  3736. return ret;
  3737. }
  3738. if(dev->chipDependFeatures[FEATURE_SEP_LEDS]){
  3739. u32 dwLedGpioCfg = (LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_10_SH) |
  3740. (LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_09_SH) |
  3741. (LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_08_SH);
  3742. // Enable separate Link/Act LEDs
  3743. dwLedGpioCfg |= LED_GPIO_CFG_LED_SEL_;
  3744. // Set LED GPIO Config
  3745. if((ret = smsc9500_write_reg(dev, LED_GPIO_CFG, dwLedGpioCfg)) < 0){
  3746. SMSC_WARNING("Failed to write LED_GPIO_CFG: %d", ret);
  3747. return ret;
  3748. }
  3749. }else{
  3750. // Reset to default value
  3751. adapterData->LinkActLedCfg = 0;
  3752. // Disable Software control LinkLed GPIO in case it is set
  3753. adapterData->LinkLedOnGpio = 11;
  3754. }
  3755. }else if (adapterData->LinkLedOnGpio <= 10){ // Software control LinkLed GPIO is enable
  3756. // If selected GPIO is GPIO0-GPIO7, make sure external PHY is not enable.
  3757. // GPIO0-GPIO7 pins are multiplexed with MII signals.
  3758. if (adapterData->LinkLedOnGpio < 8)
  3759. {
  3760. // Check PHY Strap
  3761. if((ret = smsc9500_read_reg(dev, HW_CFG, &DwTemp)) < 0){
  3762. SMSC_WARNING("Failed to read HW_CFG: %d", ret);
  3763. return ret;
  3764. }
  3765. if (DwTemp & HW_CFG_PSEL_) // External PHY is enable
  3766. {
  3767. SMSC_WARNING("External PHY Enable::GPIO%d can not be set as Link Up/Down Led\n", adapterData->LinkLedOnGpio);
  3768. // Disable Software control LinkLed GPIO
  3769. adapterData->LinkLedOnGpio = 11;
  3770. }
  3771. else
  3772. {
  3773. u32 dwGpioCfg;// = ~GPIO_CFG_GPO0_EN_ | GPIO_CFG_GPO0_DIR_;
  3774. if((ret = smsc9500_read_reg(dev, GPIO_CFG, &dwGpioCfg)) < 0){
  3775. SMSC_WARNING("Failed to read GPIO_CFG: %d", ret);
  3776. return ret;
  3777. }
  3778. dwGpioCfg &= ~(GPIO_CFG_GPO0_EN_ << adapterData->LinkLedOnGpio);
  3779. dwGpioCfg |= GPIO_CFG_GPO0_DIR_ << adapterData->LinkLedOnGpio;
  3780. // Check GPIO buffer type
  3781. if (!adapterData->LinkLedOnGpioBufType) // Push-Pull output
  3782. {
  3783. dwGpioCfg |= GPIO_CFG_GPO0_TYPE << adapterData->LinkLedOnGpio;
  3784. }
  3785. // Check GPIO Polarity
  3786. if (adapterData->LinkLedOnGpioPolarity) // Active low
  3787. {
  3788. dwGpioCfg |= GPIO_CFG_GPO0_DATA_ << adapterData->LinkLedOnGpio;
  3789. }
  3790. // Set GPIO Config register
  3791. if((ret = smsc9500_write_reg(dev, GPIO_CFG, dwGpioCfg)) < 0){
  3792. SMSC_WARNING("Failed to write GPIO_CFG: %d", ret);
  3793. return ret;
  3794. }
  3795. }
  3796. }
  3797. else
  3798. {
  3799. u32 dwLedGpioCfg = (LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_10_SH) |
  3800. (LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_09_SH) |
  3801. (LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_08_SH);
  3802. switch (adapterData->LinkLedOnGpio)
  3803. {
  3804. case 8:
  3805. // Enable GPIO 8
  3806. dwLedGpioCfg &= (~(LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_08_SH));
  3807. // Set Output Direction
  3808. dwLedGpioCfg |= LED_GPIO_CFG_GPDIR_08_;
  3809. // Set Buffer Type
  3810. if (!adapterData->LinkLedOnGpioBufType) // Push-Pull Output
  3811. {
  3812. dwLedGpioCfg |= LED_GPIO_CFG_GPBUF_08_;
  3813. }
  3814. // Check GPIO Polarity
  3815. if (adapterData->LinkLedOnGpioPolarity) // Active low
  3816. {
  3817. dwLedGpioCfg |= LED_GPIO_CFG_GPDATA_08_;
  3818. }
  3819. break;
  3820. case 9:
  3821. // Enable GPIO 9
  3822. dwLedGpioCfg &= (~(LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_09_SH));
  3823. // Set Output Direction
  3824. dwLedGpioCfg |= LED_GPIO_CFG_GPDIR_09_;
  3825. // Set Buffer Type
  3826. if (!adapterData->LinkLedOnGpioBufType) // Push-Pull Output
  3827. {
  3828. dwLedGpioCfg |= LED_GPIO_CFG_GPBUF_09_;
  3829. }
  3830. // Check GPIO Polarity
  3831. if (adapterData->LinkLedOnGpioPolarity) // Active low
  3832. {
  3833. dwLedGpioCfg |= LED_GPIO_CFG_GPDATA_09_;
  3834. }
  3835. break;
  3836. case 10:
  3837. // Enable GPIO 10
  3838. dwLedGpioCfg &= (~(LED_GPIO_CFG_GPCTL_LED_ << LED_GPIO_CFG_GPCTL_10_SH));
  3839. // Set Output Direction
  3840. dwLedGpioCfg |= LED_GPIO_CFG_GPDIR_10_;
  3841. // Set Buffer Type
  3842. if (!adapterData->LinkLedOnGpioBufType) // Push-Pull Output
  3843. {
  3844. dwLedGpioCfg |= LED_GPIO_CFG_GPBUF_10_;
  3845. }
  3846. // Check GPIO Polarity
  3847. if (adapterData->LinkLedOnGpioPolarity) // Active low
  3848. {
  3849. dwLedGpioCfg |= LED_GPIO_CFG_GPDATA_10_;
  3850. }
  3851. break;
  3852. }
  3853. // Set LED GPIO Config
  3854. if((ret = smsc9500_write_reg( dev, LED_GPIO_CFG, dwLedGpioCfg)) < 0){
  3855. SMSC_WARNING("Failed to write LED_GPIO_CFG: %d", ret);
  3856. return ret;
  3857. }
  3858. }
  3859. }
  3860. smsc9500_rx_setmulticastlist(dev);
  3861. adapterData->dwSavedLinkSettings = link_mode;
  3862. if (!Phy_Initialize(dev, phy_addr, link_mode))
  3863. return SMSC9500_FAIL;
  3864. SMSC_TRACE(DBG_INIT,"<--------out of smsc9500_reset, return 0\n");
  3865. return 0;
  3866. }
  3867. static int smsc9500_link_reset(struct usbnet *dev)
  3868. {
  3869. int ret = 0;
  3870. SMSC_TRACE(DBG_LINK,"---->in smsc9500_link_reset\n");
  3871. ret = Phy_CheckLink(dev);
  3872. if(dev->StopLinkPolling){
  3873. clear_bit (EVENT_DEV_RECOVERY, &dev->flags);
  3874. }
  3875. if (test_bit (EVENT_DEV_RECOVERY, &dev->flags)) {
  3876. ret = smsc9500_device_recovery(dev);
  3877. clear_bit (EVENT_DEV_RECOVERY, &dev->flags);
  3878. }
  3879. SMSC_TRACE(DBG_LINK,"<----out of smsc9500_link_reset\n");
  3880. return ret;
  3881. }
  3882. static int smsc9500_stopTxPath(struct usbnet * dev)
  3883. /*++
  3884. Routine Description:
  3885. This routine Stops the Tx Path at both Mac and USB
  3886. Arguments:
  3887. Return Value:
  3888. --*/
  3889. {
  3890. u32 Value32;
  3891. int ret = SMSC9500_FAIL;
  3892. int Count = 0;
  3893. SMSC_TRACE(DBG_TX,"--> smsc9500_stopTxPath\n");
  3894. // Stop the Transmit path at SCSRs
  3895. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, TX_CFG, TX_CFG_STOP_));
  3896. // The bit should self clear as soon as the packet makes it out of the Mac,
  3897. // worst case is 10 Mbps HD and frame deferred to the maximum. This will
  3898. // be ~100ms tops. Assuming one register read per (micro)frame the case of
  3899. // high speed USB - 125us register read cycle time - is the worse and
  3900. // would need up to 800 reads. Let's just round up to 1000.
  3901. do
  3902. {
  3903. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, TX_CFG, &Value32));
  3904. // Let it try to do the 1000 reads even if the reg reads are failing
  3905. // If the previous write did go thru at least this way we have a better
  3906. // chance of making sure the transmit path did stop.
  3907. }
  3908. while ( (++Count<1000) && ((Value32 & (TX_CFG_STOP_ | TX_CFG_ON_)) != 0) );
  3909. // Disable Mac TX
  3910. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MAC_CR, &Value32));
  3911. Value32 &= ~MAC_CR_TXEN_;
  3912. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MAC_CR, Value32 ));
  3913. SMSC_TRACE(DBG_TX,"<-- smsc9500_stopTxPath\n");
  3914. ret = SMSC9500_SUCCESS;
  3915. DONE:
  3916. return ret;
  3917. }
  3918. static int smsc9500_stopAndFlushTxPath(struct usbnet *dev)
  3919. /*++
  3920. Routine Description:
  3921. This routine Stops the Tx Path at both Mac and USB and then flushes
  3922. the Tx Fifo pointers.
  3923. Arguments:
  3924. Return Value:
  3925. --*/
  3926. {
  3927. u32 Value32;
  3928. int ret = SMSC9500_FAIL;
  3929. SMSC_TRACE(DBG_TX,"--> smsc9500_stopAndFlushTxPath\n");
  3930. if(smsc9500_stopTxPath(dev) < 0)return ret;
  3931. // Flush the transmit path
  3932. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, TX_CFG, TX_CFG_FIFO_FLUSH_));
  3933. // Should self clear way before the read.
  3934. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, TX_CFG, &Value32));
  3935. if (Value32 & TX_CFG_FIFO_FLUSH_)
  3936. {
  3937. // Flush did not self clear!
  3938. goto DONE;
  3939. }
  3940. SMSC_TRACE(DBG_TX,"<-- smsc9500_stopAndFlushTxPath\n");
  3941. ret = SMSC9500_SUCCESS;
  3942. DONE:
  3943. return ret;
  3944. }
  3945. static int smsc9500_stopRxPath(struct usbnet * dev)
  3946. /*++
  3947. Routine Description:
  3948. This routine Stops the Rx Path at both Mac and USB
  3949. Arguments:
  3950. Return Value:
  3951. --*/
  3952. {
  3953. u32 Value32;
  3954. int ret = SMSC9500_FAIL;
  3955. int Count = 0;
  3956. SMSC_TRACE(DBG_RX,"--> smsc9500_stopRxPath\n");
  3957. // Clr the Rx Stop bit if not already
  3958. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, INT_STS, INT_STS_RX_STOP_));
  3959. // Disable the receiver at the Mac
  3960. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MAC_CR, &Value32));
  3961. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MAC_CR, Value32 & (~MAC_CR_RXEN_)));
  3962. // The Rx Stop bit should assert as soon as the packet "in flight" makes
  3963. // it into the Mac, worst case is 10 Mbps HD. This will be ~2ms tops
  3964. // Assuming one register read per (micro)frame the case of high speed USB
  3965. // - 125us register read cycle time - is the worse and would need up to
  3966. // 16 reads. Let's just round up to 20.
  3967. do
  3968. {
  3969. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, INT_STS, &Value32));
  3970. // Let it try to do the 20 reads even if the reg reads are failing
  3971. // If the previous write did go thru at least this way we have a better
  3972. // chance of making sure the receiver did stop.
  3973. }
  3974. while ( (++Count<20) && ((Value32 & INT_STS_RX_STOP_) == 0) );
  3975. // Disable Mac RX
  3976. //CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MAC_CR, &Value32));
  3977. //Value32 &= ~MAC_CR_RXEN_;
  3978. //CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MAC_CR, Value32));
  3979. SMSC_TRACE(DBG_RX,"<-- smsc9500_stopRxPath\n");
  3980. ret = SMSC9500_SUCCESS;
  3981. DONE:
  3982. return ret;
  3983. }
  3984. static int smsc9500_stopAndFlushRxPath(struct usbnet *dev)
  3985. /*++
  3986. Routine Description:
  3987. This routine Stops the Rx Path at both Mac and USB and then flushes
  3988. the Rx Fifo pointers.
  3989. Arguments:
  3990. Return Value:
  3991. --*/
  3992. {
  3993. u32 Value32;
  3994. int ret = SMSC9500_FAIL;
  3995. SMSC_TRACE(DBG_RX,"--> smsc9500_stopAndFlushRxPath\n");
  3996. if(smsc9500_stopRxPath(dev) < 0)goto DONE;
  3997. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, RX_CFG, RX_FIFO_FLUSH_));
  3998. // Should self clear way before the read.
  3999. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, RX_CFG, &Value32));
  4000. if (Value32 & RX_FIFO_FLUSH_)
  4001. {
  4002. // Flush did not self clear!
  4003. goto DONE;
  4004. }
  4005. SMSC_TRACE(DBG_RX,"<-- smsc9500_stopAndFlushRxPath\n");
  4006. ret = SMSC9500_SUCCESS;
  4007. DONE:
  4008. return ret;
  4009. }
  4010. #ifdef PME_EEPROMLESS
  4011. static int EepromLessPMESetting(struct usbnet *dev)
  4012. {
  4013. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  4014. u32 dwReadBuf, dwAddrH, dwAddrL, dwWrite,dwRead;
  4015. int ret;
  4016. //API for customer to provide MAC address
  4017. /*
  4018. GetMacAddr(&dev->net->dev_addr);
  4019. dwAddrL = dev->net->dev_addr[0] | dev->net->dev_addr[1] << 8 | dev->net->dev_addr[2] << 16 | dev->net->dev_addr[3] << 24;
  4020. dwAddrH = dev->net->dev_addr[4] | dev->net->dev_addr[5] << 8;
  4021. if ((ret = smsc9500_write_reg(dev,ADDRL, dwAddrL)< 0)) {
  4022. SMSC_WARNING("Failed to write ADDRL: %d", ret);
  4023. return ret;
  4024. }
  4025. if ((ret = smsc9500_write_reg(dev,ADDRH, dwAddrH)< 0)) {
  4026. SMSC_WARNING("Failed to write ADDRH: %d", ret);
  4027. return ret;
  4028. }
  4029. */
  4030. if ((ret = smsc9500_read_reg(dev,FLAG_ATTR, &dwRead)< 0)) {
  4031. SMSC_WARNING("Failed to read FLAG_ATTR: %d", ret);
  4032. return ret;
  4033. }
  4034. //define your PME configuration here by setting theses values:
  4035. //FLAG_ATTR_PME_ENABLE The device supports GPIO PME signaling.
  4036. //FLAG_ATTR_PME_CFG_PULSE GPIO PME is signaled via a pulse,otherwise it's signal via a level
  4037. // FLAG_ATTR_PME_LEN_150MS GPIO PME pulse length is 150 mS, otherwisw it's 1.5mS
  4038. //FLAG_ATTR_PME_POL GPIO PME signaling polarity is high
  4039. //FLAG_ATTR_PME_BUFF_TYPE Push-Pull driver, otherwise Open drain driver
  4040. //FLAG_ATTR_PME_WAKE_PHY PHY linkup wakeup supported, otherwise Magic packet wakeup supported
  4041. //FLAG_ATTR_PME_GPIO10_HIGH Active-high detection for GPIO10
  4042. dwRead |= FLAG_ATTR_PME_ENABLE | FLAG_ATTR_PME_POL;
  4043. if ((ret = smsc9500_write_reg(dev,FLAG_ATTR, dwRead)< 0)) {
  4044. SMSC_WARNING("Failed to write FLAG_ATTR: %d", ret);
  4045. return ret;
  4046. }
  4047. if ((ret = smsc9500_read_reg(dev,HW_CFG, &dwRead)< 0)) {
  4048. SMSC_WARNING("Failed to read HW_CFG: %d", ret);
  4049. return ret;
  4050. }
  4051. dwRead |= HW_CFG_EEM|HW_CFG_RST_PROTECT;
  4052. if ((ret = smsc9500_write_reg(dev,HW_CFG, dwRead)< 0)) {
  4053. SMSC_WARNING("Failed to write HW_CFG: %d", ret);
  4054. return ret;
  4055. }
  4056. return ret;
  4057. }
  4058. #endif
  4059. static u16 CalculateCrc16(const BYTE * bpData,const u32 dwLen, const BOOLEAN fBitReverse)
  4060. {
  4061. const u16 wCrc16Poly = 0x8005U; // s/b international standard for CRC-16
  4062. // x^16 + x^15 + x^2 + 1
  4063. //u16 wCrc16Poly = 0xA001; // reverse
  4064. u16 i, j, bit;
  4065. u16 wCrc = 0xFFFFU;
  4066. u16 wMsb;
  4067. BYTE bCurrentByte;
  4068. u16 wNumOfBits = 16U;
  4069. u16 wCrcOut=0;
  4070. wNumOfBits = wNumOfBits; // to avoid lint warning
  4071. for (i=0; i<(u16)dwLen; i++)
  4072. {
  4073. bCurrentByte = *bpData++;
  4074. for (bit=(u16)0U; bit<(u16)8U; bit++)
  4075. {
  4076. wMsb = wCrc >> 15;
  4077. wCrc <<= 1;
  4078. if (wMsb ^ (u16)(bCurrentByte & 1))
  4079. {
  4080. wCrc ^= wCrc16Poly;
  4081. wCrc |= (u16)0x0001U;
  4082. }
  4083. bCurrentByte >>= 1;
  4084. }
  4085. }
  4086. //bit reverse if needed
  4087. // so far we do not need this for 117
  4088. // but the standard CRC-16 seems to require this.
  4089. if (fBitReverse)
  4090. {
  4091. j = 1;
  4092. for (i=(u16)(1<<(wNumOfBits-(u16)1U)); i; i = i>>1) {
  4093. if (wCrc & i)
  4094. {
  4095. wCrcOut |= j;
  4096. }
  4097. j <<= 1;
  4098. }
  4099. wCrc = wCrcOut;
  4100. }
  4101. return wCrc;
  4102. }
  4103. /*++
  4104. Routine Description:
  4105. This routine set/reset General Purpose Output.
  4106. Arguments:
  4107. Adapter - pointer to our Adapter
  4108. Gpo - Gpo [0:10]
  4109. State - 1 = ON or 0 = OFF
  4110. Return Value:
  4111. --*/
  4112. static int SetGpo(struct usbnet * dev, u32 Gpo, u32 State)
  4113. {
  4114. int ret = SMSC9500_FAIL;
  4115. u32 Value32, Status;
  4116. if ((Gpo > 10) || (State > 1))
  4117. {
  4118. if (State > 1)
  4119. {
  4120. SMSC_WARNING("Gpo%d state (%d) is out of range [0:1] in NICSetGpo\n", Gpo, State);
  4121. }
  4122. goto Exit_NICSetGpo;
  4123. }
  4124. if (Gpo < 8)
  4125. {
  4126. if(smsc9500_read_reg( dev, GPIO_CFG, &Value32 ) < 0){
  4127. SMSC_WARNING("Failed to read GPIO_CFG\n");
  4128. goto Exit_NICSetGpo;
  4129. }
  4130. Value32 &= (~(GPIO_CFG_GPO0_DATA_ << Gpo));
  4131. Value32 |= (State << Gpo);
  4132. Status = smsc9500_write_reg(dev, GPIO_CFG, Value32);
  4133. if (Status < 0)
  4134. goto Exit_NICSetGpo;
  4135. }
  4136. else
  4137. {
  4138. Status = smsc9500_read_reg(dev, LED_GPIO_CFG, &Value32 );
  4139. if (Status < 0)
  4140. goto Exit_NICSetGpo;
  4141. Value32 &= (~(LED_GPIO_CFG_GPDATA_08_ << (Gpo-8)));
  4142. Value32 |= (State << (Gpo-8));
  4143. Status = smsc9500_write_reg(dev, LED_GPIO_CFG, Value32 );
  4144. if (Status < 0)
  4145. goto Exit_NICSetGpo;
  4146. }
  4147. ret = SMSC9500_SUCCESS;
  4148. Exit_NICSetGpo:
  4149. return ret;
  4150. }
  4151. /*++
  4152. Routine Description:
  4153. This routine set device at suspend3 state
  4154. Arguments:
  4155. netdev - pointer to our device
  4156. Return Value:
  4157. --*/
  4158. static int SetWakeupOnSuspend3(struct net_device *netdev)
  4159. {
  4160. struct usbnet * dev=netdev_priv(netdev);
  4161. int ret = SMSC9500_FAIL;
  4162. u32 Value32;
  4163. BUG_ON(!dev);
  4164. SMSC_TRACE(DBG_PWR,"Setting Suspend3 mode\n");
  4165. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, RX_FIFO_INF, &Value32));
  4166. if((Value32 & 0xFFFF) != 0){
  4167. SMSC_TRACE(DBG_PWR,"Rx FIFO is not empty\n");
  4168. Value32 = RX_FIFO_FLUSH_;
  4169. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, RX_CFG, Value32));
  4170. }else{
  4171. SMSC_TRACE(DBG_PWR,"Rx FIFO is empty, continue suspend\n");
  4172. }
  4173. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &Value32));
  4174. Value32 &= (~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_));
  4175. Value32 |= PM_CTL_SUS_MODE_3 | PM_CTL_RES_CLR_WKP_STS;
  4176. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32));
  4177. Value32 &= ~PM_CTL_WUPS_;
  4178. Value32 |= PM_CTL_WUPS_WOL_; //Clear wol status
  4179. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32));
  4180. CHECK_RETURN_STATUS(smsc9500_set_feature(dev,USB_DEVICE_REMOTE_WAKEUP));
  4181. ret = SMSC9500_SUCCESS;
  4182. DONE:
  4183. return ret;
  4184. }
  4185. static int SetWakeupEvents(struct net_device *netdev)
  4186. {
  4187. WAKEUP_FILTER sFilter;
  4188. u32 dwValue,dwTemp,Value32;
  4189. u16 wValue;
  4190. int i=0, ret = SMSC9500_FAIL;
  4191. int filterMaskCnt=0, filterCmdCnt=0, filterOffsetCnt=0, filterCrcCnt=0;
  4192. struct usbnet * dev=netdev_priv(netdev);
  4193. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  4194. u32 opts = adapterData->WolWakeupOpts;
  4195. BYTE bBcast[BCAST_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  4196. BYTE bMcast[MCAST_LEN] = {0x01, 0x00, 0x5E};
  4197. BYTE bArp[ARP_LEN] = {0x08, 0x06};
  4198. BUG_ON(!netdev);
  4199. SMSC_TRACE(DBG_PWR,"In SetWakeupEvents. \n");
  4200. if(opts & (WAKE_PHY | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_MAGIC))
  4201. {
  4202. if(opts & WAKE_PHY) {
  4203. // Clear any pending Phy interrupt and enable the mask for it
  4204. adapterData->systemSuspendPHYEvent = PHY_INT_MASK_LINK_DOWN_;
  4205. if(adapterData->dwLinkSettings&LINK_AUTO_NEGOTIATE)
  4206. adapterData->systemSuspendPHYEvent |= PHY_INT_MASK_ANEG_COMP_;
  4207. EnablePHYWakeupInterrupt(dev, adapterData->systemSuspendPHYEvent);
  4208. // If there's currently no link we can use Suspend1
  4209. /* read PHY_BSR twice: link status bit is LL */
  4210. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_BSR, &Value32));
  4211. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_BSR, &Value32));
  4212. wValue=(u16)Value32;
  4213. if (!(wValue & PHY_BSR_LINK_STATUS_))
  4214. {
  4215. SMSC_TRACE(DBG_PWR,"Setting PHY in PD/ED Mode.\n");
  4216. /* If we are in force mode, set the NWAY */
  4217. if((adapterData->dwSavedLinkSettings&LINK_AUTO_NEGOTIATE) == 0)
  4218. {
  4219. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_BCR, &Value32));
  4220. Value32 |= PHY_BCR_AUTO_NEG_ENABLE_;
  4221. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_BCR,Value32));
  4222. }
  4223. //Enable the energy detect power-down mode
  4224. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_MODE_CTRL_STS,&dwValue));
  4225. wValue=(u16)dwValue;
  4226. wValue |= MODE_CTRL_STS_EDPWRDOWN_;
  4227. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_MODE_CTRL_STS, wValue));
  4228. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_SRC,&dwTemp)); //Read to clear
  4229. //Enable ENERGYON interrupt source
  4230. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_MASK,&dwValue));
  4231. wValue=(u16)dwValue;
  4232. wValue |= PHY_INT_MASK_ENERGY_ON_;
  4233. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_INT_MASK,wValue));
  4234. // Put Lan9500 in Suspend1
  4235. SMSC_TRACE(DBG_PWR,"Setting Suspend1 mode\n");
  4236. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &Value32));
  4237. Value32 &= (~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_));
  4238. Value32 |= PM_CTL_SUS_MODE_1;
  4239. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32));
  4240. Value32 &= ~PM_CTL_WUPS_;
  4241. Value32 |= (PM_CTL_WUPS_ED_ | PM_CTL_ED_EN_); //Clear wol status, enable energy detection
  4242. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32));
  4243. CHECK_RETURN_STATUS(smsc9500_set_feature(dev,USB_DEVICE_REMOTE_WAKEUP));
  4244. }
  4245. else
  4246. {
  4247. // Put Lan9500 in Suspend0
  4248. SMSC_TRACE(DBG_PWR,"Setting Suspend0 mode\n");
  4249. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &Value32));
  4250. Value32 &= (~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_));
  4251. Value32 |=PM_CTL_SUS_MODE_0;
  4252. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32));
  4253. Value32 &= ~PM_CTL_WUPS_;
  4254. Value32 |= PM_CTL_WUPS_ED_; //Clear wol status
  4255. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32));
  4256. CHECK_RETURN_STATUS(smsc9500_set_feature(dev,USB_DEVICE_REMOTE_WAKEUP));
  4257. }
  4258. }
  4259. else
  4260. {
  4261. // Clear any pending Phy interrupt and disable the mask for it
  4262. Value32 = PHY_INT_MASK_LINK_DOWN_;
  4263. if(adapterData->dwLinkSettings&LINK_AUTO_NEGOTIATE)
  4264. Value32 |= PHY_INT_MASK_ANEG_COMP_;
  4265. DisablePHYWakeupInterrupt(dev, Value32);
  4266. }
  4267. if(opts & (WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_UCAST|WAKE_MAGIC))
  4268. {
  4269. if(opts & (WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_UCAST)){
  4270. int filter = 0;
  4271. memset(&sFilter,0,sizeof(sFilter));
  4272. if(opts & WAKE_BCAST) {
  4273. SMSC_TRACE(DBG_PWR,"Set broadicast detection\n");
  4274. sFilter.dwFilterMask[filter * 4] = 0x003F;
  4275. sFilter.dwFilterMask[filter * 4 + 1] = 0x00;
  4276. sFilter.dwFilterMask[filter * 4 + 2] = 0x00;
  4277. sFilter.dwFilterMask[filter * 4 + 3] = 0x00;
  4278. sFilter.dwCommad[filter/4] |= 0x05UL << ((filter % 4) * 8); //set command
  4279. sFilter.dwOffset[filter/4] |= 0x00 << ((filter % 4) * 8);
  4280. sFilter.dwCRC[filter/2] |= CalculateCrc16(bBcast, BCAST_LEN, FALSE) << ((filter % 2) * 16);
  4281. filter++;
  4282. }
  4283. if(opts & WAKE_MCAST) {
  4284. SMSC_TRACE(DBG_PWR,"Set multicast detection\n");
  4285. sFilter.dwFilterMask[filter * 4] = 0x0007;
  4286. sFilter.dwFilterMask[filter * 4 + 1] = 0x00;
  4287. sFilter.dwFilterMask[filter * 4 + 2] = 0x00;
  4288. sFilter.dwFilterMask[filter * 4 + 3] = 0x00;
  4289. sFilter.dwCommad[filter/4] |= 0x09UL << ((filter % 4) * 8); //set command
  4290. sFilter.dwOffset[filter/4] |= 0x00 << ((filter % 4) * 8);
  4291. sFilter.dwCRC[filter/2] |= (CalculateCrc16(bMcast, MCAST_LEN, FALSE) << ((filter % 2) * 16));
  4292. filter++;
  4293. }
  4294. if(opts & WAKE_ARP) {
  4295. SMSC_TRACE(DBG_PWR,"Set ARP detection\n");
  4296. sFilter.dwFilterMask[filter * 4] = 0x0003; //Check two bytes for ARP
  4297. sFilter.dwFilterMask[filter * 4 + 1] = 0x00;
  4298. sFilter.dwFilterMask[filter * 4 + 2] = 0x00;
  4299. sFilter.dwFilterMask[filter * 4 + 3] = 0x00;
  4300. sFilter.dwCommad[filter/4] |= 0x05UL << ((filter % 4) * 8); //set command
  4301. sFilter.dwOffset[filter/4] |= 0x0C << ((filter % 4) * 8);
  4302. sFilter.dwCRC[filter/2]= CalculateCrc16(bArp, ARP_LEN, FALSE) << ((filter % 2) * 16); //This is ARP type
  4303. filter++;
  4304. }
  4305. if(opts & WAKE_UCAST){
  4306. SMSC_TRACE(DBG_PWR,"Set UCAST detection\n");
  4307. sFilter.dwFilterMask[filter * 4] = 0x003F; //Check nothing
  4308. sFilter.dwFilterMask[filter * 4 + 1] = 0x00;
  4309. sFilter.dwFilterMask[filter * 4 + 2] = 0x00;
  4310. sFilter.dwFilterMask[filter * 4 + 3] = 0x00;
  4311. sFilter.dwCommad[filter/4] |= 0x01UL << ((filter % 4) * 8); //set command
  4312. sFilter.dwOffset[filter/4] |= 0x00 << ((filter % 4) * 8);
  4313. sFilter.dwCRC[filter/2] |= CalculateCrc16(&netdev->dev_addr[0], 6, FALSE) << ((filter % 2) * 16);
  4314. filter++;
  4315. }
  4316. if(!dev->chipDependFeatures[FEATURE_WUFF_8]){
  4317. filterMaskCnt = LAN9500_WUFF_NUM * 4;
  4318. filterCmdCnt = LAN9500_WUFF_NUM / 4;
  4319. filterOffsetCnt = LAN9500_WUFF_NUM / 4;
  4320. filterCrcCnt = LAN9500_WUFF_NUM / 2;
  4321. }else{
  4322. filterMaskCnt = LAN9500A_WUFF_NUM * 4;
  4323. filterCmdCnt = LAN9500A_WUFF_NUM / 4;
  4324. filterOffsetCnt = LAN9500A_WUFF_NUM / 4;
  4325. filterCrcCnt = LAN9500A_WUFF_NUM / 2;
  4326. }
  4327. for(i=0; i<filterMaskCnt; i++){
  4328. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,WUFF, sFilter.dwFilterMask[i]));
  4329. }
  4330. for(i=0; i<filterCmdCnt; i++){
  4331. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,WUFF, sFilter.dwCommad[i]));
  4332. }
  4333. for(i=0; i<filterOffsetCnt; i++){
  4334. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,WUFF, sFilter.dwOffset[i]));
  4335. }
  4336. for(i=0; i<filterCrcCnt; i++){
  4337. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,WUFF, sFilter.dwCRC[i]));
  4338. }
  4339. // Clear any pending pattern match packet status
  4340. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, WUCSR, &Value32));
  4341. Value32 |= WUCSR_WUFR_;
  4342. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, WUCSR, Value32));
  4343. // Enable pattern match packet wake
  4344. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, WUCSR, &Value32));
  4345. Value32 |= WUCSR_WAKE_EN_;
  4346. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, WUCSR, Value32));
  4347. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &Value32));
  4348. Value32 |= PM_CTL_WOL_EN_;
  4349. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32));
  4350. }
  4351. else
  4352. {
  4353. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, WUCSR, &Value32));
  4354. Value32 &= (~WUCSR_WAKE_EN_);
  4355. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, WUCSR, Value32));
  4356. }
  4357. if (opts & WAKE_MAGIC)
  4358. {
  4359. SMSC_TRACE(DBG_PWR,"Setting magic packet detection\n");
  4360. // Clear any pending magic packet status
  4361. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, WUCSR, &Value32));
  4362. Value32 |= WUCSR_MPR_;
  4363. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, WUCSR, Value32));
  4364. // Enable MP wake
  4365. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, WUCSR, &Value32));
  4366. Value32 |= WUCSR_MPEN_;
  4367. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, WUCSR, Value32));
  4368. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &Value32));
  4369. Value32 |= PM_CTL_WOL_EN_;
  4370. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32 ));
  4371. }
  4372. else
  4373. {
  4374. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, WUCSR, &Value32));
  4375. Value32 &= (~WUCSR_MPEN_);
  4376. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, WUCSR, Value32));
  4377. }
  4378. //enable recevier
  4379. CHECK_RETURN_STATUS(smsc9500_read_reg(dev,MAC_CR,&dwValue));
  4380. dwValue |= MAC_CR_RXEN_;
  4381. if(opts & WAKE_MCAST) {
  4382. dwValue |= MAC_CR_MCPAS_;
  4383. }
  4384. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,MAC_CR, dwValue));
  4385. SMSC_TRACE(DBG_PWR,"Setting Suspend0 mode\n");
  4386. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &Value32));
  4387. Value32 &= (~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_));
  4388. Value32 |= PM_CTL_SUS_MODE_0;
  4389. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32));
  4390. Value32 &= ~PM_CTL_WUPS_;
  4391. Value32 |= PM_CTL_WUPS_WOL_; //Clear wol status, should not change suspned_mode while clearing WUPS_sts[1]
  4392. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32));
  4393. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &Value32));
  4394. CHECK_RETURN_STATUS(smsc9500_set_feature(dev,USB_DEVICE_REMOTE_WAKEUP));
  4395. }
  4396. }else {
  4397. SMSC_TRACE(DBG_PWR,"Disabling Wake events in ESS Regs. ");
  4398. // Disable Energy detect (Link up) & Wake up events to do USB wake
  4399. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, WUCSR, &Value32));
  4400. Value32 |=~(WUCSR_MPEN_ | WUCSR_WAKE_EN_ );
  4401. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, WUCSR, Value32));
  4402. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &Value32));
  4403. Value32 &= ~(PM_CTL_ED_EN_ | PM_CTL_WOL_EN_);
  4404. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32));
  4405. // Put Lan9500 in Suspend2
  4406. SMSC_TRACE(DBG_PWR,"Setting Suspend2 mode\n");
  4407. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &Value32));
  4408. Value32 &= (~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_));
  4409. Value32 |= PM_CTL_SUS_MODE_2;
  4410. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, Value32));
  4411. }
  4412. ret = 0;
  4413. DONE:
  4414. return ret;
  4415. }
  4416. static int ResetWakeupEvents(struct net_device *netdev)
  4417. {
  4418. u32 dwValue;
  4419. u16 wValue;
  4420. int ret = SMSC9500_FAIL;
  4421. struct usbnet * dev=netdev_priv(netdev);
  4422. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  4423. BUG_ON(!adapterData);
  4424. SMSC_TRACE(DBG_PWR,"In ResetWakeupEvents. \n");
  4425. if(!(adapterData->WolWakeupOpts & (WAKE_PHY | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_MAGIC)))
  4426. return ret;
  4427. smsc9500_clear_feature(dev,USB_DEVICE_REMOTE_WAKEUP);
  4428. if(adapterData->WolWakeupOpts & WAKE_PHY) {
  4429. //Disable the energy detect power-down mode
  4430. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_MODE_CTRL_STS,&dwValue));
  4431. wValue=(u16)dwValue;
  4432. wValue &= ~MODE_CTRL_STS_EDPWRDOWN_;
  4433. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_MODE_CTRL_STS,wValue));
  4434. //Disable energy-detect wake-up
  4435. CHECK_RETURN_STATUS(smsc9500_read_reg(dev,PM_CTRL,&dwValue));
  4436. dwValue &= ~PM_CTL_PHY_RST_;
  4437. dwValue |= PM_CTL_WUPS_; //Clear wake-up status
  4438. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,PM_CTRL, dwValue));
  4439. DisablePHYWakeupInterrupt(dev, adapterData->systemSuspendPHYEvent);
  4440. smsc9500_eth_phy_boost(dev, 1);
  4441. }else{
  4442. if(adapterData->WolWakeupOpts & (WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_UCAST)){
  4443. CHECK_RETURN_STATUS(smsc9500_read_reg(dev,WUCSR,&dwValue));
  4444. dwValue &= ~WUCSR_WAKE_EN_; //Disable Wake-up frame detection
  4445. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,WUCSR, dwValue));
  4446. }
  4447. if(adapterData->WolWakeupOpts & WAKE_MAGIC){//Set Magic packet detection
  4448. CHECK_RETURN_STATUS(smsc9500_read_reg(dev,WUCSR,&dwValue));
  4449. dwValue &= ~WUCSR_MPEN_; //Disable magic frame detection
  4450. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,WUCSR, dwValue));
  4451. }
  4452. //Disable wake-up frame interrupt
  4453. CHECK_RETURN_STATUS(smsc9500_read_reg(dev,PM_CTRL,&dwValue));
  4454. dwValue &= ~PM_CTL_WOL_EN_;
  4455. dwValue |= PM_CTL_WUPS_; //Clear wake-up status
  4456. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,PM_CTRL, dwValue));
  4457. }
  4458. ret = 0;
  4459. DONE:
  4460. return ret;
  4461. }
  4462. static int SetLinkDownWakeupEvents(struct usbnet *dev, int wakeUpMode)
  4463. {
  4464. u32 dwValue;
  4465. u16 wValue;
  4466. int ret = SMSC9500_FAIL;
  4467. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  4468. BUG_ON(!dev);
  4469. SMSC_TRACE(DBG_PWR,"In SetLinkDownWakeupEvents. \n");
  4470. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &dwValue));
  4471. dwValue |= PM_CTL_ED_EN_;
  4472. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, dwValue));
  4473. SMSC_TRACE(DBG_PWR,"Setting PHY in PD/ED Mode\n");
  4474. if(wakeUpMode == WAKEPHY_ENERGY){
  4475. /* If we are in force mode, set the NWAY */
  4476. if((adapterData->dwSavedLinkSettings&LINK_AUTO_NEGOTIATE) == 0)
  4477. {
  4478. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_BCR, &dwValue));
  4479. dwValue |= PHY_BCR_AUTO_NEG_ENABLE_;
  4480. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_BCR,dwValue));
  4481. }
  4482. //Enable the energy detect power-down mode
  4483. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_MODE_CTRL_STS,&dwValue));
  4484. wValue=(u16)dwValue;
  4485. wValue |= MODE_CTRL_STS_EDPWRDOWN_;
  4486. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_MODE_CTRL_STS, wValue));
  4487. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_SRC,&dwValue)); //Read to clear
  4488. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_SRC,&dwValue)); //Read two times
  4489. //Enable interrupt source
  4490. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_MASK,&dwValue));
  4491. wValue |= (PHY_INT_MASK_ENERGY_ON_ | PHY_INT_MASK_ANEG_COMP_);
  4492. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_INT_MASK,wValue));
  4493. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &dwValue));
  4494. dwValue &= (~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_));
  4495. dwValue |= PM_CTL_SUS_MODE_1;
  4496. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, dwValue));
  4497. CHECK_RETURN_STATUS(smsc9500_set_feature(dev,USB_DEVICE_REMOTE_WAKEUP));
  4498. SMSC_TRACE(DBG_PWR,"Setting Suspend1 mode\n");
  4499. }else if (wakeUpMode == WAKEPHY_NEGO_COMPLETE){
  4500. //Disable the energy detect power-down mode
  4501. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_MODE_CTRL_STS,&dwValue));
  4502. dwValue &= ~MODE_CTRL_STS_EDPWRDOWN_;
  4503. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_MODE_CTRL_STS, dwValue));
  4504. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_SRC,&dwValue)); //Read to clear
  4505. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_SRC,&dwValue)); //Read two times
  4506. //Enable interrupt source
  4507. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_MASK,&dwValue));
  4508. dwValue |= PHY_INT_MASK_ANEG_COMP_;
  4509. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_INT_MASK,dwValue));
  4510. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &dwValue));
  4511. dwValue &= (~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_));
  4512. dwValue |= PM_CTL_SUS_MODE_0;
  4513. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, dwValue));
  4514. CHECK_RETURN_STATUS(smsc9500_set_feature(dev,USB_DEVICE_REMOTE_WAKEUP));
  4515. SMSC_TRACE(DBG_PWR,"Setting Suspend0 mode\n");
  4516. }
  4517. ret = 0;
  4518. DONE:
  4519. return ret;
  4520. }
  4521. static int ResetLinkDownWakeupEvents(struct usbnet *dev)
  4522. {
  4523. u32 dwValue;
  4524. u16 wValue;
  4525. int ret = SMSC9500_FAIL;
  4526. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  4527. SMSC_TRACE(DBG_PWR,"In ResetLinkDownWakeupEvents. \n");
  4528. smsc9500_clear_feature(dev,USB_DEVICE_REMOTE_WAKEUP);
  4529. //Disable the energy detect power-down mode
  4530. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_MODE_CTRL_STS,&dwValue));
  4531. wValue=(u16)dwValue;
  4532. wValue &= ~MODE_CTRL_STS_EDPWRDOWN_;
  4533. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_MODE_CTRL_STS,wValue));
  4534. //Disable ENERGYON interrupt source
  4535. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_MASK,&dwValue));
  4536. wValue=(u16)dwValue;
  4537. wValue &= ~PHY_INT_MASK_ENERGY_ON_;
  4538. if(dev->linkDownSuspend == WAKEPHY_ENERGY){
  4539. wValue &= ~(PHY_INT_MASK_ENERGY_ON_ | PHY_INT_MASK_ANEG_COMP_);
  4540. }else if (dev->linkDownSuspend == WAKEPHY_NEGO_COMPLETE){
  4541. wValue &= ~PHY_INT_MASK_ANEG_COMP_;
  4542. }
  4543. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_INT_MASK, wValue));
  4544. //Disable energy-detect wake-up
  4545. CHECK_RETURN_STATUS(smsc9500_read_reg(dev,PM_CTRL,&dwValue));
  4546. dwValue &= ~PM_CTL_ED_EN_;
  4547. CHECK_RETURN_STATUS(smsc9500_write_reg(dev,PM_CTRL, dwValue));
  4548. smsc9500_eth_phy_boost(dev, 1);
  4549. /* If we are in force mode, re-set the NWAY */
  4550. if((adapterData->dwSavedLinkSettings&LINK_AUTO_NEGOTIATE) == 0)
  4551. {
  4552. phy_SetLink(dev,adapterData->dwSavedLinkSettings);
  4553. }
  4554. ret = 0;
  4555. DONE:
  4556. return ret;
  4557. }
  4558. /*++
  4559. Routine Description:
  4560. This routine enables PHY interrupt
  4561. Arguments:
  4562. interrupt: Bit mask for PHY interrupt
  4563. Return Value:
  4564. --*/
  4565. static int EnablePHYWakeupInterrupt(struct usbnet *dev, u32 interrupt)
  4566. {
  4567. u32 dwValue;
  4568. int ret = SMSC9500_FAIL;
  4569. BUG_ON(!dev);
  4570. SMSC_TRACE(DBG_PWR,"In EnablePHYWakeupInterrupt. \n");
  4571. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_SRC,&dwValue)); //Read to clear
  4572. //Enable interrupt source
  4573. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_MASK,&dwValue));
  4574. dwValue |= interrupt;
  4575. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_INT_MASK,dwValue));
  4576. if(dwValue){
  4577. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &dwValue));
  4578. dwValue &= ~PM_CTL_PHY_RST_;
  4579. dwValue |= PM_CTL_ED_EN_;
  4580. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, dwValue));
  4581. }
  4582. ret = SMSC9500_SUCCESS;
  4583. DONE:
  4584. return ret;
  4585. }
  4586. /*++
  4587. Routine Description:
  4588. This routine Disables linkdown interrupt in the PHY
  4589. Arguments:
  4590. Return Value:
  4591. --*/
  4592. static int DisablePHYWakeupInterrupt(struct usbnet *dev, u32 interrupt)
  4593. {
  4594. u32 dwValue;
  4595. int ret = SMSC9500_FAIL;
  4596. BUG_ON(!dev);
  4597. SMSC_TRACE(DBG_PWR,"In DisablePHYWakeupInterrupt. \n");
  4598. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_SRC,&dwValue)); //Read to clear
  4599. //Disable interrupt source
  4600. CHECK_RETURN_STATUS(smsc9500_read_phy(dev,PHY_INT_MASK,&dwValue));
  4601. dwValue &= PHY_INT_MASK_ALL;
  4602. dwValue &= ~interrupt;
  4603. CHECK_RETURN_STATUS(smsc9500_write_phy(dev,PHY_INT_MASK,dwValue));
  4604. if(dwValue == 0){ //All interrupt sources are disabled
  4605. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, PM_CTRL, &dwValue));
  4606. dwValue &= ~(PM_CTL_PHY_RST_ | PM_CTL_ED_EN_);
  4607. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, PM_CTRL, dwValue));
  4608. }
  4609. ret = SMSC9500_SUCCESS;
  4610. DONE:
  4611. return ret;
  4612. }
  4613. /*++
  4614. Routine Description:
  4615. This routine Starts the Tx path at the MAC and sets the flag to accept
  4616. bulk out requests
  4617. --*/
  4618. static int StartTxPath(struct usbnet * dev )
  4619. {
  4620. u32 Value32;
  4621. int ret = SMSC9500_FAIL;
  4622. // Enable Tx at MAC
  4623. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MAC_CR, &Value32));
  4624. Value32 |= MAC_CR_TXEN_;
  4625. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MAC_CR, Value32));
  4626. // Enable Tx at SCSRs
  4627. Value32 = TX_CFG_ON_;
  4628. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, TX_CFG, Value32));
  4629. ret = 0;
  4630. DONE:
  4631. return ret;
  4632. }
  4633. /*++
  4634. Routine Description:
  4635. Starts the Receive path.
  4636. Note that if we are operating in USB bandwidth friendly mode we defer
  4637. starting the bulk in requests for now (will start when operational mode pipe signals
  4638. receive data available).
  4639. --*/
  4640. static int StartRxPath(struct usbnet *dev )
  4641. {
  4642. u32 Value32;
  4643. int ret = SMSC9500_FAIL;
  4644. CHECK_RETURN_STATUS(smsc9500_read_reg(dev, MAC_CR, &Value32));
  4645. Value32 |= MAC_CR_RXEN_;
  4646. CHECK_RETURN_STATUS(smsc9500_write_reg(dev, MAC_CR, Value32));
  4647. ret = 0;
  4648. DONE:
  4649. return ret;
  4650. }
  4651. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11))
  4652. static int Smsc9500_suspend (struct usb_interface *intf, u32 state)
  4653. #else
  4654. static int Smsc9500_suspend (struct usb_interface *intf, pm_message_t state)
  4655. #endif
  4656. {
  4657. struct usbnet *dev = usb_get_intfdata(intf);
  4658. int ret = SMSC9500_SUCCESS;
  4659. u32 dwValue;
  4660. SMSC_TRACE(DBG_PWR,"---->Smsc9500_suspend\n");
  4661. BUG_ON(!dev);
  4662. BUG_ON(!dev->udev);
  4663. smsc9500_read_reg(dev,WUCSR,&dwValue);
  4664. #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
  4665. #ifdef CONFIG_PM
  4666. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33))
  4667. if(dev->udev->auto_pm) //Internal pm event, autosuspend
  4668. #else
  4669. if (state.event & PM_EVENT_AUTO)
  4670. #endif
  4671. #else
  4672. if(0)
  4673. #endif //CONFIG_PM
  4674. #else
  4675. if(0)
  4676. #endif
  4677. {
  4678. ret = Smsc9500AutoSuspend(intf, state);
  4679. }else
  4680. {//It is system suspend
  4681. ret = Smsc9500SystemSuspend(intf, state);
  4682. }
  4683. SMSC_TRACE(DBG_PWR,"<----Smsc9500_suspend\n");
  4684. return ret;
  4685. }
  4686. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11))
  4687. static int Smsc9500AutoSuspend (struct usb_interface *intf, u32 state)
  4688. #else
  4689. static int Smsc9500AutoSuspend (struct usb_interface *intf, pm_message_t state)
  4690. #endif
  4691. {
  4692. struct usbnet *dev = usb_get_intfdata(intf);
  4693. u32 Value32;
  4694. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  4695. int suspendFlag = dev->suspendFlag;
  4696. int ret = SMSC9500_SUCCESS;
  4697. SMSC_TRACE(DBG_PWR,"---->Smsc9500AutoSuspend, suspendFlag = 0x%x\n", suspendFlag);
  4698. dev->suspendFlag = 0;
  4699. if (netif_running (dev->net))
  4700. {
  4701. adapterData->wakeupOptsBackup = adapterData->WolWakeupOpts;
  4702. /* read PHY_BSR twice: link status bit is LL */
  4703. smsc9500_read_phy(dev, PHY_BSR, &Value32);
  4704. if(smsc9500_read_phy(dev, PHY_BSR, &Value32) < 0){
  4705. return SMSC9500_FAIL;
  4706. }
  4707. if (!(Value32 & PHY_BSR_LINK_STATUS_))//last minute link check
  4708. {//Link is down
  4709. if(dev->netDetach){//Highest priority
  4710. if(!dev->pmLock){//Resume immediately, then detach device from USB bus.
  4711. smscusbnet_defer_myevent(dev, EVENT_IDLE_RESUME);
  4712. }
  4713. ret = SMSC9500_FAIL;
  4714. goto _SUSPEND_EXIT;
  4715. }else if(dev->linkDownSuspend || (suspendFlag & AUTOSUSPEND_LINKDOWN)){//Always check it to save more power
  4716. dev->suspendFlag |= AUTOSUSPEND_LINKDOWN;
  4717. ret = SetLinkDownWakeupEvents(dev, dev->linkDownSuspend);
  4718. }else if(suspendFlag & AUTOSUSPEND_DYNAMIC){//suspend on s0, work for lan9500 and lan9500a
  4719. dev->suspendFlag |= AUTOSUSPEND_DYNAMIC;
  4720. adapterData->WolWakeupOpts = (WAKE_UCAST | WAKE_BCAST | WAKE_MCAST | WAKE_ARP);
  4721. ret = SetWakeupEvents(dev->net);
  4722. //Save PHY interrupt event, so we can clear it after waking up.
  4723. adapterData->dynamicSuspendPHYEvent = PHY_INT_MASK_ENERGY_ON_ | PHY_INT_MASK_ANEG_COMP_;
  4724. ret = EnablePHYWakeupInterrupt(dev, adapterData->dynamicSuspendPHYEvent);
  4725. }else if(suspendFlag & AUTOSUSPEND_DYNAMIC_S3){//suspend on s3, only for lan9500a
  4726. dev->suspendFlag |= AUTOSUSPEND_DYNAMIC_S3;
  4727. ret = SetWakeupOnSuspend3(dev->net);
  4728. if(ret != SMSC9500_FAIL){
  4729. //Save PHY interrupt event, so we can clear it after waking up.
  4730. adapterData->dynamicSuspendPHYEvent = PHY_INT_MASK_ENERGY_ON_ | PHY_INT_MASK_ANEG_COMP_;
  4731. ret = EnablePHYWakeupInterrupt(dev, adapterData->dynamicSuspendPHYEvent);
  4732. }
  4733. }else{
  4734. SMSC_WARNING("auto suspend event is null\n");
  4735. ret = SMSC9500_FAIL;
  4736. }
  4737. }else{//link is up
  4738. if(suspendFlag & AUTOSUSPEND_DYNAMIC){//suspend on s0, work for lan9500 and lan9500a
  4739. dev->suspendFlag |= AUTOSUSPEND_DYNAMIC;
  4740. adapterData->WolWakeupOpts = (WAKE_UCAST | WAKE_BCAST | WAKE_MCAST | WAKE_ARP);
  4741. ret = SetWakeupEvents(dev->net);
  4742. //Save PHY interrupt event, so we can clear it after waking up.
  4743. adapterData->dynamicSuspendPHYEvent = PHY_INT_MASK_LINK_DOWN_;
  4744. ret = EnablePHYWakeupInterrupt(dev, adapterData->dynamicSuspendPHYEvent);
  4745. }else if(suspendFlag & AUTOSUSPEND_DYNAMIC_S3){//suspend on s3, only for lan9500a
  4746. dev->suspendFlag |= AUTOSUSPEND_DYNAMIC_S3;
  4747. ret = SetWakeupOnSuspend3(dev->net);
  4748. if(ret != SMSC9500_FAIL){
  4749. //Save PHY interrupt event, so we can clear it after waking up.
  4750. adapterData->dynamicSuspendPHYEvent = PHY_INT_MASK_LINK_DOWN_;
  4751. ret = EnablePHYWakeupInterrupt(dev, adapterData->dynamicSuspendPHYEvent);
  4752. }
  4753. }else{// if(suspendFlag & AUTOSUSPEND_LINKDOWN){//Resume immediately
  4754. ret = SMSC9500_FAIL;
  4755. }
  4756. }
  4757. if(ret != SMSC9500_SUCCESS){
  4758. SMSC_WARNING("Failed to suspend device\n");
  4759. dev->suspendFlag = 0;
  4760. if(!dev->pmLock){//Resume immediately
  4761. smscusbnet_defer_myevent(dev, EVENT_IDLE_RESUME);
  4762. }
  4763. goto _SUSPEND_EXIT;
  4764. }else{
  4765. smscusbnet_FreeQueue(dev);
  4766. del_timer_sync(&dev->LinkPollingTimer);
  4767. }
  4768. }else{//Interface down
  4769. u32 Value32;
  4770. SMSC_TRACE(DBG_PWR,"Interface is down, set suspend2 mode\n");
  4771. smsc9500_read_reg(dev, PM_CTRL, &Value32);
  4772. Value32 &= (~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_));
  4773. Value32 |= PM_CTL_SUS_MODE_2;
  4774. smsc9500_write_reg(dev, PM_CTRL, Value32);
  4775. dev->suspendFlag |= AUTOSUSPEND_INTFDOWN;
  4776. }
  4777. _SUSPEND_EXIT:
  4778. SMSC_TRACE(DBG_PWR,"<----Smsc9500AutoSuspend\n");
  4779. return ret;
  4780. }
  4781. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11))
  4782. static int Smsc9500SystemSuspend (struct usb_interface *intf, u32 state)
  4783. #else
  4784. static int Smsc9500SystemSuspend (struct usb_interface *intf, pm_message_t state)
  4785. #endif
  4786. {
  4787. struct usbnet *dev = usb_get_intfdata(intf);
  4788. SMSC_TRACE(DBG_PWR,"---->Smsc9500SystemSuspend\n");
  4789. dev->idleCount = 0;
  4790. dev->suspendFlag = 0;
  4791. if (dev->net && netif_running (dev->net) && netif_device_present (dev->net))
  4792. {
  4793. netif_device_detach (dev->net);
  4794. smscusbnet_FreeQueue(dev);
  4795. dev->StopLinkPolling=TRUE;
  4796. del_timer_sync(&dev->LinkPollingTimer);
  4797. Tx_StopQueue(dev,0x04UL);
  4798. smsc9500_stopAndFlushTxPath(dev);
  4799. smsc9500_stopAndFlushRxPath(dev);
  4800. SetWakeupEvents(dev->net);
  4801. }else{
  4802. // Put Lan9500 in Suspend2
  4803. u32 Value32;
  4804. SMSC_TRACE(DBG_PWR,"Setting Suspend2 mode\n");
  4805. smsc9500_read_reg(dev, PM_CTRL, &Value32);
  4806. Value32 &= (~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_));
  4807. Value32 |= PM_CTL_SUS_MODE_2;
  4808. smsc9500_write_reg(dev, PM_CTRL, Value32);
  4809. dev->suspendFlag |= AUTOSUSPEND_INTFDOWN;
  4810. }
  4811. SMSC_TRACE(DBG_PWR,"<----Smsc9500SystemSuspend\n");
  4812. return SMSC9500_SUCCESS;
  4813. }
  4814. static int Smsc9500_resume(struct usb_interface *intf)
  4815. {
  4816. int ret = SMSC9500_SUCCESS;
  4817. struct usbnet *dev = usb_get_intfdata(intf);
  4818. SMSC_TRACE(DBG_PWR,"--->in Smsc9500_resume\n");
  4819. BUG_ON(!dev);
  4820. BUG_ON(!dev->udev);
  4821. #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
  4822. //autoresume
  4823. if(dev->suspendFlag)
  4824. #else
  4825. if(0)
  4826. #endif
  4827. {
  4828. ret = Smsc9500AutoResume(intf);
  4829. }else
  4830. {
  4831. ret = Smsc9500SystemResume(intf);
  4832. }
  4833. SMSC_TRACE(DBG_PWR,"------->out of in Smsc9500_resume\n");
  4834. return ret;
  4835. }
  4836. static int Smsc9500AutoResume(struct usb_interface *intf)
  4837. {
  4838. struct usbnet *dev = usb_get_intfdata(intf);
  4839. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  4840. u32 dwValue;
  4841. SMSC_TRACE(DBG_PWR,"--->in Smsc9500AutoResume\n");
  4842. clear_bit(EVENT_DEV_RECOVERY, &dev->flags);
  4843. if (dev->suspendFlag & AUTOSUSPEND_INTFDOWN){
  4844. SMSC_TRACE(DBG_PWR,"Resume from interface down\n");
  4845. goto _EXIT_AUTORESUME;
  4846. }
  4847. if(!dev->pmLock){
  4848. smscusbnet_defer_myevent(dev, EVENT_IDLE_RESUME);
  4849. }
  4850. if(dev->suspendFlag & AUTOSUSPEND_LINKDOWN){
  4851. ResetLinkDownWakeupEvents(dev);
  4852. }else if(dev->suspendFlag & AUTOSUSPEND_DYNAMIC){
  4853. DisablePHYWakeupInterrupt(dev, adapterData->dynamicSuspendPHYEvent);
  4854. ResetWakeupEvents(dev->net);
  4855. }else if(dev->suspendFlag & AUTOSUSPEND_DYNAMIC_S3){//Resume from suspend3
  4856. smsc9500_clear_feature(dev,USB_DEVICE_REMOTE_WAKEUP);
  4857. DisablePHYWakeupInterrupt(dev, adapterData->dynamicSuspendPHYEvent);
  4858. if(smsc9500_read_reg(dev, PM_CTRL, &dwValue) < 0){
  4859. SMSC_WARNING("Failed to read PM_CTRL");
  4860. }
  4861. dwValue &= (~(PM_CTL_SUS_MODE_ | PM_CTL_PHY_RST_));
  4862. dwValue |= PM_CTL_SUS_MODE_2;
  4863. if(smsc9500_write_reg(dev, PM_CTRL, dwValue) < 0){
  4864. SMSC_WARNING("Failed to write PM_CTRL");
  4865. }
  4866. dwValue &= ~PM_CTL_WUPS_;
  4867. dwValue |= PM_CTL_WUPS_WOL_;
  4868. if(smsc9500_write_reg(dev, PM_CTRL, dwValue) < 0){ //Should not change suspend_mode while clearing WUPS_sts[1]
  4869. SMSC_WARNING("Failed to write PM_CTRL");
  4870. }
  4871. }
  4872. //if(dev->delay.function)(dev->delay.function)((unsigned long)dev);
  4873. tasklet_schedule (&dev->bh);
  4874. if(adapterData->wakeupOptsBackup){
  4875. adapterData->WolWakeupOpts = adapterData->wakeupOptsBackup;
  4876. adapterData->wakeupOptsBackup = 0;
  4877. }
  4878. Tx_WakeQueue(dev,0x04UL);
  4879. _EXIT_AUTORESUME:
  4880. dev->idleCount = 0;
  4881. dev->suspendFlag = 0;
  4882. SMSC_TRACE(DBG_PWR,"------->out of in Smsc9500AutoResume\n");
  4883. return SMSC9500_SUCCESS;
  4884. }
  4885. static int Smsc9500SystemResume(struct usb_interface *intf)
  4886. {
  4887. int ret=0;
  4888. u32 dwValue;
  4889. struct usbnet *dev = usb_get_intfdata(intf);
  4890. SMSC_TRACE(DBG_PWR,"--->in Smsc9500SystemResume\n");
  4891. if(netif_running (dev->net) && !netif_device_present (dev->net)){
  4892. netif_device_attach (dev->net);
  4893. }
  4894. //test if hcd is still alive
  4895. if(smsc9500_read_reg_async(dev, MAC_CR, &dwValue, TRUE) == ASYNC_RW_SUCCESS){
  4896. SMSC_TRACE(DBG_PWR,"hcd is alive\n");
  4897. ret=smsc9500_reset(dev);
  4898. StartTxPath(dev);
  4899. StartRxPath(dev);
  4900. ResetWakeupEvents(dev->net);
  4901. }else{//This will happen on suspend-to-disk, if we access usb bus, will hang on usb_kill_urb
  4902. SMSC_TRACE(DBG_PWR,"no hcd\n");
  4903. }
  4904. Tx_WakeQueue(dev,0x04UL);
  4905. init_timer(&(dev->LinkPollingTimer));
  4906. dev->StopLinkPolling=FALSE;
  4907. dev->LinkPollingTimer.function=smscusbnet_linkpolling;
  4908. dev->LinkPollingTimer.data=(unsigned long) dev;
  4909. dev->LinkPollingTimer.expires=jiffies+(LinkPollPeriod*HZ);
  4910. add_timer(&(dev->LinkPollingTimer));
  4911. tasklet_schedule (&dev->bh);
  4912. dev->idleCount = 0;
  4913. SMSC_TRACE(DBG_PWR,"------->out of in Smsc9500SystemResume\n");
  4914. return SMSC9500_SUCCESS;
  4915. }
  4916. static int smsc9500_device_recovery(struct usbnet *dev)
  4917. {
  4918. u32 dwReadBuf;
  4919. BUG_ON(!dev);
  4920. if (dev->net && netif_device_present (dev->net))
  4921. {
  4922. SMSC_WARNING("Device recovery is in progress\n");
  4923. if (smsc9500_read_reg(dev,INT_STS,&dwReadBuf)< 0)return SMSC9500_FAIL;
  4924. smscusbnet_FreeQueue(dev);
  4925. dev->StopLinkPolling=TRUE;
  4926. del_timer_sync(&dev->LinkPollingTimer);
  4927. Tx_StopQueue(dev,0x04UL);
  4928. if(smsc9500_stopAndFlushTxPath(dev) < 0)return SMSC9500_FAIL;
  4929. if(smsc9500_stopAndFlushRxPath(dev) < 0)return SMSC9500_FAIL;
  4930. if(dwReadBuf & INT_STS_TXE_){// reset only when TXE occurs
  4931. if(smsc9500_reset(dev) < 0)return SMSC9500_FAIL;
  4932. }
  4933. if(StartTxPath(dev) < 0)return SMSC9500_FAIL;
  4934. if(StartRxPath(dev) < 0)return SMSC9500_FAIL;
  4935. Tx_WakeQueue(dev,0x04UL);
  4936. init_timer(&(dev->LinkPollingTimer));
  4937. dev->StopLinkPolling=FALSE;
  4938. dev->LinkPollingTimer.function=smscusbnet_linkpolling;
  4939. dev->LinkPollingTimer.data=(unsigned long) dev;
  4940. dev->LinkPollingTimer.expires=jiffies+(LinkPollPeriod*HZ);
  4941. add_timer(&(dev->LinkPollingTimer));
  4942. tasklet_schedule (&dev->bh);
  4943. SMSC_WARNING("Device recovery is done\n");
  4944. }
  4945. return SMSC9500_SUCCESS;
  4946. }
  4947. static int smsc9500_eth_phy_boost(struct usbnet *dev, int mode)
  4948. {
  4949. u32 dwTemp;
  4950. int Count;
  4951. PADAPTER_DATA adapterData=(PADAPTER_DATA)(dev->data[0]);
  4952. if ((adapterData->internalPhy) && ((dev->chipID == PID_LAN9730) || (dev->chipID == PID_LAN9530) || (dev->chipID == PID_LAN89530))) {
  4953. if (mode == 1) {
  4954. /* set boost */
  4955. dwTemp = PHY_TSTCNTL_TEST_MODE;
  4956. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTCNTL, dwTemp));
  4957. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTCNTL, 0 ));
  4958. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTCNTL, dwTemp));
  4959. dwTemp = 0x85E8;
  4960. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTWRITE, dwTemp));
  4961. //dwTemp = 0x4416;
  4962. dwTemp = (PHY_TSTCNTL_WRITE | PHY_TSTCNTL_TEST_MODE | 0x16);
  4963. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTCNTL, dwTemp));
  4964. /* Loop until write is completed w/timeout */
  4965. for(Count=1;Count<100;Count++){
  4966. dwTemp = 0;
  4967. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_TSTCNTL, &dwTemp));
  4968. if(!(dwTemp & PHY_TSTCNTL_WRITE))
  4969. break;
  4970. udelay(1);
  4971. }
  4972. if (Count == 100){
  4973. SMSC_WARNING("Timed out writing PHY_TSTWRITE\n");
  4974. }
  4975. #if 0
  4976. /* read and verify the value */
  4977. //dwTemp = 0x86C0;
  4978. dwTemp = (PHY_TSTCNTL_READ | PHY_TSTCNTL_TEST_MODE | 0xC0);
  4979. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTCNTL, dwTemp));
  4980. /* Loop until read is completed w/timeout */
  4981. for(Count=1;Count<100;Count++){
  4982. dwTemp = 0;
  4983. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_TSTCNTL, &dwTemp));
  4984. if(!(dwTemp & PHY_TSTCNTL_READ))
  4985. break;
  4986. udelay(1);
  4987. }
  4988. if (Count < 100){
  4989. dwTemp = 0;
  4990. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_TSTREAD1, &dwTemp));
  4991. if (dwTemp != 0x85E8) {
  4992. SMSC_WARNING("XXX=Failed to set Ethernet Boost: 0x%x \n", dwTemp);
  4993. } else{
  4994. SMSC_TRACE(DBG_INIT, "Ethernet Boost: 0x%x \n", dwTemp);
  4995. }
  4996. }else{
  4997. SMSC_WARNING("Timed out reading PHY_TSTREAD1 register\n");
  4998. return 1;
  4999. }
  5000. #endif
  5001. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTCNTL, 0 ));
  5002. } else {
  5003. #if 0
  5004. dwTemp = PHY_TSTCNTL_TEST_MODE;
  5005. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTCNTL, dwTemp));
  5006. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTCNTL, 0 ));
  5007. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTCNTL, dwTemp));
  5008. /* read and verify the value */
  5009. //dwTemp = 0x86C0;
  5010. dwTemp = (PHY_TSTCNTL_READ | PHY_TSTCNTL_TEST_MODE | 0xC0);
  5011. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTCNTL, dwTemp));
  5012. /* Loop until read is completed w/timeout */
  5013. for(Count=1;Count<100;Count++){
  5014. dwTemp = 0;
  5015. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_TSTCNTL, &dwTemp));
  5016. if(!(dwTemp & PHY_TSTCNTL_READ))
  5017. break;
  5018. udelay(1);
  5019. }
  5020. if (Count < 100){
  5021. dwTemp = 0;
  5022. CHECK_RETURN_STATUS(smsc9500_read_phy(dev, PHY_TSTREAD1, &dwTemp));
  5023. if (dwTemp != 0x85E8) {
  5024. SMSC_WARNING("XXX=Failed to set Ethernet Boost: 0x%x \n", dwTemp);
  5025. } else{
  5026. SMSC_TRACE(DBG_INIT, "Ethernet Boost: 0x%x \n", dwTemp);
  5027. }
  5028. }else{
  5029. SMSC_WARNING("Timed out reading PHY_TSTREAD1 register\n");
  5030. return 1;
  5031. }
  5032. CHECK_RETURN_STATUS(smsc9500_write_phy(dev, PHY_TSTCNTL, 0 ));
  5033. #endif
  5034. }
  5035. }
  5036. return 0;
  5037. DONE:
  5038. return 1;
  5039. }
  5040. static const struct driver_info smsc9500_info = {
  5041. .description = "smsc9500 USB 2.0 Ethernet",
  5042. .bind = smsc9500_bind,
  5043. .unbind=smsc9500_unbind,
  5044. .status = smsc9500_status,
  5045. .link_reset = smsc9500_link_reset,
  5046. .reset = smsc9500_reset,
  5047. .flags = FLAG_ETHER,
  5048. .rx_fixup = smsc9500_rx_fixup,
  5049. .tx_fixup = smsc9500_tx_fixup,
  5050. .rx_setmulticastlist=smsc9500_rx_setmulticastlist,
  5051. };
  5052. static const struct usb_device_id products [] = {
  5053. {
  5054. // SMSC9500 USB Ethernet Device
  5055. USB_DEVICE (0x0424, PID_LAN9500),
  5056. .driver_info = (unsigned long) &smsc9500_info,
  5057. },
  5058. {
  5059. // SMSC9512/9514 USB hub with Ethernet Device
  5060. USB_DEVICE (0x0424, PID_LAN9512),
  5061. .driver_info = (unsigned long) &smsc9500_info,
  5062. },
  5063. {
  5064. // SMSC9500A USB Ethernet Device
  5065. USB_DEVICE (0x0424, PID_LAN9500A),
  5066. .driver_info = (unsigned long) &smsc9500_info,
  5067. },
  5068. {
  5069. // LAN9530 USB Ethernet Device
  5070. USB_DEVICE (0x0424, PID_LAN9530 ),
  5071. .driver_info = (unsigned long) &smsc9500_info,
  5072. },
  5073. {
  5074. // LAN9730 USB Ethernet Device
  5075. USB_DEVICE (0x0424, PID_LAN9730),
  5076. .driver_info = (unsigned long) &smsc9500_info,
  5077. },
  5078. {
  5079. // LAN89530 USB Ethernet Device
  5080. USB_DEVICE (0x0424, PID_LAN89530),
  5081. .driver_info = (unsigned long) &smsc9500_info,
  5082. },
  5083. { }, // END
  5084. };
  5085. MODULE_DEVICE_TABLE(usb, products);
  5086. static struct usb_driver smsc9500_driver = {
  5087. .name = "smsc9500",
  5088. .id_table = products,
  5089. .probe = smscusbnet_probe,
  5090. .suspend = Smsc9500_suspend,
  5091. .resume = Smsc9500_resume,
  5092. .disconnect = smscusbnet_disconnect,
  5093. #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22))
  5094. .reset_resume = Smsc9500SystemResume,
  5095. #endif
  5096. #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
  5097. .supports_autosuspend = 1,
  5098. #endif
  5099. };
  5100. static int __init smsc9500_init(void)
  5101. {
  5102. return usb_register(&smsc9500_driver);
  5103. }
  5104. module_init(smsc9500_init);
  5105. static void __exit smsc9500_exit(void)
  5106. {
  5107. usb_deregister(&smsc9500_driver);
  5108. }
  5109. module_exit(smsc9500_exit);
  5110. MODULE_AUTHOR("Nancy Lin and Sean(Xiang) Chen");
  5111. MODULE_DESCRIPTION("SMSC9500 USB 2.0 Ethernet Devices");
  5112. MODULE_LICENSE("GPL");