pm80xx_hwi.c 163 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069
  1. /*
  2. * PMC-Sierra SPCv/ve 8088/8089 SAS/SATA based host adapters driver
  3. *
  4. * Copyright (c) 2008-2009 PMC-Sierra, Inc.,
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions, and the following disclaimer,
  12. * without modification.
  13. * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  14. * substantially similar to the "NO WARRANTY" disclaimer below
  15. * ("Disclaimer") and any redistribution must be conditioned upon
  16. * including a substantially similar Disclaimer requirement for further
  17. * binary redistribution.
  18. * 3. Neither the names of the above-listed copyright holders nor the names
  19. * of any contributors may be used to endorse or promote products derived
  20. * from this software without specific prior written permission.
  21. *
  22. * Alternatively, this software may be distributed under the terms of the
  23. * GNU General Public License ("GPL") version 2 as published by the Free
  24. * Software Foundation.
  25. *
  26. * NO WARRANTY
  27. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  28. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  29. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  30. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  31. * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  32. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  33. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  34. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  35. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  36. * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  37. * POSSIBILITY OF SUCH DAMAGES.
  38. *
  39. */
  40. #include <linux/slab.h>
  41. #include "pm8001_sas.h"
  42. #include "pm80xx_hwi.h"
  43. #include "pm8001_chips.h"
  44. #include "pm8001_ctl.h"
  45. #include "pm80xx_tracepoints.h"
  46. #define SMP_DIRECT 1
  47. #define SMP_INDIRECT 2
  48. int pm80xx_bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shift_value)
  49. {
  50. u32 reg_val;
  51. unsigned long start;
  52. pm8001_cw32(pm8001_ha, 0, MEMBASE_II_SHIFT_REGISTER, shift_value);
  53. /* confirm the setting is written */
  54. start = jiffies + HZ; /* 1 sec */
  55. do {
  56. reg_val = pm8001_cr32(pm8001_ha, 0, MEMBASE_II_SHIFT_REGISTER);
  57. } while ((reg_val != shift_value) && time_before(jiffies, start));
  58. if (reg_val != shift_value) {
  59. pm8001_dbg(pm8001_ha, FAIL, "TIMEOUT:MEMBASE_II_SHIFT_REGISTER = 0x%x\n",
  60. reg_val);
  61. return -1;
  62. }
  63. return 0;
  64. }
  65. static void pm80xx_pci_mem_copy(struct pm8001_hba_info *pm8001_ha, u32 soffset,
  66. __le32 *destination,
  67. u32 dw_count, u32 bus_base_number)
  68. {
  69. u32 index, value, offset;
  70. for (index = 0; index < dw_count; index += 4, destination++) {
  71. offset = (soffset + index);
  72. if (offset < (64 * 1024)) {
  73. value = pm8001_cr32(pm8001_ha, bus_base_number, offset);
  74. *destination = cpu_to_le32(value);
  75. }
  76. }
  77. return;
  78. }
  79. ssize_t pm80xx_get_fatal_dump(struct device *cdev,
  80. struct device_attribute *attr, char *buf)
  81. {
  82. struct Scsi_Host *shost = class_to_shost(cdev);
  83. struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
  84. struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
  85. void __iomem *fatal_table_address = pm8001_ha->fatal_tbl_addr;
  86. u32 accum_len, reg_val, index, *temp;
  87. u32 status = 1;
  88. unsigned long start;
  89. u8 *direct_data;
  90. char *fatal_error_data = buf;
  91. u32 length_to_read;
  92. u32 offset;
  93. pm8001_ha->forensic_info.data_buf.direct_data = buf;
  94. if (pm8001_ha->chip_id == chip_8001) {
  95. pm8001_ha->forensic_info.data_buf.direct_data +=
  96. sprintf(pm8001_ha->forensic_info.data_buf.direct_data,
  97. "Not supported for SPC controller");
  98. return (char *)pm8001_ha->forensic_info.data_buf.direct_data -
  99. (char *)buf;
  100. }
  101. /* initialize variables for very first call from host application */
  102. if (pm8001_ha->forensic_info.data_buf.direct_offset == 0) {
  103. pm8001_dbg(pm8001_ha, IO,
  104. "forensic_info TYPE_NON_FATAL..............\n");
  105. direct_data = (u8 *)fatal_error_data;
  106. pm8001_ha->forensic_info.data_type = TYPE_NON_FATAL;
  107. pm8001_ha->forensic_info.data_buf.direct_len = SYSFS_OFFSET;
  108. pm8001_ha->forensic_info.data_buf.direct_offset = 0;
  109. pm8001_ha->forensic_info.data_buf.read_len = 0;
  110. pm8001_ha->forensic_preserved_accumulated_transfer = 0;
  111. /* Write signature to fatal dump table */
  112. pm8001_mw32(fatal_table_address,
  113. MPI_FATAL_EDUMP_TABLE_SIGNATURE, 0x1234abcd);
  114. pm8001_ha->forensic_info.data_buf.direct_data = direct_data;
  115. pm8001_dbg(pm8001_ha, IO, "ossaHwCB: status1 %d\n", status);
  116. pm8001_dbg(pm8001_ha, IO, "ossaHwCB: read_len 0x%x\n",
  117. pm8001_ha->forensic_info.data_buf.read_len);
  118. pm8001_dbg(pm8001_ha, IO, "ossaHwCB: direct_len 0x%x\n",
  119. pm8001_ha->forensic_info.data_buf.direct_len);
  120. pm8001_dbg(pm8001_ha, IO, "ossaHwCB: direct_offset 0x%x\n",
  121. pm8001_ha->forensic_info.data_buf.direct_offset);
  122. }
  123. if (pm8001_ha->forensic_info.data_buf.direct_offset == 0) {
  124. /* start to get data */
  125. /* Program the MEMBASE II Shifting Register with 0x00.*/
  126. pm8001_cw32(pm8001_ha, 0, MEMBASE_II_SHIFT_REGISTER,
  127. pm8001_ha->fatal_forensic_shift_offset);
  128. pm8001_ha->forensic_last_offset = 0;
  129. pm8001_ha->forensic_fatal_step = 0;
  130. pm8001_ha->fatal_bar_loc = 0;
  131. }
  132. /* Read until accum_len is retrieved */
  133. accum_len = pm8001_mr32(fatal_table_address,
  134. MPI_FATAL_EDUMP_TABLE_ACCUM_LEN);
  135. /* Determine length of data between previously stored transfer length
  136. * and current accumulated transfer length
  137. */
  138. length_to_read =
  139. accum_len - pm8001_ha->forensic_preserved_accumulated_transfer;
  140. pm8001_dbg(pm8001_ha, IO, "get_fatal_spcv: accum_len 0x%x\n",
  141. accum_len);
  142. pm8001_dbg(pm8001_ha, IO, "get_fatal_spcv: length_to_read 0x%x\n",
  143. length_to_read);
  144. pm8001_dbg(pm8001_ha, IO, "get_fatal_spcv: last_offset 0x%x\n",
  145. pm8001_ha->forensic_last_offset);
  146. pm8001_dbg(pm8001_ha, IO, "get_fatal_spcv: read_len 0x%x\n",
  147. pm8001_ha->forensic_info.data_buf.read_len);
  148. pm8001_dbg(pm8001_ha, IO, "get_fatal_spcv:: direct_len 0x%x\n",
  149. pm8001_ha->forensic_info.data_buf.direct_len);
  150. pm8001_dbg(pm8001_ha, IO, "get_fatal_spcv:: direct_offset 0x%x\n",
  151. pm8001_ha->forensic_info.data_buf.direct_offset);
  152. /* If accumulated length failed to read correctly fail the attempt.*/
  153. if (accum_len == 0xFFFFFFFF) {
  154. pm8001_dbg(pm8001_ha, IO,
  155. "Possible PCI issue 0x%x not expected\n",
  156. accum_len);
  157. return status;
  158. }
  159. /* If accumulated length is zero fail the attempt */
  160. if (accum_len == 0) {
  161. pm8001_ha->forensic_info.data_buf.direct_data +=
  162. sprintf(pm8001_ha->forensic_info.data_buf.direct_data,
  163. "%08x ", 0xFFFFFFFF);
  164. return (char *)pm8001_ha->forensic_info.data_buf.direct_data -
  165. (char *)buf;
  166. }
  167. /* Accumulated length is good so start capturing the first data */
  168. temp = (u32 *)pm8001_ha->memoryMap.region[FORENSIC_MEM].virt_ptr;
  169. if (pm8001_ha->forensic_fatal_step == 0) {
  170. moreData:
  171. /* If data to read is less than SYSFS_OFFSET then reduce the
  172. * length of dataLen
  173. */
  174. if (pm8001_ha->forensic_last_offset + SYSFS_OFFSET
  175. > length_to_read) {
  176. pm8001_ha->forensic_info.data_buf.direct_len =
  177. length_to_read -
  178. pm8001_ha->forensic_last_offset;
  179. } else {
  180. pm8001_ha->forensic_info.data_buf.direct_len =
  181. SYSFS_OFFSET;
  182. }
  183. if (pm8001_ha->forensic_info.data_buf.direct_data) {
  184. /* Data is in bar, copy to host memory */
  185. pm80xx_pci_mem_copy(pm8001_ha,
  186. pm8001_ha->fatal_bar_loc,
  187. pm8001_ha->memoryMap.region[FORENSIC_MEM].virt_ptr,
  188. pm8001_ha->forensic_info.data_buf.direct_len, 1);
  189. }
  190. pm8001_ha->fatal_bar_loc +=
  191. pm8001_ha->forensic_info.data_buf.direct_len;
  192. pm8001_ha->forensic_info.data_buf.direct_offset +=
  193. pm8001_ha->forensic_info.data_buf.direct_len;
  194. pm8001_ha->forensic_last_offset +=
  195. pm8001_ha->forensic_info.data_buf.direct_len;
  196. pm8001_ha->forensic_info.data_buf.read_len =
  197. pm8001_ha->forensic_info.data_buf.direct_len;
  198. if (pm8001_ha->forensic_last_offset >= length_to_read) {
  199. pm8001_ha->forensic_info.data_buf.direct_data +=
  200. sprintf(pm8001_ha->forensic_info.data_buf.direct_data,
  201. "%08x ", 3);
  202. for (index = 0; index <
  203. (pm8001_ha->forensic_info.data_buf.direct_len
  204. / 4); index++) {
  205. pm8001_ha->forensic_info.data_buf.direct_data +=
  206. sprintf(
  207. pm8001_ha->forensic_info.data_buf.direct_data,
  208. "%08x ", *(temp + index));
  209. }
  210. pm8001_ha->fatal_bar_loc = 0;
  211. pm8001_ha->forensic_fatal_step = 1;
  212. pm8001_ha->fatal_forensic_shift_offset = 0;
  213. pm8001_ha->forensic_last_offset = 0;
  214. status = 0;
  215. offset = (int)
  216. ((char *)pm8001_ha->forensic_info.data_buf.direct_data
  217. - (char *)buf);
  218. pm8001_dbg(pm8001_ha, IO,
  219. "get_fatal_spcv:return1 0x%x\n", offset);
  220. return (char *)pm8001_ha->
  221. forensic_info.data_buf.direct_data -
  222. (char *)buf;
  223. }
  224. if (pm8001_ha->fatal_bar_loc < (64 * 1024)) {
  225. pm8001_ha->forensic_info.data_buf.direct_data +=
  226. sprintf(pm8001_ha->
  227. forensic_info.data_buf.direct_data,
  228. "%08x ", 2);
  229. for (index = 0; index <
  230. (pm8001_ha->forensic_info.data_buf.direct_len
  231. / 4); index++) {
  232. pm8001_ha->forensic_info.data_buf.direct_data
  233. += sprintf(pm8001_ha->
  234. forensic_info.data_buf.direct_data,
  235. "%08x ", *(temp + index));
  236. }
  237. status = 0;
  238. offset = (int)
  239. ((char *)pm8001_ha->forensic_info.data_buf.direct_data
  240. - (char *)buf);
  241. pm8001_dbg(pm8001_ha, IO,
  242. "get_fatal_spcv:return2 0x%x\n", offset);
  243. return (char *)pm8001_ha->
  244. forensic_info.data_buf.direct_data -
  245. (char *)buf;
  246. }
  247. /* Increment the MEMBASE II Shifting Register value by 0x100.*/
  248. pm8001_ha->forensic_info.data_buf.direct_data +=
  249. sprintf(pm8001_ha->forensic_info.data_buf.direct_data,
  250. "%08x ", 2);
  251. for (index = 0; index <
  252. (pm8001_ha->forensic_info.data_buf.direct_len
  253. / 4) ; index++) {
  254. pm8001_ha->forensic_info.data_buf.direct_data +=
  255. sprintf(pm8001_ha->
  256. forensic_info.data_buf.direct_data,
  257. "%08x ", *(temp + index));
  258. }
  259. pm8001_ha->fatal_forensic_shift_offset += 0x100;
  260. pm8001_cw32(pm8001_ha, 0, MEMBASE_II_SHIFT_REGISTER,
  261. pm8001_ha->fatal_forensic_shift_offset);
  262. pm8001_ha->fatal_bar_loc = 0;
  263. status = 0;
  264. offset = (int)
  265. ((char *)pm8001_ha->forensic_info.data_buf.direct_data
  266. - (char *)buf);
  267. pm8001_dbg(pm8001_ha, IO, "get_fatal_spcv: return3 0x%x\n",
  268. offset);
  269. return (char *)pm8001_ha->forensic_info.data_buf.direct_data -
  270. (char *)buf;
  271. }
  272. if (pm8001_ha->forensic_fatal_step == 1) {
  273. /* store previous accumulated length before triggering next
  274. * accumulated length update
  275. */
  276. pm8001_ha->forensic_preserved_accumulated_transfer =
  277. pm8001_mr32(fatal_table_address,
  278. MPI_FATAL_EDUMP_TABLE_ACCUM_LEN);
  279. /* continue capturing the fatal log until Dump status is 0x3 */
  280. if (pm8001_mr32(fatal_table_address,
  281. MPI_FATAL_EDUMP_TABLE_STATUS) <
  282. MPI_FATAL_EDUMP_TABLE_STAT_NF_SUCCESS_DONE) {
  283. /* reset fddstat bit by writing to zero*/
  284. pm8001_mw32(fatal_table_address,
  285. MPI_FATAL_EDUMP_TABLE_STATUS, 0x0);
  286. /* set dump control value to '1' so that new data will
  287. * be transferred to shared memory
  288. */
  289. pm8001_mw32(fatal_table_address,
  290. MPI_FATAL_EDUMP_TABLE_HANDSHAKE,
  291. MPI_FATAL_EDUMP_HANDSHAKE_RDY);
  292. /*Poll FDDHSHK until clear */
  293. start = jiffies + (2 * HZ); /* 2 sec */
  294. do {
  295. reg_val = pm8001_mr32(fatal_table_address,
  296. MPI_FATAL_EDUMP_TABLE_HANDSHAKE);
  297. } while ((reg_val) && time_before(jiffies, start));
  298. if (reg_val != 0) {
  299. pm8001_dbg(pm8001_ha, FAIL,
  300. "TIMEOUT:MPI_FATAL_EDUMP_TABLE_HDSHAKE 0x%x\n",
  301. reg_val);
  302. /* Fail the dump if a timeout occurs */
  303. pm8001_ha->forensic_info.data_buf.direct_data +=
  304. sprintf(
  305. pm8001_ha->forensic_info.data_buf.direct_data,
  306. "%08x ", 0xFFFFFFFF);
  307. return((char *)
  308. pm8001_ha->forensic_info.data_buf.direct_data
  309. - (char *)buf);
  310. }
  311. /* Poll status register until set to 2 or
  312. * 3 for up to 2 seconds
  313. */
  314. start = jiffies + (2 * HZ); /* 2 sec */
  315. do {
  316. reg_val = pm8001_mr32(fatal_table_address,
  317. MPI_FATAL_EDUMP_TABLE_STATUS);
  318. } while (((reg_val != 2) && (reg_val != 3)) &&
  319. time_before(jiffies, start));
  320. if (reg_val < 2) {
  321. pm8001_dbg(pm8001_ha, FAIL,
  322. "TIMEOUT:MPI_FATAL_EDUMP_TABLE_STATUS = 0x%x\n",
  323. reg_val);
  324. /* Fail the dump if a timeout occurs */
  325. pm8001_ha->forensic_info.data_buf.direct_data +=
  326. sprintf(
  327. pm8001_ha->forensic_info.data_buf.direct_data,
  328. "%08x ", 0xFFFFFFFF);
  329. return((char *)pm8001_ha->forensic_info.data_buf.direct_data -
  330. (char *)buf);
  331. }
  332. /* reset fatal_forensic_shift_offset back to zero and reset MEMBASE 2 register to zero */
  333. pm8001_ha->fatal_forensic_shift_offset = 0; /* location in 64k region */
  334. pm8001_cw32(pm8001_ha, 0,
  335. MEMBASE_II_SHIFT_REGISTER,
  336. pm8001_ha->fatal_forensic_shift_offset);
  337. }
  338. /* Read the next block of the debug data.*/
  339. length_to_read = pm8001_mr32(fatal_table_address,
  340. MPI_FATAL_EDUMP_TABLE_ACCUM_LEN) -
  341. pm8001_ha->forensic_preserved_accumulated_transfer;
  342. if (length_to_read != 0x0) {
  343. pm8001_ha->forensic_fatal_step = 0;
  344. goto moreData;
  345. } else {
  346. pm8001_ha->forensic_info.data_buf.direct_data +=
  347. sprintf(pm8001_ha->forensic_info.data_buf.direct_data,
  348. "%08x ", 4);
  349. pm8001_ha->forensic_info.data_buf.read_len = 0xFFFFFFFF;
  350. pm8001_ha->forensic_info.data_buf.direct_len = 0;
  351. pm8001_ha->forensic_info.data_buf.direct_offset = 0;
  352. pm8001_ha->forensic_info.data_buf.read_len = 0;
  353. }
  354. }
  355. offset = (int)((char *)pm8001_ha->forensic_info.data_buf.direct_data
  356. - (char *)buf);
  357. pm8001_dbg(pm8001_ha, IO, "get_fatal_spcv: return4 0x%x\n", offset);
  358. return ((char *)pm8001_ha->forensic_info.data_buf.direct_data -
  359. (char *)buf);
  360. }
  361. /* pm80xx_get_non_fatal_dump - dump the nonfatal data from the dma
  362. * location by the firmware.
  363. */
  364. ssize_t pm80xx_get_non_fatal_dump(struct device *cdev,
  365. struct device_attribute *attr, char *buf)
  366. {
  367. struct Scsi_Host *shost = class_to_shost(cdev);
  368. struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
  369. struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
  370. void __iomem *nonfatal_table_address = pm8001_ha->fatal_tbl_addr;
  371. u32 accum_len = 0;
  372. u32 total_len = 0;
  373. u32 reg_val = 0;
  374. u32 *temp = NULL;
  375. u32 index = 0;
  376. u32 output_length;
  377. unsigned long start = 0;
  378. char *buf_copy = buf;
  379. temp = (u32 *)pm8001_ha->memoryMap.region[FORENSIC_MEM].virt_ptr;
  380. if (++pm8001_ha->non_fatal_count == 1) {
  381. if (pm8001_ha->chip_id == chip_8001) {
  382. snprintf(pm8001_ha->forensic_info.data_buf.direct_data,
  383. PAGE_SIZE, "Not supported for SPC controller");
  384. return 0;
  385. }
  386. pm8001_dbg(pm8001_ha, IO, "forensic_info TYPE_NON_FATAL...\n");
  387. /*
  388. * Step 1: Write the host buffer parameters in the MPI Fatal and
  389. * Non-Fatal Error Dump Capture Table.This is the buffer
  390. * where debug data will be DMAed to.
  391. */
  392. pm8001_mw32(nonfatal_table_address,
  393. MPI_FATAL_EDUMP_TABLE_LO_OFFSET,
  394. pm8001_ha->memoryMap.region[FORENSIC_MEM].phys_addr_lo);
  395. pm8001_mw32(nonfatal_table_address,
  396. MPI_FATAL_EDUMP_TABLE_HI_OFFSET,
  397. pm8001_ha->memoryMap.region[FORENSIC_MEM].phys_addr_hi);
  398. pm8001_mw32(nonfatal_table_address,
  399. MPI_FATAL_EDUMP_TABLE_LENGTH, SYSFS_OFFSET);
  400. /* Optionally, set the DUMPCTRL bit to 1 if the host
  401. * keeps sending active I/Os while capturing the non-fatal
  402. * debug data. Otherwise, leave this bit set to zero
  403. */
  404. pm8001_mw32(nonfatal_table_address,
  405. MPI_FATAL_EDUMP_TABLE_HANDSHAKE, MPI_FATAL_EDUMP_HANDSHAKE_RDY);
  406. /*
  407. * Step 2: Clear Accumulative Length of Debug Data Transferred
  408. * [ACCDDLEN] field in the MPI Fatal and Non-Fatal Error Dump
  409. * Capture Table to zero.
  410. */
  411. pm8001_mw32(nonfatal_table_address,
  412. MPI_FATAL_EDUMP_TABLE_ACCUM_LEN, 0);
  413. /* initiallize previous accumulated length to 0 */
  414. pm8001_ha->forensic_preserved_accumulated_transfer = 0;
  415. pm8001_ha->non_fatal_read_length = 0;
  416. }
  417. total_len = pm8001_mr32(nonfatal_table_address,
  418. MPI_FATAL_EDUMP_TABLE_TOTAL_LEN);
  419. /*
  420. * Step 3:Clear Fatal/Non-Fatal Debug Data Transfer Status [FDDTSTAT]
  421. * field and then request that the SPCv controller transfer the debug
  422. * data by setting bit 7 of the Inbound Doorbell Set Register.
  423. */
  424. pm8001_mw32(nonfatal_table_address, MPI_FATAL_EDUMP_TABLE_STATUS, 0);
  425. pm8001_cw32(pm8001_ha, 0, MSGU_IBDB_SET,
  426. SPCv_MSGU_CFG_TABLE_NONFATAL_DUMP);
  427. /*
  428. * Step 4.1: Read back the Inbound Doorbell Set Register (by polling for
  429. * 2 seconds) until register bit 7 is cleared.
  430. * This step only indicates the request is accepted by the controller.
  431. */
  432. start = jiffies + (2 * HZ); /* 2 sec */
  433. do {
  434. reg_val = pm8001_cr32(pm8001_ha, 0, MSGU_IBDB_SET) &
  435. SPCv_MSGU_CFG_TABLE_NONFATAL_DUMP;
  436. } while ((reg_val != 0) && time_before(jiffies, start));
  437. /* Step 4.2: To check the completion of the transfer, poll the Fatal/Non
  438. * Fatal Debug Data Transfer Status [FDDTSTAT] field for 2 seconds in
  439. * the MPI Fatal and Non-Fatal Error Dump Capture Table.
  440. */
  441. start = jiffies + (2 * HZ); /* 2 sec */
  442. do {
  443. reg_val = pm8001_mr32(nonfatal_table_address,
  444. MPI_FATAL_EDUMP_TABLE_STATUS);
  445. } while ((!reg_val) && time_before(jiffies, start));
  446. if ((reg_val == 0x00) ||
  447. (reg_val == MPI_FATAL_EDUMP_TABLE_STAT_DMA_FAILED) ||
  448. (reg_val > MPI_FATAL_EDUMP_TABLE_STAT_NF_SUCCESS_DONE)) {
  449. pm8001_ha->non_fatal_read_length = 0;
  450. buf_copy += snprintf(buf_copy, PAGE_SIZE, "%08x ", 0xFFFFFFFF);
  451. pm8001_ha->non_fatal_count = 0;
  452. return (buf_copy - buf);
  453. } else if (reg_val ==
  454. MPI_FATAL_EDUMP_TABLE_STAT_NF_SUCCESS_MORE_DATA) {
  455. buf_copy += snprintf(buf_copy, PAGE_SIZE, "%08x ", 2);
  456. } else if ((reg_val == MPI_FATAL_EDUMP_TABLE_STAT_NF_SUCCESS_DONE) ||
  457. (pm8001_ha->non_fatal_read_length >= total_len)) {
  458. pm8001_ha->non_fatal_read_length = 0;
  459. buf_copy += snprintf(buf_copy, PAGE_SIZE, "%08x ", 4);
  460. pm8001_ha->non_fatal_count = 0;
  461. }
  462. accum_len = pm8001_mr32(nonfatal_table_address,
  463. MPI_FATAL_EDUMP_TABLE_ACCUM_LEN);
  464. output_length = accum_len -
  465. pm8001_ha->forensic_preserved_accumulated_transfer;
  466. for (index = 0; index < output_length/4; index++)
  467. buf_copy += snprintf(buf_copy, PAGE_SIZE,
  468. "%08x ", *(temp+index));
  469. pm8001_ha->non_fatal_read_length += output_length;
  470. /* store current accumulated length to use in next iteration as
  471. * the previous accumulated length
  472. */
  473. pm8001_ha->forensic_preserved_accumulated_transfer = accum_len;
  474. return (buf_copy - buf);
  475. }
  476. /**
  477. * read_main_config_table - read the configure table and save it.
  478. * @pm8001_ha: our hba card information
  479. */
  480. static void read_main_config_table(struct pm8001_hba_info *pm8001_ha)
  481. {
  482. void __iomem *address = pm8001_ha->main_cfg_tbl_addr;
  483. pm8001_ha->main_cfg_tbl.pm80xx_tbl.signature =
  484. pm8001_mr32(address, MAIN_SIGNATURE_OFFSET);
  485. pm8001_ha->main_cfg_tbl.pm80xx_tbl.interface_rev =
  486. pm8001_mr32(address, MAIN_INTERFACE_REVISION);
  487. pm8001_ha->main_cfg_tbl.pm80xx_tbl.firmware_rev =
  488. pm8001_mr32(address, MAIN_FW_REVISION);
  489. pm8001_ha->main_cfg_tbl.pm80xx_tbl.max_out_io =
  490. pm8001_mr32(address, MAIN_MAX_OUTSTANDING_IO_OFFSET);
  491. pm8001_ha->main_cfg_tbl.pm80xx_tbl.max_sgl =
  492. pm8001_mr32(address, MAIN_MAX_SGL_OFFSET);
  493. pm8001_ha->main_cfg_tbl.pm80xx_tbl.ctrl_cap_flag =
  494. pm8001_mr32(address, MAIN_CNTRL_CAP_OFFSET);
  495. pm8001_ha->main_cfg_tbl.pm80xx_tbl.gst_offset =
  496. pm8001_mr32(address, MAIN_GST_OFFSET);
  497. pm8001_ha->main_cfg_tbl.pm80xx_tbl.inbound_queue_offset =
  498. pm8001_mr32(address, MAIN_IBQ_OFFSET);
  499. pm8001_ha->main_cfg_tbl.pm80xx_tbl.outbound_queue_offset =
  500. pm8001_mr32(address, MAIN_OBQ_OFFSET);
  501. /* read Error Dump Offset and Length */
  502. pm8001_ha->main_cfg_tbl.pm80xx_tbl.fatal_err_dump_offset0 =
  503. pm8001_mr32(address, MAIN_FATAL_ERROR_RDUMP0_OFFSET);
  504. pm8001_ha->main_cfg_tbl.pm80xx_tbl.fatal_err_dump_length0 =
  505. pm8001_mr32(address, MAIN_FATAL_ERROR_RDUMP0_LENGTH);
  506. pm8001_ha->main_cfg_tbl.pm80xx_tbl.fatal_err_dump_offset1 =
  507. pm8001_mr32(address, MAIN_FATAL_ERROR_RDUMP1_OFFSET);
  508. pm8001_ha->main_cfg_tbl.pm80xx_tbl.fatal_err_dump_length1 =
  509. pm8001_mr32(address, MAIN_FATAL_ERROR_RDUMP1_LENGTH);
  510. /* read GPIO LED settings from the configuration table */
  511. pm8001_ha->main_cfg_tbl.pm80xx_tbl.gpio_led_mapping =
  512. pm8001_mr32(address, MAIN_GPIO_LED_FLAGS_OFFSET);
  513. /* read analog Setting offset from the configuration table */
  514. pm8001_ha->main_cfg_tbl.pm80xx_tbl.analog_setup_table_offset =
  515. pm8001_mr32(address, MAIN_ANALOG_SETUP_OFFSET);
  516. pm8001_ha->main_cfg_tbl.pm80xx_tbl.int_vec_table_offset =
  517. pm8001_mr32(address, MAIN_INT_VECTOR_TABLE_OFFSET);
  518. pm8001_ha->main_cfg_tbl.pm80xx_tbl.phy_attr_table_offset =
  519. pm8001_mr32(address, MAIN_SAS_PHY_ATTR_TABLE_OFFSET);
  520. /* read port recover and reset timeout */
  521. pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer =
  522. pm8001_mr32(address, MAIN_PORT_RECOVERY_TIMER);
  523. /* read ILA and inactive firmware version */
  524. pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version =
  525. pm8001_mr32(address, MAIN_MPI_ILA_RELEASE_TYPE);
  526. pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version =
  527. pm8001_mr32(address, MAIN_MPI_INACTIVE_FW_VERSION);
  528. pm8001_dbg(pm8001_ha, DEV,
  529. "Main cfg table: sign:%x interface rev:%x fw_rev:%x\n",
  530. pm8001_ha->main_cfg_tbl.pm80xx_tbl.signature,
  531. pm8001_ha->main_cfg_tbl.pm80xx_tbl.interface_rev,
  532. pm8001_ha->main_cfg_tbl.pm80xx_tbl.firmware_rev);
  533. pm8001_dbg(pm8001_ha, DEV,
  534. "table offset: gst:%x iq:%x oq:%x int vec:%x phy attr:%x\n",
  535. pm8001_ha->main_cfg_tbl.pm80xx_tbl.gst_offset,
  536. pm8001_ha->main_cfg_tbl.pm80xx_tbl.inbound_queue_offset,
  537. pm8001_ha->main_cfg_tbl.pm80xx_tbl.outbound_queue_offset,
  538. pm8001_ha->main_cfg_tbl.pm80xx_tbl.int_vec_table_offset,
  539. pm8001_ha->main_cfg_tbl.pm80xx_tbl.phy_attr_table_offset);
  540. pm8001_dbg(pm8001_ha, DEV,
  541. "Main cfg table; ila rev:%x Inactive fw rev:%x\n",
  542. pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version,
  543. pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version);
  544. }
  545. /**
  546. * read_general_status_table - read the general status table and save it.
  547. * @pm8001_ha: our hba card information
  548. */
  549. static void read_general_status_table(struct pm8001_hba_info *pm8001_ha)
  550. {
  551. void __iomem *address = pm8001_ha->general_stat_tbl_addr;
  552. pm8001_ha->gs_tbl.pm80xx_tbl.gst_len_mpistate =
  553. pm8001_mr32(address, GST_GSTLEN_MPIS_OFFSET);
  554. pm8001_ha->gs_tbl.pm80xx_tbl.iq_freeze_state0 =
  555. pm8001_mr32(address, GST_IQ_FREEZE_STATE0_OFFSET);
  556. pm8001_ha->gs_tbl.pm80xx_tbl.iq_freeze_state1 =
  557. pm8001_mr32(address, GST_IQ_FREEZE_STATE1_OFFSET);
  558. pm8001_ha->gs_tbl.pm80xx_tbl.msgu_tcnt =
  559. pm8001_mr32(address, GST_MSGUTCNT_OFFSET);
  560. pm8001_ha->gs_tbl.pm80xx_tbl.iop_tcnt =
  561. pm8001_mr32(address, GST_IOPTCNT_OFFSET);
  562. pm8001_ha->gs_tbl.pm80xx_tbl.gpio_input_val =
  563. pm8001_mr32(address, GST_GPIO_INPUT_VAL);
  564. pm8001_ha->gs_tbl.pm80xx_tbl.recover_err_info[0] =
  565. pm8001_mr32(address, GST_RERRINFO_OFFSET0);
  566. pm8001_ha->gs_tbl.pm80xx_tbl.recover_err_info[1] =
  567. pm8001_mr32(address, GST_RERRINFO_OFFSET1);
  568. pm8001_ha->gs_tbl.pm80xx_tbl.recover_err_info[2] =
  569. pm8001_mr32(address, GST_RERRINFO_OFFSET2);
  570. pm8001_ha->gs_tbl.pm80xx_tbl.recover_err_info[3] =
  571. pm8001_mr32(address, GST_RERRINFO_OFFSET3);
  572. pm8001_ha->gs_tbl.pm80xx_tbl.recover_err_info[4] =
  573. pm8001_mr32(address, GST_RERRINFO_OFFSET4);
  574. pm8001_ha->gs_tbl.pm80xx_tbl.recover_err_info[5] =
  575. pm8001_mr32(address, GST_RERRINFO_OFFSET5);
  576. pm8001_ha->gs_tbl.pm80xx_tbl.recover_err_info[6] =
  577. pm8001_mr32(address, GST_RERRINFO_OFFSET6);
  578. pm8001_ha->gs_tbl.pm80xx_tbl.recover_err_info[7] =
  579. pm8001_mr32(address, GST_RERRINFO_OFFSET7);
  580. }
  581. /**
  582. * read_phy_attr_table - read the phy attribute table and save it.
  583. * @pm8001_ha: our hba card information
  584. */
  585. static void read_phy_attr_table(struct pm8001_hba_info *pm8001_ha)
  586. {
  587. void __iomem *address = pm8001_ha->pspa_q_tbl_addr;
  588. pm8001_ha->phy_attr_table.phystart1_16[0] =
  589. pm8001_mr32(address, PSPA_PHYSTATE0_OFFSET);
  590. pm8001_ha->phy_attr_table.phystart1_16[1] =
  591. pm8001_mr32(address, PSPA_PHYSTATE1_OFFSET);
  592. pm8001_ha->phy_attr_table.phystart1_16[2] =
  593. pm8001_mr32(address, PSPA_PHYSTATE2_OFFSET);
  594. pm8001_ha->phy_attr_table.phystart1_16[3] =
  595. pm8001_mr32(address, PSPA_PHYSTATE3_OFFSET);
  596. pm8001_ha->phy_attr_table.phystart1_16[4] =
  597. pm8001_mr32(address, PSPA_PHYSTATE4_OFFSET);
  598. pm8001_ha->phy_attr_table.phystart1_16[5] =
  599. pm8001_mr32(address, PSPA_PHYSTATE5_OFFSET);
  600. pm8001_ha->phy_attr_table.phystart1_16[6] =
  601. pm8001_mr32(address, PSPA_PHYSTATE6_OFFSET);
  602. pm8001_ha->phy_attr_table.phystart1_16[7] =
  603. pm8001_mr32(address, PSPA_PHYSTATE7_OFFSET);
  604. pm8001_ha->phy_attr_table.phystart1_16[8] =
  605. pm8001_mr32(address, PSPA_PHYSTATE8_OFFSET);
  606. pm8001_ha->phy_attr_table.phystart1_16[9] =
  607. pm8001_mr32(address, PSPA_PHYSTATE9_OFFSET);
  608. pm8001_ha->phy_attr_table.phystart1_16[10] =
  609. pm8001_mr32(address, PSPA_PHYSTATE10_OFFSET);
  610. pm8001_ha->phy_attr_table.phystart1_16[11] =
  611. pm8001_mr32(address, PSPA_PHYSTATE11_OFFSET);
  612. pm8001_ha->phy_attr_table.phystart1_16[12] =
  613. pm8001_mr32(address, PSPA_PHYSTATE12_OFFSET);
  614. pm8001_ha->phy_attr_table.phystart1_16[13] =
  615. pm8001_mr32(address, PSPA_PHYSTATE13_OFFSET);
  616. pm8001_ha->phy_attr_table.phystart1_16[14] =
  617. pm8001_mr32(address, PSPA_PHYSTATE14_OFFSET);
  618. pm8001_ha->phy_attr_table.phystart1_16[15] =
  619. pm8001_mr32(address, PSPA_PHYSTATE15_OFFSET);
  620. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[0] =
  621. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID0_OFFSET);
  622. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[1] =
  623. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID1_OFFSET);
  624. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[2] =
  625. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID2_OFFSET);
  626. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[3] =
  627. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID3_OFFSET);
  628. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[4] =
  629. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID4_OFFSET);
  630. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[5] =
  631. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID5_OFFSET);
  632. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[6] =
  633. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID6_OFFSET);
  634. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[7] =
  635. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID7_OFFSET);
  636. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[8] =
  637. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID8_OFFSET);
  638. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[9] =
  639. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID9_OFFSET);
  640. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[10] =
  641. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID10_OFFSET);
  642. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[11] =
  643. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID11_OFFSET);
  644. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[12] =
  645. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID12_OFFSET);
  646. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[13] =
  647. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID13_OFFSET);
  648. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[14] =
  649. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID14_OFFSET);
  650. pm8001_ha->phy_attr_table.outbound_hw_event_pid1_16[15] =
  651. pm8001_mr32(address, PSPA_OB_HW_EVENT_PID15_OFFSET);
  652. }
  653. /**
  654. * read_inbnd_queue_table - read the inbound queue table and save it.
  655. * @pm8001_ha: our hba card information
  656. */
  657. static void read_inbnd_queue_table(struct pm8001_hba_info *pm8001_ha)
  658. {
  659. int i;
  660. void __iomem *address = pm8001_ha->inbnd_q_tbl_addr;
  661. for (i = 0; i < PM8001_MAX_INB_NUM; i++) {
  662. u32 offset = i * 0x20;
  663. pm8001_ha->inbnd_q_tbl[i].pi_pci_bar =
  664. get_pci_bar_index(pm8001_mr32(address,
  665. (offset + IB_PIPCI_BAR)));
  666. pm8001_ha->inbnd_q_tbl[i].pi_offset =
  667. pm8001_mr32(address, (offset + IB_PIPCI_BAR_OFFSET));
  668. }
  669. }
  670. /**
  671. * read_outbnd_queue_table - read the outbound queue table and save it.
  672. * @pm8001_ha: our hba card information
  673. */
  674. static void read_outbnd_queue_table(struct pm8001_hba_info *pm8001_ha)
  675. {
  676. int i;
  677. void __iomem *address = pm8001_ha->outbnd_q_tbl_addr;
  678. for (i = 0; i < PM8001_MAX_OUTB_NUM; i++) {
  679. u32 offset = i * 0x24;
  680. pm8001_ha->outbnd_q_tbl[i].ci_pci_bar =
  681. get_pci_bar_index(pm8001_mr32(address,
  682. (offset + OB_CIPCI_BAR)));
  683. pm8001_ha->outbnd_q_tbl[i].ci_offset =
  684. pm8001_mr32(address, (offset + OB_CIPCI_BAR_OFFSET));
  685. }
  686. }
  687. /**
  688. * init_default_table_values - init the default table.
  689. * @pm8001_ha: our hba card information
  690. */
  691. static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
  692. {
  693. int i;
  694. u32 offsetib, offsetob;
  695. void __iomem *addressib = pm8001_ha->inbnd_q_tbl_addr;
  696. void __iomem *addressob = pm8001_ha->outbnd_q_tbl_addr;
  697. u32 ib_offset = pm8001_ha->ib_offset;
  698. u32 ob_offset = pm8001_ha->ob_offset;
  699. u32 ci_offset = pm8001_ha->ci_offset;
  700. u32 pi_offset = pm8001_ha->pi_offset;
  701. pm8001_ha->main_cfg_tbl.pm80xx_tbl.upper_event_log_addr =
  702. pm8001_ha->memoryMap.region[AAP1].phys_addr_hi;
  703. pm8001_ha->main_cfg_tbl.pm80xx_tbl.lower_event_log_addr =
  704. pm8001_ha->memoryMap.region[AAP1].phys_addr_lo;
  705. pm8001_ha->main_cfg_tbl.pm80xx_tbl.event_log_size =
  706. PM8001_EVENT_LOG_SIZE;
  707. pm8001_ha->main_cfg_tbl.pm80xx_tbl.event_log_severity = 0x01;
  708. pm8001_ha->main_cfg_tbl.pm80xx_tbl.upper_pcs_event_log_addr =
  709. pm8001_ha->memoryMap.region[IOP].phys_addr_hi;
  710. pm8001_ha->main_cfg_tbl.pm80xx_tbl.lower_pcs_event_log_addr =
  711. pm8001_ha->memoryMap.region[IOP].phys_addr_lo;
  712. pm8001_ha->main_cfg_tbl.pm80xx_tbl.pcs_event_log_size =
  713. PM8001_EVENT_LOG_SIZE;
  714. pm8001_ha->main_cfg_tbl.pm80xx_tbl.pcs_event_log_severity = 0x01;
  715. pm8001_ha->main_cfg_tbl.pm80xx_tbl.fatal_err_interrupt = 0x01;
  716. /* Enable higher IQs and OQs, 32 to 63, bit 16 */
  717. if (pm8001_ha->max_q_num > 32)
  718. pm8001_ha->main_cfg_tbl.pm80xx_tbl.fatal_err_interrupt |=
  719. 1 << 16;
  720. /* Disable end to end CRC checking */
  721. pm8001_ha->main_cfg_tbl.pm80xx_tbl.crc_core_dump = (0x1 << 16);
  722. for (i = 0; i < pm8001_ha->max_q_num; i++) {
  723. pm8001_ha->inbnd_q_tbl[i].element_pri_size_cnt =
  724. PM8001_MPI_QUEUE | (pm8001_ha->iomb_size << 16) | (0x00<<30);
  725. pm8001_ha->inbnd_q_tbl[i].upper_base_addr =
  726. pm8001_ha->memoryMap.region[ib_offset + i].phys_addr_hi;
  727. pm8001_ha->inbnd_q_tbl[i].lower_base_addr =
  728. pm8001_ha->memoryMap.region[ib_offset + i].phys_addr_lo;
  729. pm8001_ha->inbnd_q_tbl[i].base_virt =
  730. (u8 *)pm8001_ha->memoryMap.region[ib_offset + i].virt_ptr;
  731. pm8001_ha->inbnd_q_tbl[i].total_length =
  732. pm8001_ha->memoryMap.region[ib_offset + i].total_len;
  733. pm8001_ha->inbnd_q_tbl[i].ci_upper_base_addr =
  734. pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_hi;
  735. pm8001_ha->inbnd_q_tbl[i].ci_lower_base_addr =
  736. pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo;
  737. pm8001_ha->inbnd_q_tbl[i].ci_virt =
  738. pm8001_ha->memoryMap.region[ci_offset + i].virt_ptr;
  739. pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0, 0);
  740. offsetib = i * 0x20;
  741. pm8001_ha->inbnd_q_tbl[i].pi_pci_bar =
  742. get_pci_bar_index(pm8001_mr32(addressib,
  743. (offsetib + 0x14)));
  744. pm8001_ha->inbnd_q_tbl[i].pi_offset =
  745. pm8001_mr32(addressib, (offsetib + 0x18));
  746. pm8001_ha->inbnd_q_tbl[i].producer_idx = 0;
  747. pm8001_ha->inbnd_q_tbl[i].consumer_index = 0;
  748. pm8001_dbg(pm8001_ha, DEV,
  749. "IQ %d pi_bar 0x%x pi_offset 0x%x\n", i,
  750. pm8001_ha->inbnd_q_tbl[i].pi_pci_bar,
  751. pm8001_ha->inbnd_q_tbl[i].pi_offset);
  752. }
  753. for (i = 0; i < pm8001_ha->max_q_num; i++) {
  754. pm8001_ha->outbnd_q_tbl[i].element_size_cnt =
  755. PM8001_MPI_QUEUE | (pm8001_ha->iomb_size << 16) | (0x01<<30);
  756. pm8001_ha->outbnd_q_tbl[i].upper_base_addr =
  757. pm8001_ha->memoryMap.region[ob_offset + i].phys_addr_hi;
  758. pm8001_ha->outbnd_q_tbl[i].lower_base_addr =
  759. pm8001_ha->memoryMap.region[ob_offset + i].phys_addr_lo;
  760. pm8001_ha->outbnd_q_tbl[i].base_virt =
  761. (u8 *)pm8001_ha->memoryMap.region[ob_offset + i].virt_ptr;
  762. pm8001_ha->outbnd_q_tbl[i].total_length =
  763. pm8001_ha->memoryMap.region[ob_offset + i].total_len;
  764. pm8001_ha->outbnd_q_tbl[i].pi_upper_base_addr =
  765. pm8001_ha->memoryMap.region[pi_offset + i].phys_addr_hi;
  766. pm8001_ha->outbnd_q_tbl[i].pi_lower_base_addr =
  767. pm8001_ha->memoryMap.region[pi_offset + i].phys_addr_lo;
  768. /* interrupt vector based on oq */
  769. pm8001_ha->outbnd_q_tbl[i].interrup_vec_cnt_delay = (i << 24);
  770. pm8001_ha->outbnd_q_tbl[i].pi_virt =
  771. pm8001_ha->memoryMap.region[pi_offset + i].virt_ptr;
  772. pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0, 0);
  773. offsetob = i * 0x24;
  774. pm8001_ha->outbnd_q_tbl[i].ci_pci_bar =
  775. get_pci_bar_index(pm8001_mr32(addressob,
  776. offsetob + 0x14));
  777. pm8001_ha->outbnd_q_tbl[i].ci_offset =
  778. pm8001_mr32(addressob, (offsetob + 0x18));
  779. pm8001_ha->outbnd_q_tbl[i].consumer_idx = 0;
  780. pm8001_ha->outbnd_q_tbl[i].producer_index = 0;
  781. pm8001_dbg(pm8001_ha, DEV,
  782. "OQ %d ci_bar 0x%x ci_offset 0x%x\n", i,
  783. pm8001_ha->outbnd_q_tbl[i].ci_pci_bar,
  784. pm8001_ha->outbnd_q_tbl[i].ci_offset);
  785. }
  786. }
  787. /**
  788. * update_main_config_table - update the main default table to the HBA.
  789. * @pm8001_ha: our hba card information
  790. */
  791. static void update_main_config_table(struct pm8001_hba_info *pm8001_ha)
  792. {
  793. void __iomem *address = pm8001_ha->main_cfg_tbl_addr;
  794. pm8001_mw32(address, MAIN_IQNPPD_HPPD_OFFSET,
  795. pm8001_ha->main_cfg_tbl.pm80xx_tbl.inbound_q_nppd_hppd);
  796. pm8001_mw32(address, MAIN_EVENT_LOG_ADDR_HI,
  797. pm8001_ha->main_cfg_tbl.pm80xx_tbl.upper_event_log_addr);
  798. pm8001_mw32(address, MAIN_EVENT_LOG_ADDR_LO,
  799. pm8001_ha->main_cfg_tbl.pm80xx_tbl.lower_event_log_addr);
  800. pm8001_mw32(address, MAIN_EVENT_LOG_BUFF_SIZE,
  801. pm8001_ha->main_cfg_tbl.pm80xx_tbl.event_log_size);
  802. pm8001_mw32(address, MAIN_EVENT_LOG_OPTION,
  803. pm8001_ha->main_cfg_tbl.pm80xx_tbl.event_log_severity);
  804. pm8001_mw32(address, MAIN_PCS_EVENT_LOG_ADDR_HI,
  805. pm8001_ha->main_cfg_tbl.pm80xx_tbl.upper_pcs_event_log_addr);
  806. pm8001_mw32(address, MAIN_PCS_EVENT_LOG_ADDR_LO,
  807. pm8001_ha->main_cfg_tbl.pm80xx_tbl.lower_pcs_event_log_addr);
  808. pm8001_mw32(address, MAIN_PCS_EVENT_LOG_BUFF_SIZE,
  809. pm8001_ha->main_cfg_tbl.pm80xx_tbl.pcs_event_log_size);
  810. pm8001_mw32(address, MAIN_PCS_EVENT_LOG_OPTION,
  811. pm8001_ha->main_cfg_tbl.pm80xx_tbl.pcs_event_log_severity);
  812. /* Update Fatal error interrupt vector */
  813. pm8001_ha->main_cfg_tbl.pm80xx_tbl.fatal_err_interrupt |=
  814. ((pm8001_ha->max_q_num - 1) << 8);
  815. pm8001_mw32(address, MAIN_FATAL_ERROR_INTERRUPT,
  816. pm8001_ha->main_cfg_tbl.pm80xx_tbl.fatal_err_interrupt);
  817. pm8001_dbg(pm8001_ha, DEV,
  818. "Updated Fatal error interrupt vector 0x%x\n",
  819. pm8001_mr32(address, MAIN_FATAL_ERROR_INTERRUPT));
  820. pm8001_mw32(address, MAIN_EVENT_CRC_CHECK,
  821. pm8001_ha->main_cfg_tbl.pm80xx_tbl.crc_core_dump);
  822. /* SPCv specific */
  823. pm8001_ha->main_cfg_tbl.pm80xx_tbl.gpio_led_mapping &= 0xCFFFFFFF;
  824. /* Set GPIOLED to 0x2 for LED indicator */
  825. pm8001_ha->main_cfg_tbl.pm80xx_tbl.gpio_led_mapping |= 0x20000000;
  826. pm8001_mw32(address, MAIN_GPIO_LED_FLAGS_OFFSET,
  827. pm8001_ha->main_cfg_tbl.pm80xx_tbl.gpio_led_mapping);
  828. pm8001_dbg(pm8001_ha, DEV,
  829. "Programming DW 0x21 in main cfg table with 0x%x\n",
  830. pm8001_mr32(address, MAIN_GPIO_LED_FLAGS_OFFSET));
  831. pm8001_mw32(address, MAIN_PORT_RECOVERY_TIMER,
  832. pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer);
  833. pm8001_mw32(address, MAIN_INT_REASSERTION_DELAY,
  834. pm8001_ha->main_cfg_tbl.pm80xx_tbl.interrupt_reassertion_delay);
  835. pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &= 0xffff0000;
  836. pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |=
  837. PORT_RECOVERY_TIMEOUT;
  838. if (pm8001_ha->chip_id == chip_8006) {
  839. pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &=
  840. 0x0000ffff;
  841. pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |=
  842. CHIP_8006_PORT_RECOVERY_TIMEOUT;
  843. }
  844. pm8001_mw32(address, MAIN_PORT_RECOVERY_TIMER,
  845. pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer);
  846. }
  847. /**
  848. * update_inbnd_queue_table - update the inbound queue table to the HBA.
  849. * @pm8001_ha: our hba card information
  850. * @number: entry in the queue
  851. */
  852. static void update_inbnd_queue_table(struct pm8001_hba_info *pm8001_ha,
  853. int number)
  854. {
  855. void __iomem *address = pm8001_ha->inbnd_q_tbl_addr;
  856. u16 offset = number * 0x20;
  857. pm8001_mw32(address, offset + IB_PROPERITY_OFFSET,
  858. pm8001_ha->inbnd_q_tbl[number].element_pri_size_cnt);
  859. pm8001_mw32(address, offset + IB_BASE_ADDR_HI_OFFSET,
  860. pm8001_ha->inbnd_q_tbl[number].upper_base_addr);
  861. pm8001_mw32(address, offset + IB_BASE_ADDR_LO_OFFSET,
  862. pm8001_ha->inbnd_q_tbl[number].lower_base_addr);
  863. pm8001_mw32(address, offset + IB_CI_BASE_ADDR_HI_OFFSET,
  864. pm8001_ha->inbnd_q_tbl[number].ci_upper_base_addr);
  865. pm8001_mw32(address, offset + IB_CI_BASE_ADDR_LO_OFFSET,
  866. pm8001_ha->inbnd_q_tbl[number].ci_lower_base_addr);
  867. pm8001_dbg(pm8001_ha, DEV,
  868. "IQ %d: Element pri size 0x%x\n",
  869. number,
  870. pm8001_ha->inbnd_q_tbl[number].element_pri_size_cnt);
  871. pm8001_dbg(pm8001_ha, DEV,
  872. "IQ upr base addr 0x%x IQ lwr base addr 0x%x\n",
  873. pm8001_ha->inbnd_q_tbl[number].upper_base_addr,
  874. pm8001_ha->inbnd_q_tbl[number].lower_base_addr);
  875. pm8001_dbg(pm8001_ha, DEV,
  876. "CI upper base addr 0x%x CI lower base addr 0x%x\n",
  877. pm8001_ha->inbnd_q_tbl[number].ci_upper_base_addr,
  878. pm8001_ha->inbnd_q_tbl[number].ci_lower_base_addr);
  879. }
  880. /**
  881. * update_outbnd_queue_table - update the outbound queue table to the HBA.
  882. * @pm8001_ha: our hba card information
  883. * @number: entry in the queue
  884. */
  885. static void update_outbnd_queue_table(struct pm8001_hba_info *pm8001_ha,
  886. int number)
  887. {
  888. void __iomem *address = pm8001_ha->outbnd_q_tbl_addr;
  889. u16 offset = number * 0x24;
  890. pm8001_mw32(address, offset + OB_PROPERITY_OFFSET,
  891. pm8001_ha->outbnd_q_tbl[number].element_size_cnt);
  892. pm8001_mw32(address, offset + OB_BASE_ADDR_HI_OFFSET,
  893. pm8001_ha->outbnd_q_tbl[number].upper_base_addr);
  894. pm8001_mw32(address, offset + OB_BASE_ADDR_LO_OFFSET,
  895. pm8001_ha->outbnd_q_tbl[number].lower_base_addr);
  896. pm8001_mw32(address, offset + OB_PI_BASE_ADDR_HI_OFFSET,
  897. pm8001_ha->outbnd_q_tbl[number].pi_upper_base_addr);
  898. pm8001_mw32(address, offset + OB_PI_BASE_ADDR_LO_OFFSET,
  899. pm8001_ha->outbnd_q_tbl[number].pi_lower_base_addr);
  900. pm8001_mw32(address, offset + OB_INTERRUPT_COALES_OFFSET,
  901. pm8001_ha->outbnd_q_tbl[number].interrup_vec_cnt_delay);
  902. pm8001_dbg(pm8001_ha, DEV,
  903. "OQ %d: Element pri size 0x%x\n",
  904. number,
  905. pm8001_ha->outbnd_q_tbl[number].element_size_cnt);
  906. pm8001_dbg(pm8001_ha, DEV,
  907. "OQ upr base addr 0x%x OQ lwr base addr 0x%x\n",
  908. pm8001_ha->outbnd_q_tbl[number].upper_base_addr,
  909. pm8001_ha->outbnd_q_tbl[number].lower_base_addr);
  910. pm8001_dbg(pm8001_ha, DEV,
  911. "PI upper base addr 0x%x PI lower base addr 0x%x\n",
  912. pm8001_ha->outbnd_q_tbl[number].pi_upper_base_addr,
  913. pm8001_ha->outbnd_q_tbl[number].pi_lower_base_addr);
  914. }
  915. /**
  916. * mpi_init_check - check firmware initialization status.
  917. * @pm8001_ha: our hba card information
  918. */
  919. static int mpi_init_check(struct pm8001_hba_info *pm8001_ha)
  920. {
  921. u32 max_wait_count;
  922. u32 value;
  923. u32 gst_len_mpistate;
  924. /* Write bit0=1 to Inbound DoorBell Register to tell the SPC FW the
  925. table is updated */
  926. pm8001_cw32(pm8001_ha, 0, MSGU_IBDB_SET, SPCv_MSGU_CFG_TABLE_UPDATE);
  927. /* wait until Inbound DoorBell Clear Register toggled */
  928. if (IS_SPCV_12G(pm8001_ha->pdev)) {
  929. max_wait_count = SPCV_DOORBELL_CLEAR_TIMEOUT;
  930. } else {
  931. max_wait_count = SPC_DOORBELL_CLEAR_TIMEOUT;
  932. }
  933. do {
  934. msleep(FW_READY_INTERVAL);
  935. value = pm8001_cr32(pm8001_ha, 0, MSGU_IBDB_SET);
  936. value &= SPCv_MSGU_CFG_TABLE_UPDATE;
  937. } while ((value != 0) && (--max_wait_count));
  938. if (!max_wait_count) {
  939. /* additional check */
  940. pm8001_dbg(pm8001_ha, FAIL,
  941. "Inb doorbell clear not toggled[value:%x]\n",
  942. value);
  943. return -EBUSY;
  944. }
  945. /* check the MPI-State for initialization up to 100ms*/
  946. max_wait_count = 5;/* 100 msec */
  947. do {
  948. msleep(FW_READY_INTERVAL);
  949. gst_len_mpistate =
  950. pm8001_mr32(pm8001_ha->general_stat_tbl_addr,
  951. GST_GSTLEN_MPIS_OFFSET);
  952. } while ((GST_MPI_STATE_INIT !=
  953. (gst_len_mpistate & GST_MPI_STATE_MASK)) && (--max_wait_count));
  954. if (!max_wait_count)
  955. return -EBUSY;
  956. /* check MPI Initialization error */
  957. gst_len_mpistate = gst_len_mpistate >> 16;
  958. if (0x0000 != gst_len_mpistate)
  959. return -EBUSY;
  960. /*
  961. * As per controller datasheet, after successful MPI
  962. * initialization minimum 500ms delay is required before
  963. * issuing commands.
  964. */
  965. msleep(500);
  966. return 0;
  967. }
  968. /**
  969. * check_fw_ready - The LLDD check if the FW is ready, if not, return error.
  970. * This function sleeps hence it must not be used in atomic context.
  971. * @pm8001_ha: our hba card information
  972. */
  973. static int check_fw_ready(struct pm8001_hba_info *pm8001_ha)
  974. {
  975. u32 value;
  976. u32 max_wait_count;
  977. u32 max_wait_time;
  978. u32 expected_mask;
  979. int ret = 0;
  980. /* reset / PCIe ready */
  981. max_wait_time = max_wait_count = 5; /* 100 milli sec */
  982. do {
  983. msleep(FW_READY_INTERVAL);
  984. value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1);
  985. } while ((value == 0xFFFFFFFF) && (--max_wait_count));
  986. /* check ila, RAAE and iops status */
  987. if ((pm8001_ha->chip_id != chip_8008) &&
  988. (pm8001_ha->chip_id != chip_8009)) {
  989. max_wait_time = max_wait_count = 180; /* 3600 milli sec */
  990. expected_mask = SCRATCH_PAD_ILA_READY |
  991. SCRATCH_PAD_RAAE_READY |
  992. SCRATCH_PAD_IOP0_READY |
  993. SCRATCH_PAD_IOP1_READY;
  994. } else {
  995. max_wait_time = max_wait_count = 170; /* 3400 milli sec */
  996. expected_mask = SCRATCH_PAD_ILA_READY |
  997. SCRATCH_PAD_RAAE_READY |
  998. SCRATCH_PAD_IOP0_READY;
  999. }
  1000. do {
  1001. msleep(FW_READY_INTERVAL);
  1002. value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1);
  1003. } while (((value & expected_mask) !=
  1004. expected_mask) && (--max_wait_count));
  1005. if (!max_wait_count) {
  1006. pm8001_dbg(pm8001_ha, INIT,
  1007. "At least one FW component failed to load within %d millisec: Scratchpad1: 0x%x\n",
  1008. max_wait_time * FW_READY_INTERVAL, value);
  1009. ret = -1;
  1010. } else {
  1011. pm8001_dbg(pm8001_ha, MSG,
  1012. "All FW components ready by %d ms\n",
  1013. (max_wait_time - max_wait_count) * FW_READY_INTERVAL);
  1014. }
  1015. return ret;
  1016. }
  1017. static int init_pci_device_addresses(struct pm8001_hba_info *pm8001_ha)
  1018. {
  1019. void __iomem *base_addr;
  1020. u32 value;
  1021. u32 offset;
  1022. u32 pcibar;
  1023. u32 pcilogic;
  1024. value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_0);
  1025. /*
  1026. * lower 26 bits of SCRATCHPAD0 register describes offset within the
  1027. * PCIe BAR where the MPI configuration table is present
  1028. */
  1029. offset = value & 0x03FFFFFF; /* scratch pad 0 TBL address */
  1030. pm8001_dbg(pm8001_ha, DEV, "Scratchpad 0 Offset: 0x%x value 0x%x\n",
  1031. offset, value);
  1032. /*
  1033. * Upper 6 bits describe the offset within PCI config space where BAR
  1034. * is located.
  1035. */
  1036. pcilogic = (value & 0xFC000000) >> 26;
  1037. pcibar = get_pci_bar_index(pcilogic);
  1038. pm8001_dbg(pm8001_ha, INIT, "Scratchpad 0 PCI BAR: %d\n", pcibar);
  1039. /*
  1040. * Make sure the offset falls inside the ioremapped PCI BAR
  1041. */
  1042. if (offset > pm8001_ha->io_mem[pcibar].memsize) {
  1043. pm8001_dbg(pm8001_ha, FAIL,
  1044. "Main cfg tbl offset outside %u > %u\n",
  1045. offset, pm8001_ha->io_mem[pcibar].memsize);
  1046. return -EBUSY;
  1047. }
  1048. pm8001_ha->main_cfg_tbl_addr = base_addr =
  1049. pm8001_ha->io_mem[pcibar].memvirtaddr + offset;
  1050. /*
  1051. * Validate main configuration table address: first DWord should read
  1052. * "PMCS"
  1053. */
  1054. value = pm8001_mr32(pm8001_ha->main_cfg_tbl_addr, 0);
  1055. if (memcmp(&value, "PMCS", 4) != 0) {
  1056. pm8001_dbg(pm8001_ha, FAIL,
  1057. "BAD main config signature 0x%x\n",
  1058. value);
  1059. return -EBUSY;
  1060. }
  1061. pm8001_dbg(pm8001_ha, INIT,
  1062. "VALID main config signature 0x%x\n", value);
  1063. pm8001_ha->general_stat_tbl_addr =
  1064. base_addr + (pm8001_cr32(pm8001_ha, pcibar, offset + 0x18) &
  1065. 0xFFFFFF);
  1066. pm8001_ha->inbnd_q_tbl_addr =
  1067. base_addr + (pm8001_cr32(pm8001_ha, pcibar, offset + 0x1C) &
  1068. 0xFFFFFF);
  1069. pm8001_ha->outbnd_q_tbl_addr =
  1070. base_addr + (pm8001_cr32(pm8001_ha, pcibar, offset + 0x20) &
  1071. 0xFFFFFF);
  1072. pm8001_ha->ivt_tbl_addr =
  1073. base_addr + (pm8001_cr32(pm8001_ha, pcibar, offset + 0x8C) &
  1074. 0xFFFFFF);
  1075. pm8001_ha->pspa_q_tbl_addr =
  1076. base_addr + (pm8001_cr32(pm8001_ha, pcibar, offset + 0x90) &
  1077. 0xFFFFFF);
  1078. pm8001_ha->fatal_tbl_addr =
  1079. base_addr + (pm8001_cr32(pm8001_ha, pcibar, offset + 0xA0) &
  1080. 0xFFFFFF);
  1081. pm8001_dbg(pm8001_ha, INIT, "GST OFFSET 0x%x\n",
  1082. pm8001_cr32(pm8001_ha, pcibar, offset + 0x18));
  1083. pm8001_dbg(pm8001_ha, INIT, "INBND OFFSET 0x%x\n",
  1084. pm8001_cr32(pm8001_ha, pcibar, offset + 0x1C));
  1085. pm8001_dbg(pm8001_ha, INIT, "OBND OFFSET 0x%x\n",
  1086. pm8001_cr32(pm8001_ha, pcibar, offset + 0x20));
  1087. pm8001_dbg(pm8001_ha, INIT, "IVT OFFSET 0x%x\n",
  1088. pm8001_cr32(pm8001_ha, pcibar, offset + 0x8C));
  1089. pm8001_dbg(pm8001_ha, INIT, "PSPA OFFSET 0x%x\n",
  1090. pm8001_cr32(pm8001_ha, pcibar, offset + 0x90));
  1091. pm8001_dbg(pm8001_ha, INIT, "addr - main cfg %p general status %p\n",
  1092. pm8001_ha->main_cfg_tbl_addr,
  1093. pm8001_ha->general_stat_tbl_addr);
  1094. pm8001_dbg(pm8001_ha, INIT, "addr - inbnd %p obnd %p\n",
  1095. pm8001_ha->inbnd_q_tbl_addr,
  1096. pm8001_ha->outbnd_q_tbl_addr);
  1097. pm8001_dbg(pm8001_ha, INIT, "addr - pspa %p ivt %p\n",
  1098. pm8001_ha->pspa_q_tbl_addr,
  1099. pm8001_ha->ivt_tbl_addr);
  1100. return 0;
  1101. }
  1102. /**
  1103. * pm80xx_set_thermal_config - support the thermal configuration
  1104. * @pm8001_ha: our hba card information.
  1105. */
  1106. int
  1107. pm80xx_set_thermal_config(struct pm8001_hba_info *pm8001_ha)
  1108. {
  1109. struct set_ctrl_cfg_req payload;
  1110. int rc;
  1111. u32 tag;
  1112. u32 opc = OPC_INB_SET_CONTROLLER_CONFIG;
  1113. u32 page_code;
  1114. memset(&payload, 0, sizeof(struct set_ctrl_cfg_req));
  1115. rc = pm8001_tag_alloc(pm8001_ha, &tag);
  1116. if (rc)
  1117. return rc;
  1118. payload.tag = cpu_to_le32(tag);
  1119. if (IS_SPCV_12G(pm8001_ha->pdev))
  1120. page_code = THERMAL_PAGE_CODE_7H;
  1121. else
  1122. page_code = THERMAL_PAGE_CODE_8H;
  1123. payload.cfg_pg[0] =
  1124. cpu_to_le32((THERMAL_LOG_ENABLE << 9) |
  1125. (THERMAL_ENABLE << 8) | page_code);
  1126. payload.cfg_pg[1] =
  1127. cpu_to_le32((LTEMPHIL << 24) | (RTEMPHIL << 8));
  1128. pm8001_dbg(pm8001_ha, DEV,
  1129. "Setting up thermal config. cfg_pg 0 0x%x cfg_pg 1 0x%x\n",
  1130. payload.cfg_pg[0], payload.cfg_pg[1]);
  1131. rc = pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &payload,
  1132. sizeof(payload), 0);
  1133. if (rc)
  1134. pm8001_tag_free(pm8001_ha, tag);
  1135. return rc;
  1136. }
  1137. /**
  1138. * pm80xx_set_sas_protocol_timer_config - support the SAS Protocol
  1139. * Timer configuration page
  1140. * @pm8001_ha: our hba card information.
  1141. */
  1142. static int
  1143. pm80xx_set_sas_protocol_timer_config(struct pm8001_hba_info *pm8001_ha)
  1144. {
  1145. struct set_ctrl_cfg_req payload;
  1146. SASProtocolTimerConfig_t SASConfigPage;
  1147. int rc;
  1148. u32 tag;
  1149. u32 opc = OPC_INB_SET_CONTROLLER_CONFIG;
  1150. memset(&payload, 0, sizeof(struct set_ctrl_cfg_req));
  1151. memset(&SASConfigPage, 0, sizeof(SASProtocolTimerConfig_t));
  1152. rc = pm8001_tag_alloc(pm8001_ha, &tag);
  1153. if (rc)
  1154. return rc;
  1155. payload.tag = cpu_to_le32(tag);
  1156. SASConfigPage.pageCode = cpu_to_le32(SAS_PROTOCOL_TIMER_CONFIG_PAGE);
  1157. SASConfigPage.MST_MSI = cpu_to_le32(3 << 15);
  1158. SASConfigPage.STP_SSP_MCT_TMO =
  1159. cpu_to_le32((STP_MCT_TMO << 16) | SSP_MCT_TMO);
  1160. SASConfigPage.STP_FRM_TMO =
  1161. cpu_to_le32((SAS_MAX_OPEN_TIME << 24) |
  1162. (SMP_MAX_CONN_TIMER << 16) | STP_FRM_TIMER);
  1163. SASConfigPage.STP_IDLE_TMO = cpu_to_le32(STP_IDLE_TIME);
  1164. SASConfigPage.OPNRJT_RTRY_INTVL =
  1165. cpu_to_le32((SAS_MFD << 16) | SAS_OPNRJT_RTRY_INTVL);
  1166. SASConfigPage.Data_Cmd_OPNRJT_RTRY_TMO =
  1167. cpu_to_le32((SAS_DOPNRJT_RTRY_TMO << 16) | SAS_COPNRJT_RTRY_TMO);
  1168. SASConfigPage.Data_Cmd_OPNRJT_RTRY_THR =
  1169. cpu_to_le32((SAS_DOPNRJT_RTRY_THR << 16) | SAS_COPNRJT_RTRY_THR);
  1170. SASConfigPage.MAX_AIP = cpu_to_le32(SAS_MAX_AIP);
  1171. pm8001_dbg(pm8001_ha, INIT, "SASConfigPage.pageCode 0x%08x\n",
  1172. le32_to_cpu(SASConfigPage.pageCode));
  1173. pm8001_dbg(pm8001_ha, INIT, "SASConfigPage.MST_MSI 0x%08x\n",
  1174. le32_to_cpu(SASConfigPage.MST_MSI));
  1175. pm8001_dbg(pm8001_ha, INIT, "SASConfigPage.STP_SSP_MCT_TMO 0x%08x\n",
  1176. le32_to_cpu(SASConfigPage.STP_SSP_MCT_TMO));
  1177. pm8001_dbg(pm8001_ha, INIT, "SASConfigPage.STP_FRM_TMO 0x%08x\n",
  1178. le32_to_cpu(SASConfigPage.STP_FRM_TMO));
  1179. pm8001_dbg(pm8001_ha, INIT, "SASConfigPage.STP_IDLE_TMO 0x%08x\n",
  1180. le32_to_cpu(SASConfigPage.STP_IDLE_TMO));
  1181. pm8001_dbg(pm8001_ha, INIT, "SASConfigPage.OPNRJT_RTRY_INTVL 0x%08x\n",
  1182. le32_to_cpu(SASConfigPage.OPNRJT_RTRY_INTVL));
  1183. pm8001_dbg(pm8001_ha, INIT, "SASConfigPage.Data_Cmd_OPNRJT_RTRY_TMO 0x%08x\n",
  1184. le32_to_cpu(SASConfigPage.Data_Cmd_OPNRJT_RTRY_TMO));
  1185. pm8001_dbg(pm8001_ha, INIT, "SASConfigPage.Data_Cmd_OPNRJT_RTRY_THR 0x%08x\n",
  1186. le32_to_cpu(SASConfigPage.Data_Cmd_OPNRJT_RTRY_THR));
  1187. pm8001_dbg(pm8001_ha, INIT, "SASConfigPage.MAX_AIP 0x%08x\n",
  1188. le32_to_cpu(SASConfigPage.MAX_AIP));
  1189. memcpy(&payload.cfg_pg, &SASConfigPage,
  1190. sizeof(SASProtocolTimerConfig_t));
  1191. rc = pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &payload,
  1192. sizeof(payload), 0);
  1193. if (rc)
  1194. pm8001_tag_free(pm8001_ha, tag);
  1195. return rc;
  1196. }
  1197. /**
  1198. * pm80xx_get_encrypt_info - Check for encryption
  1199. * @pm8001_ha: our hba card information.
  1200. */
  1201. static int
  1202. pm80xx_get_encrypt_info(struct pm8001_hba_info *pm8001_ha)
  1203. {
  1204. u32 scratch3_value;
  1205. int ret = -1;
  1206. /* Read encryption status from SCRATCH PAD 3 */
  1207. scratch3_value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_3);
  1208. if ((scratch3_value & SCRATCH_PAD3_ENC_MASK) ==
  1209. SCRATCH_PAD3_ENC_READY) {
  1210. if (scratch3_value & SCRATCH_PAD3_XTS_ENABLED)
  1211. pm8001_ha->encrypt_info.cipher_mode = CIPHER_MODE_XTS;
  1212. if ((scratch3_value & SCRATCH_PAD3_SM_MASK) ==
  1213. SCRATCH_PAD3_SMF_ENABLED)
  1214. pm8001_ha->encrypt_info.sec_mode = SEC_MODE_SMF;
  1215. if ((scratch3_value & SCRATCH_PAD3_SM_MASK) ==
  1216. SCRATCH_PAD3_SMA_ENABLED)
  1217. pm8001_ha->encrypt_info.sec_mode = SEC_MODE_SMA;
  1218. if ((scratch3_value & SCRATCH_PAD3_SM_MASK) ==
  1219. SCRATCH_PAD3_SMB_ENABLED)
  1220. pm8001_ha->encrypt_info.sec_mode = SEC_MODE_SMB;
  1221. pm8001_ha->encrypt_info.status = 0;
  1222. pm8001_dbg(pm8001_ha, INIT,
  1223. "Encryption: SCRATCH_PAD3_ENC_READY 0x%08X.Cipher mode 0x%x Sec mode 0x%x status 0x%x\n",
  1224. scratch3_value,
  1225. pm8001_ha->encrypt_info.cipher_mode,
  1226. pm8001_ha->encrypt_info.sec_mode,
  1227. pm8001_ha->encrypt_info.status);
  1228. ret = 0;
  1229. } else if ((scratch3_value & SCRATCH_PAD3_ENC_READY) ==
  1230. SCRATCH_PAD3_ENC_DISABLED) {
  1231. pm8001_dbg(pm8001_ha, INIT,
  1232. "Encryption: SCRATCH_PAD3_ENC_DISABLED 0x%08X\n",
  1233. scratch3_value);
  1234. pm8001_ha->encrypt_info.status = 0xFFFFFFFF;
  1235. pm8001_ha->encrypt_info.cipher_mode = 0;
  1236. pm8001_ha->encrypt_info.sec_mode = 0;
  1237. ret = 0;
  1238. } else if ((scratch3_value & SCRATCH_PAD3_ENC_MASK) ==
  1239. SCRATCH_PAD3_ENC_DIS_ERR) {
  1240. pm8001_ha->encrypt_info.status =
  1241. (scratch3_value & SCRATCH_PAD3_ERR_CODE) >> 16;
  1242. if (scratch3_value & SCRATCH_PAD3_XTS_ENABLED)
  1243. pm8001_ha->encrypt_info.cipher_mode = CIPHER_MODE_XTS;
  1244. if ((scratch3_value & SCRATCH_PAD3_SM_MASK) ==
  1245. SCRATCH_PAD3_SMF_ENABLED)
  1246. pm8001_ha->encrypt_info.sec_mode = SEC_MODE_SMF;
  1247. if ((scratch3_value & SCRATCH_PAD3_SM_MASK) ==
  1248. SCRATCH_PAD3_SMA_ENABLED)
  1249. pm8001_ha->encrypt_info.sec_mode = SEC_MODE_SMA;
  1250. if ((scratch3_value & SCRATCH_PAD3_SM_MASK) ==
  1251. SCRATCH_PAD3_SMB_ENABLED)
  1252. pm8001_ha->encrypt_info.sec_mode = SEC_MODE_SMB;
  1253. pm8001_dbg(pm8001_ha, INIT,
  1254. "Encryption: SCRATCH_PAD3_DIS_ERR 0x%08X.Cipher mode 0x%x sec mode 0x%x status 0x%x\n",
  1255. scratch3_value,
  1256. pm8001_ha->encrypt_info.cipher_mode,
  1257. pm8001_ha->encrypt_info.sec_mode,
  1258. pm8001_ha->encrypt_info.status);
  1259. } else if ((scratch3_value & SCRATCH_PAD3_ENC_MASK) ==
  1260. SCRATCH_PAD3_ENC_ENA_ERR) {
  1261. pm8001_ha->encrypt_info.status =
  1262. (scratch3_value & SCRATCH_PAD3_ERR_CODE) >> 16;
  1263. if (scratch3_value & SCRATCH_PAD3_XTS_ENABLED)
  1264. pm8001_ha->encrypt_info.cipher_mode = CIPHER_MODE_XTS;
  1265. if ((scratch3_value & SCRATCH_PAD3_SM_MASK) ==
  1266. SCRATCH_PAD3_SMF_ENABLED)
  1267. pm8001_ha->encrypt_info.sec_mode = SEC_MODE_SMF;
  1268. if ((scratch3_value & SCRATCH_PAD3_SM_MASK) ==
  1269. SCRATCH_PAD3_SMA_ENABLED)
  1270. pm8001_ha->encrypt_info.sec_mode = SEC_MODE_SMA;
  1271. if ((scratch3_value & SCRATCH_PAD3_SM_MASK) ==
  1272. SCRATCH_PAD3_SMB_ENABLED)
  1273. pm8001_ha->encrypt_info.sec_mode = SEC_MODE_SMB;
  1274. pm8001_dbg(pm8001_ha, INIT,
  1275. "Encryption: SCRATCH_PAD3_ENA_ERR 0x%08X.Cipher mode 0x%x sec mode 0x%x status 0x%x\n",
  1276. scratch3_value,
  1277. pm8001_ha->encrypt_info.cipher_mode,
  1278. pm8001_ha->encrypt_info.sec_mode,
  1279. pm8001_ha->encrypt_info.status);
  1280. }
  1281. return ret;
  1282. }
  1283. /**
  1284. * pm80xx_encrypt_update - update flash with encryption information
  1285. * @pm8001_ha: our hba card information.
  1286. */
  1287. static int pm80xx_encrypt_update(struct pm8001_hba_info *pm8001_ha)
  1288. {
  1289. struct kek_mgmt_req payload;
  1290. int rc;
  1291. u32 tag;
  1292. u32 opc = OPC_INB_KEK_MANAGEMENT;
  1293. memset(&payload, 0, sizeof(struct kek_mgmt_req));
  1294. rc = pm8001_tag_alloc(pm8001_ha, &tag);
  1295. if (rc)
  1296. return rc;
  1297. payload.tag = cpu_to_le32(tag);
  1298. /* Currently only one key is used. New KEK index is 1.
  1299. * Current KEK index is 1. Store KEK to NVRAM is 1.
  1300. */
  1301. payload.new_curidx_ksop =
  1302. cpu_to_le32(((1 << 24) | (1 << 16) | (1 << 8) |
  1303. KEK_MGMT_SUBOP_KEYCARDUPDATE));
  1304. pm8001_dbg(pm8001_ha, DEV,
  1305. "Saving Encryption info to flash. payload 0x%x\n",
  1306. le32_to_cpu(payload.new_curidx_ksop));
  1307. rc = pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &payload,
  1308. sizeof(payload), 0);
  1309. if (rc)
  1310. pm8001_tag_free(pm8001_ha, tag);
  1311. return rc;
  1312. }
  1313. /**
  1314. * pm80xx_chip_init - the main init function that initializes whole PM8001 chip.
  1315. * @pm8001_ha: our hba card information
  1316. */
  1317. static int pm80xx_chip_init(struct pm8001_hba_info *pm8001_ha)
  1318. {
  1319. int ret;
  1320. u8 i = 0;
  1321. /* check the firmware status */
  1322. if (-1 == check_fw_ready(pm8001_ha)) {
  1323. pm8001_dbg(pm8001_ha, FAIL, "Firmware is not ready!\n");
  1324. return -EBUSY;
  1325. }
  1326. /* Initialize the controller fatal error flag */
  1327. pm8001_ha->controller_fatal_error = false;
  1328. /* Initialize pci space address eg: mpi offset */
  1329. ret = init_pci_device_addresses(pm8001_ha);
  1330. if (ret) {
  1331. pm8001_dbg(pm8001_ha, FAIL,
  1332. "Failed to init pci addresses");
  1333. return ret;
  1334. }
  1335. init_default_table_values(pm8001_ha);
  1336. read_main_config_table(pm8001_ha);
  1337. read_general_status_table(pm8001_ha);
  1338. read_inbnd_queue_table(pm8001_ha);
  1339. read_outbnd_queue_table(pm8001_ha);
  1340. read_phy_attr_table(pm8001_ha);
  1341. /* update main config table ,inbound table and outbound table */
  1342. update_main_config_table(pm8001_ha);
  1343. for (i = 0; i < pm8001_ha->max_q_num; i++) {
  1344. update_inbnd_queue_table(pm8001_ha, i);
  1345. update_outbnd_queue_table(pm8001_ha, i);
  1346. }
  1347. /* notify firmware update finished and check initialization status */
  1348. if (0 == mpi_init_check(pm8001_ha)) {
  1349. pm8001_dbg(pm8001_ha, INIT, "MPI initialize successful!\n");
  1350. } else
  1351. return -EBUSY;
  1352. return 0;
  1353. }
  1354. static void pm80xx_chip_post_init(struct pm8001_hba_info *pm8001_ha)
  1355. {
  1356. /* send SAS protocol timer configuration page to FW */
  1357. pm80xx_set_sas_protocol_timer_config(pm8001_ha);
  1358. /* Check for encryption */
  1359. if (pm8001_ha->chip->encrypt) {
  1360. int ret;
  1361. pm8001_dbg(pm8001_ha, INIT, "Checking for encryption\n");
  1362. ret = pm80xx_get_encrypt_info(pm8001_ha);
  1363. if (ret == -1) {
  1364. pm8001_dbg(pm8001_ha, INIT, "Encryption error !!\n");
  1365. if (pm8001_ha->encrypt_info.status == 0x81) {
  1366. pm8001_dbg(pm8001_ha, INIT,
  1367. "Encryption enabled with error.Saving encryption key to flash\n");
  1368. pm80xx_encrypt_update(pm8001_ha);
  1369. }
  1370. }
  1371. }
  1372. }
  1373. static int mpi_uninit_check(struct pm8001_hba_info *pm8001_ha)
  1374. {
  1375. u32 max_wait_count;
  1376. u32 value;
  1377. u32 gst_len_mpistate;
  1378. int ret;
  1379. ret = init_pci_device_addresses(pm8001_ha);
  1380. if (ret) {
  1381. pm8001_dbg(pm8001_ha, FAIL,
  1382. "Failed to init pci addresses");
  1383. return ret;
  1384. }
  1385. /* Write bit1=1 to Inbound DoorBell Register to tell the SPC FW the
  1386. table is stop */
  1387. pm8001_cw32(pm8001_ha, 0, MSGU_IBDB_SET, SPCv_MSGU_CFG_TABLE_RESET);
  1388. /* wait until Inbound DoorBell Clear Register toggled */
  1389. if (IS_SPCV_12G(pm8001_ha->pdev)) {
  1390. max_wait_count = SPCV_DOORBELL_CLEAR_TIMEOUT;
  1391. } else {
  1392. max_wait_count = SPC_DOORBELL_CLEAR_TIMEOUT;
  1393. }
  1394. do {
  1395. msleep(FW_READY_INTERVAL);
  1396. value = pm8001_cr32(pm8001_ha, 0, MSGU_IBDB_SET);
  1397. value &= SPCv_MSGU_CFG_TABLE_RESET;
  1398. } while ((value != 0) && (--max_wait_count));
  1399. if (!max_wait_count) {
  1400. pm8001_dbg(pm8001_ha, FAIL, "TIMEOUT:IBDB value/=%x\n", value);
  1401. return -1;
  1402. }
  1403. /* check the MPI-State for termination in progress */
  1404. /* wait until Inbound DoorBell Clear Register toggled */
  1405. max_wait_count = 100; /* 2 sec for spcv/ve */
  1406. do {
  1407. msleep(FW_READY_INTERVAL);
  1408. gst_len_mpistate =
  1409. pm8001_mr32(pm8001_ha->general_stat_tbl_addr,
  1410. GST_GSTLEN_MPIS_OFFSET);
  1411. if (GST_MPI_STATE_UNINIT ==
  1412. (gst_len_mpistate & GST_MPI_STATE_MASK))
  1413. break;
  1414. } while (--max_wait_count);
  1415. if (!max_wait_count) {
  1416. pm8001_dbg(pm8001_ha, FAIL, " TIME OUT MPI State = 0x%x\n",
  1417. gst_len_mpistate & GST_MPI_STATE_MASK);
  1418. return -1;
  1419. }
  1420. return 0;
  1421. }
  1422. /**
  1423. * pm80xx_fatal_errors - returns non-zero *ONLY* when fatal errors
  1424. * @pm8001_ha: our hba card information
  1425. *
  1426. * Fatal errors are recoverable only after a host reboot.
  1427. */
  1428. int
  1429. pm80xx_fatal_errors(struct pm8001_hba_info *pm8001_ha)
  1430. {
  1431. int ret = 0;
  1432. u32 scratch_pad_rsvd0 = pm8001_cr32(pm8001_ha, 0,
  1433. MSGU_SCRATCH_PAD_RSVD_0);
  1434. u32 scratch_pad_rsvd1 = pm8001_cr32(pm8001_ha, 0,
  1435. MSGU_SCRATCH_PAD_RSVD_1);
  1436. u32 scratch_pad1 = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1);
  1437. u32 scratch_pad2 = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_2);
  1438. u32 scratch_pad3 = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_3);
  1439. if (pm8001_ha->chip_id != chip_8006 &&
  1440. pm8001_ha->chip_id != chip_8074 &&
  1441. pm8001_ha->chip_id != chip_8076) {
  1442. return 0;
  1443. }
  1444. if (MSGU_SCRATCHPAD1_STATE_FATAL_ERROR(scratch_pad1)) {
  1445. pm8001_dbg(pm8001_ha, FAIL,
  1446. "Fatal error SCRATCHPAD1 = 0x%x SCRATCHPAD2 = 0x%x SCRATCHPAD3 = 0x%x SCRATCHPAD_RSVD0 = 0x%x SCRATCHPAD_RSVD1 = 0x%x\n",
  1447. scratch_pad1, scratch_pad2, scratch_pad3,
  1448. scratch_pad_rsvd0, scratch_pad_rsvd1);
  1449. ret = 1;
  1450. }
  1451. return ret;
  1452. }
  1453. /**
  1454. * pm80xx_chip_soft_rst - soft reset the PM8001 chip, so that all
  1455. * FW register status are reset to the originated status.
  1456. * @pm8001_ha: our hba card information
  1457. */
  1458. static int
  1459. pm80xx_chip_soft_rst(struct pm8001_hba_info *pm8001_ha)
  1460. {
  1461. u32 regval;
  1462. u32 bootloader_state;
  1463. u32 ibutton0, ibutton1;
  1464. /* Process MPI table uninitialization only if FW is ready */
  1465. if (!pm8001_ha->controller_fatal_error) {
  1466. /* Check if MPI is in ready state to reset */
  1467. if (mpi_uninit_check(pm8001_ha) != 0) {
  1468. u32 r0 = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_0);
  1469. u32 r1 = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1);
  1470. u32 r2 = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_2);
  1471. u32 r3 = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_3);
  1472. pm8001_dbg(pm8001_ha, FAIL,
  1473. "MPI state is not ready scratch: %x:%x:%x:%x\n",
  1474. r0, r1, r2, r3);
  1475. /* if things aren't ready but the bootloader is ok then
  1476. * try the reset anyway.
  1477. */
  1478. if (r1 & SCRATCH_PAD1_BOOTSTATE_MASK)
  1479. return -1;
  1480. }
  1481. }
  1482. /* checked for reset register normal state; 0x0 */
  1483. regval = pm8001_cr32(pm8001_ha, 0, SPC_REG_SOFT_RESET);
  1484. pm8001_dbg(pm8001_ha, INIT, "reset register before write : 0x%x\n",
  1485. regval);
  1486. pm8001_cw32(pm8001_ha, 0, SPC_REG_SOFT_RESET, SPCv_NORMAL_RESET_VALUE);
  1487. msleep(500);
  1488. regval = pm8001_cr32(pm8001_ha, 0, SPC_REG_SOFT_RESET);
  1489. pm8001_dbg(pm8001_ha, INIT, "reset register after write 0x%x\n",
  1490. regval);
  1491. if ((regval & SPCv_SOFT_RESET_READ_MASK) ==
  1492. SPCv_SOFT_RESET_NORMAL_RESET_OCCURED) {
  1493. pm8001_dbg(pm8001_ha, MSG,
  1494. " soft reset successful [regval: 0x%x]\n",
  1495. regval);
  1496. } else {
  1497. pm8001_dbg(pm8001_ha, MSG,
  1498. " soft reset failed [regval: 0x%x]\n",
  1499. regval);
  1500. /* check bootloader is successfully executed or in HDA mode */
  1501. bootloader_state =
  1502. pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1) &
  1503. SCRATCH_PAD1_BOOTSTATE_MASK;
  1504. if (bootloader_state == SCRATCH_PAD1_BOOTSTATE_HDA_SEEPROM) {
  1505. pm8001_dbg(pm8001_ha, MSG,
  1506. "Bootloader state - HDA mode SEEPROM\n");
  1507. } else if (bootloader_state ==
  1508. SCRATCH_PAD1_BOOTSTATE_HDA_BOOTSTRAP) {
  1509. pm8001_dbg(pm8001_ha, MSG,
  1510. "Bootloader state - HDA mode Bootstrap Pin\n");
  1511. } else if (bootloader_state ==
  1512. SCRATCH_PAD1_BOOTSTATE_HDA_SOFTRESET) {
  1513. pm8001_dbg(pm8001_ha, MSG,
  1514. "Bootloader state - HDA mode soft reset\n");
  1515. } else if (bootloader_state ==
  1516. SCRATCH_PAD1_BOOTSTATE_CRIT_ERROR) {
  1517. pm8001_dbg(pm8001_ha, MSG,
  1518. "Bootloader state-HDA mode critical error\n");
  1519. }
  1520. return -EBUSY;
  1521. }
  1522. /* check the firmware status after reset */
  1523. if (-1 == check_fw_ready(pm8001_ha)) {
  1524. pm8001_dbg(pm8001_ha, FAIL, "Firmware is not ready!\n");
  1525. /* check iButton feature support for motherboard controller */
  1526. if (pm8001_ha->pdev->subsystem_vendor !=
  1527. PCI_VENDOR_ID_ADAPTEC2 &&
  1528. pm8001_ha->pdev->subsystem_vendor !=
  1529. PCI_VENDOR_ID_ATTO &&
  1530. pm8001_ha->pdev->subsystem_vendor != 0) {
  1531. ibutton0 = pm8001_cr32(pm8001_ha, 0,
  1532. MSGU_SCRATCH_PAD_RSVD_0);
  1533. ibutton1 = pm8001_cr32(pm8001_ha, 0,
  1534. MSGU_SCRATCH_PAD_RSVD_1);
  1535. if (!ibutton0 && !ibutton1) {
  1536. pm8001_dbg(pm8001_ha, FAIL,
  1537. "iButton Feature is not Available!!!\n");
  1538. return -EBUSY;
  1539. }
  1540. if (ibutton0 == 0xdeadbeef && ibutton1 == 0xdeadbeef) {
  1541. pm8001_dbg(pm8001_ha, FAIL,
  1542. "CRC Check for iButton Feature Failed!!!\n");
  1543. return -EBUSY;
  1544. }
  1545. }
  1546. }
  1547. pm8001_dbg(pm8001_ha, INIT, "SPCv soft reset Complete\n");
  1548. return 0;
  1549. }
  1550. static void pm80xx_hw_chip_rst(struct pm8001_hba_info *pm8001_ha)
  1551. {
  1552. u32 i;
  1553. pm8001_dbg(pm8001_ha, INIT, "chip reset start\n");
  1554. /* do SPCv chip reset. */
  1555. pm8001_cw32(pm8001_ha, 0, SPC_REG_SOFT_RESET, 0x11);
  1556. pm8001_dbg(pm8001_ha, INIT, "SPC soft reset Complete\n");
  1557. /* Check this ..whether delay is required or no */
  1558. /* delay 10 usec */
  1559. udelay(10);
  1560. /* wait for 20 msec until the firmware gets reloaded */
  1561. i = 20;
  1562. do {
  1563. mdelay(1);
  1564. } while ((--i) != 0);
  1565. pm8001_dbg(pm8001_ha, INIT, "chip reset finished\n");
  1566. }
  1567. /**
  1568. * pm80xx_chip_intx_interrupt_enable - enable PM8001 chip interrupt
  1569. * @pm8001_ha: our hba card information
  1570. */
  1571. static void
  1572. pm80xx_chip_intx_interrupt_enable(struct pm8001_hba_info *pm8001_ha)
  1573. {
  1574. pm8001_cw32(pm8001_ha, 0, MSGU_ODMR, ODMR_CLEAR_ALL);
  1575. pm8001_cw32(pm8001_ha, 0, MSGU_ODCR, ODCR_CLEAR_ALL);
  1576. }
  1577. /**
  1578. * pm80xx_chip_intx_interrupt_disable - disable PM8001 chip interrupt
  1579. * @pm8001_ha: our hba card information
  1580. */
  1581. static void
  1582. pm80xx_chip_intx_interrupt_disable(struct pm8001_hba_info *pm8001_ha)
  1583. {
  1584. pm8001_cw32(pm8001_ha, 0, MSGU_ODMR_CLR, ODMR_MASK_ALL);
  1585. }
  1586. /**
  1587. * pm80xx_chip_interrupt_enable - enable PM8001 chip interrupt
  1588. * @pm8001_ha: our hba card information
  1589. * @vec: interrupt number to enable
  1590. */
  1591. static void
  1592. pm80xx_chip_interrupt_enable(struct pm8001_hba_info *pm8001_ha, u8 vec)
  1593. {
  1594. #ifdef PM8001_USE_MSIX
  1595. if (vec < 32)
  1596. pm8001_cw32(pm8001_ha, 0, MSGU_ODMR_CLR, 1U << vec);
  1597. else
  1598. pm8001_cw32(pm8001_ha, 0, MSGU_ODMR_CLR_U,
  1599. 1U << (vec - 32));
  1600. return;
  1601. #endif
  1602. pm80xx_chip_intx_interrupt_enable(pm8001_ha);
  1603. }
  1604. /**
  1605. * pm80xx_chip_interrupt_disable - disable PM8001 chip interrupt
  1606. * @pm8001_ha: our hba card information
  1607. * @vec: interrupt number to disable
  1608. */
  1609. static void
  1610. pm80xx_chip_interrupt_disable(struct pm8001_hba_info *pm8001_ha, u8 vec)
  1611. {
  1612. #ifdef PM8001_USE_MSIX
  1613. if (vec == 0xFF) {
  1614. /* disable all vectors 0-31, 32-63 */
  1615. pm8001_cw32(pm8001_ha, 0, MSGU_ODMR, 0xFFFFFFFF);
  1616. pm8001_cw32(pm8001_ha, 0, MSGU_ODMR_U, 0xFFFFFFFF);
  1617. } else if (vec < 32)
  1618. pm8001_cw32(pm8001_ha, 0, MSGU_ODMR, 1U << vec);
  1619. else
  1620. pm8001_cw32(pm8001_ha, 0, MSGU_ODMR_U,
  1621. 1U << (vec - 32));
  1622. return;
  1623. #endif
  1624. pm80xx_chip_intx_interrupt_disable(pm8001_ha);
  1625. }
  1626. static void pm80xx_send_abort_all(struct pm8001_hba_info *pm8001_ha,
  1627. struct pm8001_device *pm8001_ha_dev)
  1628. {
  1629. struct pm8001_ccb_info *ccb;
  1630. struct sas_task *task;
  1631. struct task_abort_req task_abort;
  1632. u32 opc = OPC_INB_SATA_ABORT;
  1633. int ret;
  1634. pm8001_ha_dev->id |= NCQ_ABORT_ALL_FLAG;
  1635. pm8001_ha_dev->id &= ~NCQ_READ_LOG_FLAG;
  1636. task = sas_alloc_slow_task(GFP_ATOMIC);
  1637. if (!task) {
  1638. pm8001_dbg(pm8001_ha, FAIL, "cannot allocate task\n");
  1639. return;
  1640. }
  1641. task->task_done = pm8001_task_done;
  1642. ccb = pm8001_ccb_alloc(pm8001_ha, pm8001_ha_dev, task);
  1643. if (!ccb) {
  1644. sas_free_task(task);
  1645. return;
  1646. }
  1647. memset(&task_abort, 0, sizeof(task_abort));
  1648. task_abort.abort_all = cpu_to_le32(1);
  1649. task_abort.device_id = cpu_to_le32(pm8001_ha_dev->device_id);
  1650. task_abort.tag = cpu_to_le32(ccb->ccb_tag);
  1651. ret = pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &task_abort,
  1652. sizeof(task_abort), 0);
  1653. pm8001_dbg(pm8001_ha, FAIL, "Executing abort task end\n");
  1654. if (ret) {
  1655. sas_free_task(task);
  1656. pm8001_ccb_free(pm8001_ha, ccb);
  1657. }
  1658. }
  1659. static void pm80xx_send_read_log(struct pm8001_hba_info *pm8001_ha,
  1660. struct pm8001_device *pm8001_ha_dev)
  1661. {
  1662. struct sata_start_req sata_cmd;
  1663. int res;
  1664. struct pm8001_ccb_info *ccb;
  1665. struct sas_task *task = NULL;
  1666. struct host_to_dev_fis fis;
  1667. struct domain_device *dev;
  1668. u32 opc = OPC_INB_SATA_HOST_OPSTART;
  1669. task = sas_alloc_slow_task(GFP_ATOMIC);
  1670. if (!task) {
  1671. pm8001_dbg(pm8001_ha, FAIL, "cannot allocate task !!!\n");
  1672. return;
  1673. }
  1674. task->task_done = pm8001_task_done;
  1675. /*
  1676. * Allocate domain device by ourselves as libsas is not going to
  1677. * provide any.
  1678. */
  1679. dev = kzalloc(sizeof(struct domain_device), GFP_ATOMIC);
  1680. if (!dev) {
  1681. sas_free_task(task);
  1682. pm8001_dbg(pm8001_ha, FAIL,
  1683. "Domain device cannot be allocated\n");
  1684. return;
  1685. }
  1686. task->dev = dev;
  1687. task->dev->lldd_dev = pm8001_ha_dev;
  1688. ccb = pm8001_ccb_alloc(pm8001_ha, pm8001_ha_dev, task);
  1689. if (!ccb) {
  1690. sas_free_task(task);
  1691. kfree(dev);
  1692. return;
  1693. }
  1694. pm8001_ha_dev->id |= NCQ_READ_LOG_FLAG;
  1695. pm8001_ha_dev->id |= NCQ_2ND_RLE_FLAG;
  1696. memset(&sata_cmd, 0, sizeof(sata_cmd));
  1697. /* construct read log FIS */
  1698. memset(&fis, 0, sizeof(struct host_to_dev_fis));
  1699. fis.fis_type = 0x27;
  1700. fis.flags = 0x80;
  1701. fis.command = ATA_CMD_READ_LOG_EXT;
  1702. fis.lbal = 0x10;
  1703. fis.sector_count = 0x1;
  1704. sata_cmd.tag = cpu_to_le32(ccb->ccb_tag);
  1705. sata_cmd.device_id = cpu_to_le32(pm8001_ha_dev->device_id);
  1706. sata_cmd.ncqtag_atap_dir_m_dad = cpu_to_le32(((0x1 << 7) | (0x5 << 9)));
  1707. memcpy(&sata_cmd.sata_fis, &fis, sizeof(struct host_to_dev_fis));
  1708. res = pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &sata_cmd,
  1709. sizeof(sata_cmd), 0);
  1710. pm8001_dbg(pm8001_ha, FAIL, "Executing read log end\n");
  1711. if (res) {
  1712. sas_free_task(task);
  1713. pm8001_ccb_free(pm8001_ha, ccb);
  1714. kfree(dev);
  1715. }
  1716. }
  1717. /**
  1718. * mpi_ssp_completion - process the event that FW response to the SSP request.
  1719. * @pm8001_ha: our hba card information
  1720. * @piomb: the message contents of this outbound message.
  1721. *
  1722. * When FW has completed a ssp request for example a IO request, after it has
  1723. * filled the SG data with the data, it will trigger this event representing
  1724. * that he has finished the job; please check the corresponding buffer.
  1725. * So we will tell the caller who maybe waiting the result to tell upper layer
  1726. * that the task has been finished.
  1727. */
  1728. static void
  1729. mpi_ssp_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
  1730. {
  1731. struct sas_task *t;
  1732. struct pm8001_ccb_info *ccb;
  1733. unsigned long flags;
  1734. u32 status;
  1735. u32 param;
  1736. u32 tag;
  1737. struct ssp_completion_resp *psspPayload;
  1738. struct task_status_struct *ts;
  1739. struct ssp_response_iu *iu;
  1740. struct pm8001_device *pm8001_dev;
  1741. psspPayload = (struct ssp_completion_resp *)(piomb + 4);
  1742. status = le32_to_cpu(psspPayload->status);
  1743. tag = le32_to_cpu(psspPayload->tag);
  1744. ccb = &pm8001_ha->ccb_info[tag];
  1745. if ((status == IO_ABORTED) && ccb->open_retry) {
  1746. /* Being completed by another */
  1747. ccb->open_retry = 0;
  1748. return;
  1749. }
  1750. pm8001_dev = ccb->device;
  1751. param = le32_to_cpu(psspPayload->param);
  1752. t = ccb->task;
  1753. if (status && status != IO_UNDERFLOW)
  1754. pm8001_dbg(pm8001_ha, FAIL, "sas IO status 0x%x\n", status);
  1755. if (unlikely(!t || !t->lldd_task || !t->dev))
  1756. return;
  1757. ts = &t->task_status;
  1758. pm8001_dbg(pm8001_ha, DEV,
  1759. "tag::0x%x, status::0x%x task::0x%p\n", tag, status, t);
  1760. /* Print sas address of IO failed device */
  1761. if ((status != IO_SUCCESS) && (status != IO_OVERFLOW) &&
  1762. (status != IO_UNDERFLOW))
  1763. pm8001_dbg(pm8001_ha, FAIL, "SAS Address of IO Failure Drive:%016llx\n",
  1764. SAS_ADDR(t->dev->sas_addr));
  1765. switch (status) {
  1766. case IO_SUCCESS:
  1767. pm8001_dbg(pm8001_ha, IO, "IO_SUCCESS ,param = 0x%x\n",
  1768. param);
  1769. if (param == 0) {
  1770. ts->resp = SAS_TASK_COMPLETE;
  1771. ts->stat = SAS_SAM_STAT_GOOD;
  1772. } else {
  1773. ts->resp = SAS_TASK_COMPLETE;
  1774. ts->stat = SAS_PROTO_RESPONSE;
  1775. ts->residual = param;
  1776. iu = &psspPayload->ssp_resp_iu;
  1777. sas_ssp_task_response(pm8001_ha->dev, t, iu);
  1778. }
  1779. if (pm8001_dev)
  1780. atomic_dec(&pm8001_dev->running_req);
  1781. break;
  1782. case IO_ABORTED:
  1783. pm8001_dbg(pm8001_ha, IO, "IO_ABORTED IOMB Tag\n");
  1784. ts->resp = SAS_TASK_COMPLETE;
  1785. ts->stat = SAS_ABORTED_TASK;
  1786. if (pm8001_dev)
  1787. atomic_dec(&pm8001_dev->running_req);
  1788. break;
  1789. case IO_UNDERFLOW:
  1790. /* SSP Completion with error */
  1791. pm8001_dbg(pm8001_ha, IO, "IO_UNDERFLOW ,param = 0x%x\n",
  1792. param);
  1793. ts->resp = SAS_TASK_COMPLETE;
  1794. ts->stat = SAS_DATA_UNDERRUN;
  1795. ts->residual = param;
  1796. if (pm8001_dev)
  1797. atomic_dec(&pm8001_dev->running_req);
  1798. break;
  1799. case IO_NO_DEVICE:
  1800. pm8001_dbg(pm8001_ha, IO, "IO_NO_DEVICE\n");
  1801. ts->resp = SAS_TASK_UNDELIVERED;
  1802. ts->stat = SAS_PHY_DOWN;
  1803. if (pm8001_dev)
  1804. atomic_dec(&pm8001_dev->running_req);
  1805. break;
  1806. case IO_XFER_ERROR_BREAK:
  1807. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_BREAK\n");
  1808. ts->resp = SAS_TASK_COMPLETE;
  1809. ts->stat = SAS_OPEN_REJECT;
  1810. /* Force the midlayer to retry */
  1811. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  1812. if (pm8001_dev)
  1813. atomic_dec(&pm8001_dev->running_req);
  1814. break;
  1815. case IO_XFER_ERROR_PHY_NOT_READY:
  1816. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_PHY_NOT_READY\n");
  1817. ts->resp = SAS_TASK_COMPLETE;
  1818. ts->stat = SAS_OPEN_REJECT;
  1819. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  1820. if (pm8001_dev)
  1821. atomic_dec(&pm8001_dev->running_req);
  1822. break;
  1823. case IO_XFER_ERROR_INVALID_SSP_RSP_FRAME:
  1824. pm8001_dbg(pm8001_ha, IO,
  1825. "IO_XFER_ERROR_INVALID_SSP_RSP_FRAME\n");
  1826. ts->resp = SAS_TASK_COMPLETE;
  1827. ts->stat = SAS_OPEN_REJECT;
  1828. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  1829. if (pm8001_dev)
  1830. atomic_dec(&pm8001_dev->running_req);
  1831. break;
  1832. case IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
  1833. pm8001_dbg(pm8001_ha, IO,
  1834. "IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED\n");
  1835. ts->resp = SAS_TASK_COMPLETE;
  1836. ts->stat = SAS_OPEN_REJECT;
  1837. ts->open_rej_reason = SAS_OREJ_EPROTO;
  1838. if (pm8001_dev)
  1839. atomic_dec(&pm8001_dev->running_req);
  1840. break;
  1841. case IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
  1842. pm8001_dbg(pm8001_ha, IO,
  1843. "IO_OPEN_CNX_ERROR_ZONE_VIOLATION\n");
  1844. ts->resp = SAS_TASK_COMPLETE;
  1845. ts->stat = SAS_OPEN_REJECT;
  1846. ts->open_rej_reason = SAS_OREJ_UNKNOWN;
  1847. if (pm8001_dev)
  1848. atomic_dec(&pm8001_dev->running_req);
  1849. break;
  1850. case IO_OPEN_CNX_ERROR_BREAK:
  1851. pm8001_dbg(pm8001_ha, IO, "IO_OPEN_CNX_ERROR_BREAK\n");
  1852. ts->resp = SAS_TASK_COMPLETE;
  1853. ts->stat = SAS_OPEN_REJECT;
  1854. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  1855. if (pm8001_dev)
  1856. atomic_dec(&pm8001_dev->running_req);
  1857. break;
  1858. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
  1859. case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
  1860. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
  1861. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
  1862. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
  1863. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
  1864. pm8001_dbg(pm8001_ha, IO, "IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS\n");
  1865. ts->resp = SAS_TASK_COMPLETE;
  1866. ts->stat = SAS_OPEN_REJECT;
  1867. ts->open_rej_reason = SAS_OREJ_UNKNOWN;
  1868. if (!t->uldd_task)
  1869. pm8001_handle_event(pm8001_ha,
  1870. pm8001_dev,
  1871. IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
  1872. break;
  1873. case IO_OPEN_CNX_ERROR_BAD_DESTINATION:
  1874. pm8001_dbg(pm8001_ha, IO,
  1875. "IO_OPEN_CNX_ERROR_BAD_DESTINATION\n");
  1876. ts->resp = SAS_TASK_COMPLETE;
  1877. ts->stat = SAS_OPEN_REJECT;
  1878. ts->open_rej_reason = SAS_OREJ_BAD_DEST;
  1879. if (pm8001_dev)
  1880. atomic_dec(&pm8001_dev->running_req);
  1881. break;
  1882. case IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
  1883. pm8001_dbg(pm8001_ha, IO,
  1884. "IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED\n");
  1885. ts->resp = SAS_TASK_COMPLETE;
  1886. ts->stat = SAS_OPEN_REJECT;
  1887. ts->open_rej_reason = SAS_OREJ_CONN_RATE;
  1888. if (pm8001_dev)
  1889. atomic_dec(&pm8001_dev->running_req);
  1890. break;
  1891. case IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
  1892. pm8001_dbg(pm8001_ha, IO,
  1893. "IO_OPEN_CNX_ERROR_WRONG_DESTINATION\n");
  1894. ts->resp = SAS_TASK_UNDELIVERED;
  1895. ts->stat = SAS_OPEN_REJECT;
  1896. ts->open_rej_reason = SAS_OREJ_WRONG_DEST;
  1897. if (pm8001_dev)
  1898. atomic_dec(&pm8001_dev->running_req);
  1899. break;
  1900. case IO_XFER_ERROR_NAK_RECEIVED:
  1901. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_NAK_RECEIVED\n");
  1902. ts->resp = SAS_TASK_COMPLETE;
  1903. ts->stat = SAS_OPEN_REJECT;
  1904. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  1905. if (pm8001_dev)
  1906. atomic_dec(&pm8001_dev->running_req);
  1907. break;
  1908. case IO_XFER_ERROR_ACK_NAK_TIMEOUT:
  1909. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_ACK_NAK_TIMEOUT\n");
  1910. ts->resp = SAS_TASK_COMPLETE;
  1911. ts->stat = SAS_NAK_R_ERR;
  1912. if (pm8001_dev)
  1913. atomic_dec(&pm8001_dev->running_req);
  1914. break;
  1915. case IO_XFER_ERROR_DMA:
  1916. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_DMA\n");
  1917. ts->resp = SAS_TASK_COMPLETE;
  1918. ts->stat = SAS_OPEN_REJECT;
  1919. if (pm8001_dev)
  1920. atomic_dec(&pm8001_dev->running_req);
  1921. break;
  1922. case IO_XFER_OPEN_RETRY_TIMEOUT:
  1923. pm8001_dbg(pm8001_ha, IO, "IO_XFER_OPEN_RETRY_TIMEOUT\n");
  1924. ts->resp = SAS_TASK_COMPLETE;
  1925. ts->stat = SAS_OPEN_REJECT;
  1926. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  1927. if (pm8001_dev)
  1928. atomic_dec(&pm8001_dev->running_req);
  1929. break;
  1930. case IO_XFER_ERROR_OFFSET_MISMATCH:
  1931. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_OFFSET_MISMATCH\n");
  1932. ts->resp = SAS_TASK_COMPLETE;
  1933. ts->stat = SAS_OPEN_REJECT;
  1934. if (pm8001_dev)
  1935. atomic_dec(&pm8001_dev->running_req);
  1936. break;
  1937. case IO_PORT_IN_RESET:
  1938. pm8001_dbg(pm8001_ha, IO, "IO_PORT_IN_RESET\n");
  1939. ts->resp = SAS_TASK_COMPLETE;
  1940. ts->stat = SAS_OPEN_REJECT;
  1941. if (pm8001_dev)
  1942. atomic_dec(&pm8001_dev->running_req);
  1943. break;
  1944. case IO_DS_NON_OPERATIONAL:
  1945. pm8001_dbg(pm8001_ha, IO, "IO_DS_NON_OPERATIONAL\n");
  1946. ts->resp = SAS_TASK_COMPLETE;
  1947. ts->stat = SAS_OPEN_REJECT;
  1948. if (!t->uldd_task)
  1949. pm8001_handle_event(pm8001_ha,
  1950. pm8001_dev,
  1951. IO_DS_NON_OPERATIONAL);
  1952. break;
  1953. case IO_DS_IN_RECOVERY:
  1954. pm8001_dbg(pm8001_ha, IO, "IO_DS_IN_RECOVERY\n");
  1955. ts->resp = SAS_TASK_COMPLETE;
  1956. ts->stat = SAS_OPEN_REJECT;
  1957. if (pm8001_dev)
  1958. atomic_dec(&pm8001_dev->running_req);
  1959. break;
  1960. case IO_TM_TAG_NOT_FOUND:
  1961. pm8001_dbg(pm8001_ha, IO, "IO_TM_TAG_NOT_FOUND\n");
  1962. ts->resp = SAS_TASK_COMPLETE;
  1963. ts->stat = SAS_OPEN_REJECT;
  1964. if (pm8001_dev)
  1965. atomic_dec(&pm8001_dev->running_req);
  1966. break;
  1967. case IO_SSP_EXT_IU_ZERO_LEN_ERROR:
  1968. pm8001_dbg(pm8001_ha, IO, "IO_SSP_EXT_IU_ZERO_LEN_ERROR\n");
  1969. ts->resp = SAS_TASK_COMPLETE;
  1970. ts->stat = SAS_OPEN_REJECT;
  1971. if (pm8001_dev)
  1972. atomic_dec(&pm8001_dev->running_req);
  1973. break;
  1974. case IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY:
  1975. pm8001_dbg(pm8001_ha, IO,
  1976. "IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY\n");
  1977. ts->resp = SAS_TASK_COMPLETE;
  1978. ts->stat = SAS_OPEN_REJECT;
  1979. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  1980. if (pm8001_dev)
  1981. atomic_dec(&pm8001_dev->running_req);
  1982. break;
  1983. default:
  1984. pm8001_dbg(pm8001_ha, DEVIO, "Unknown status 0x%x\n", status);
  1985. /* not allowed case. Therefore, return failed status */
  1986. ts->resp = SAS_TASK_COMPLETE;
  1987. ts->stat = SAS_OPEN_REJECT;
  1988. if (pm8001_dev)
  1989. atomic_dec(&pm8001_dev->running_req);
  1990. break;
  1991. }
  1992. pm8001_dbg(pm8001_ha, IO, "scsi_status = 0x%x\n ",
  1993. psspPayload->ssp_resp_iu.status);
  1994. spin_lock_irqsave(&t->task_state_lock, flags);
  1995. t->task_state_flags &= ~SAS_TASK_STATE_PENDING;
  1996. t->task_state_flags |= SAS_TASK_STATE_DONE;
  1997. if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) {
  1998. spin_unlock_irqrestore(&t->task_state_lock, flags);
  1999. pm8001_dbg(pm8001_ha, FAIL,
  2000. "task 0x%p done with io_status 0x%x resp 0x%x stat 0x%x but aborted by upper layer!\n",
  2001. t, status, ts->resp, ts->stat);
  2002. pm8001_ccb_task_free(pm8001_ha, ccb);
  2003. if (t->slow_task)
  2004. complete(&t->slow_task->completion);
  2005. } else {
  2006. spin_unlock_irqrestore(&t->task_state_lock, flags);
  2007. pm8001_ccb_task_free_done(pm8001_ha, ccb);
  2008. }
  2009. }
  2010. /*See the comments for mpi_ssp_completion */
  2011. static void mpi_ssp_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
  2012. {
  2013. struct sas_task *t;
  2014. unsigned long flags;
  2015. struct task_status_struct *ts;
  2016. struct pm8001_ccb_info *ccb;
  2017. struct pm8001_device *pm8001_dev;
  2018. struct ssp_event_resp *psspPayload =
  2019. (struct ssp_event_resp *)(piomb + 4);
  2020. u32 event = le32_to_cpu(psspPayload->event);
  2021. u32 tag = le32_to_cpu(psspPayload->tag);
  2022. u32 port_id = le32_to_cpu(psspPayload->port_id);
  2023. ccb = &pm8001_ha->ccb_info[tag];
  2024. t = ccb->task;
  2025. pm8001_dev = ccb->device;
  2026. if (event)
  2027. pm8001_dbg(pm8001_ha, FAIL, "sas IO status 0x%x\n", event);
  2028. if (unlikely(!t || !t->lldd_task || !t->dev))
  2029. return;
  2030. ts = &t->task_status;
  2031. pm8001_dbg(pm8001_ha, IOERR, "port_id:0x%x, tag:0x%x, event:0x%x\n",
  2032. port_id, tag, event);
  2033. switch (event) {
  2034. case IO_OVERFLOW:
  2035. pm8001_dbg(pm8001_ha, IO, "IO_UNDERFLOW\n");
  2036. ts->resp = SAS_TASK_COMPLETE;
  2037. ts->stat = SAS_DATA_OVERRUN;
  2038. ts->residual = 0;
  2039. if (pm8001_dev)
  2040. atomic_dec(&pm8001_dev->running_req);
  2041. break;
  2042. case IO_XFER_ERROR_BREAK:
  2043. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_BREAK\n");
  2044. pm8001_handle_event(pm8001_ha, t, IO_XFER_ERROR_BREAK);
  2045. return;
  2046. case IO_XFER_ERROR_PHY_NOT_READY:
  2047. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_PHY_NOT_READY\n");
  2048. ts->resp = SAS_TASK_COMPLETE;
  2049. ts->stat = SAS_OPEN_REJECT;
  2050. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  2051. break;
  2052. case IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
  2053. pm8001_dbg(pm8001_ha, IO,
  2054. "IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED\n");
  2055. ts->resp = SAS_TASK_COMPLETE;
  2056. ts->stat = SAS_OPEN_REJECT;
  2057. ts->open_rej_reason = SAS_OREJ_EPROTO;
  2058. break;
  2059. case IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
  2060. pm8001_dbg(pm8001_ha, IO,
  2061. "IO_OPEN_CNX_ERROR_ZONE_VIOLATION\n");
  2062. ts->resp = SAS_TASK_COMPLETE;
  2063. ts->stat = SAS_OPEN_REJECT;
  2064. ts->open_rej_reason = SAS_OREJ_UNKNOWN;
  2065. break;
  2066. case IO_OPEN_CNX_ERROR_BREAK:
  2067. pm8001_dbg(pm8001_ha, IO, "IO_OPEN_CNX_ERROR_BREAK\n");
  2068. ts->resp = SAS_TASK_COMPLETE;
  2069. ts->stat = SAS_OPEN_REJECT;
  2070. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  2071. break;
  2072. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
  2073. case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
  2074. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
  2075. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
  2076. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
  2077. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
  2078. pm8001_dbg(pm8001_ha, IO, "IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS\n");
  2079. ts->resp = SAS_TASK_COMPLETE;
  2080. ts->stat = SAS_OPEN_REJECT;
  2081. ts->open_rej_reason = SAS_OREJ_UNKNOWN;
  2082. if (!t->uldd_task)
  2083. pm8001_handle_event(pm8001_ha,
  2084. pm8001_dev,
  2085. IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
  2086. break;
  2087. case IO_OPEN_CNX_ERROR_BAD_DESTINATION:
  2088. pm8001_dbg(pm8001_ha, IO,
  2089. "IO_OPEN_CNX_ERROR_BAD_DESTINATION\n");
  2090. ts->resp = SAS_TASK_COMPLETE;
  2091. ts->stat = SAS_OPEN_REJECT;
  2092. ts->open_rej_reason = SAS_OREJ_BAD_DEST;
  2093. break;
  2094. case IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
  2095. pm8001_dbg(pm8001_ha, IO,
  2096. "IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED\n");
  2097. ts->resp = SAS_TASK_COMPLETE;
  2098. ts->stat = SAS_OPEN_REJECT;
  2099. ts->open_rej_reason = SAS_OREJ_CONN_RATE;
  2100. break;
  2101. case IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
  2102. pm8001_dbg(pm8001_ha, IO,
  2103. "IO_OPEN_CNX_ERROR_WRONG_DESTINATION\n");
  2104. ts->resp = SAS_TASK_COMPLETE;
  2105. ts->stat = SAS_OPEN_REJECT;
  2106. ts->open_rej_reason = SAS_OREJ_WRONG_DEST;
  2107. break;
  2108. case IO_XFER_ERROR_NAK_RECEIVED:
  2109. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_NAK_RECEIVED\n");
  2110. ts->resp = SAS_TASK_COMPLETE;
  2111. ts->stat = SAS_OPEN_REJECT;
  2112. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  2113. break;
  2114. case IO_XFER_ERROR_ACK_NAK_TIMEOUT:
  2115. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_ACK_NAK_TIMEOUT\n");
  2116. ts->resp = SAS_TASK_COMPLETE;
  2117. ts->stat = SAS_NAK_R_ERR;
  2118. break;
  2119. case IO_XFER_OPEN_RETRY_TIMEOUT:
  2120. pm8001_dbg(pm8001_ha, IO, "IO_XFER_OPEN_RETRY_TIMEOUT\n");
  2121. pm8001_handle_event(pm8001_ha, t, IO_XFER_OPEN_RETRY_TIMEOUT);
  2122. return;
  2123. case IO_XFER_ERROR_UNEXPECTED_PHASE:
  2124. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_UNEXPECTED_PHASE\n");
  2125. ts->resp = SAS_TASK_COMPLETE;
  2126. ts->stat = SAS_DATA_OVERRUN;
  2127. break;
  2128. case IO_XFER_ERROR_XFER_RDY_OVERRUN:
  2129. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_XFER_RDY_OVERRUN\n");
  2130. ts->resp = SAS_TASK_COMPLETE;
  2131. ts->stat = SAS_DATA_OVERRUN;
  2132. break;
  2133. case IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED:
  2134. pm8001_dbg(pm8001_ha, IO,
  2135. "IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED\n");
  2136. ts->resp = SAS_TASK_COMPLETE;
  2137. ts->stat = SAS_DATA_OVERRUN;
  2138. break;
  2139. case IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT:
  2140. pm8001_dbg(pm8001_ha, IO,
  2141. "IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT\n");
  2142. ts->resp = SAS_TASK_COMPLETE;
  2143. ts->stat = SAS_DATA_OVERRUN;
  2144. break;
  2145. case IO_XFER_ERROR_OFFSET_MISMATCH:
  2146. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_OFFSET_MISMATCH\n");
  2147. ts->resp = SAS_TASK_COMPLETE;
  2148. ts->stat = SAS_DATA_OVERRUN;
  2149. break;
  2150. case IO_XFER_ERROR_XFER_ZERO_DATA_LEN:
  2151. pm8001_dbg(pm8001_ha, IO,
  2152. "IO_XFER_ERROR_XFER_ZERO_DATA_LEN\n");
  2153. ts->resp = SAS_TASK_COMPLETE;
  2154. ts->stat = SAS_DATA_OVERRUN;
  2155. break;
  2156. case IO_XFER_ERROR_INTERNAL_CRC_ERROR:
  2157. pm8001_dbg(pm8001_ha, IOERR,
  2158. "IO_XFR_ERROR_INTERNAL_CRC_ERROR\n");
  2159. /* TBC: used default set values */
  2160. ts->resp = SAS_TASK_COMPLETE;
  2161. ts->stat = SAS_DATA_OVERRUN;
  2162. break;
  2163. case IO_XFER_CMD_FRAME_ISSUED:
  2164. pm8001_dbg(pm8001_ha, IO, "IO_XFER_CMD_FRAME_ISSUED\n");
  2165. return;
  2166. default:
  2167. pm8001_dbg(pm8001_ha, DEVIO, "Unknown status 0x%x\n", event);
  2168. /* not allowed case. Therefore, return failed status */
  2169. ts->resp = SAS_TASK_COMPLETE;
  2170. ts->stat = SAS_DATA_OVERRUN;
  2171. break;
  2172. }
  2173. spin_lock_irqsave(&t->task_state_lock, flags);
  2174. t->task_state_flags &= ~SAS_TASK_STATE_PENDING;
  2175. t->task_state_flags |= SAS_TASK_STATE_DONE;
  2176. if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) {
  2177. spin_unlock_irqrestore(&t->task_state_lock, flags);
  2178. pm8001_dbg(pm8001_ha, FAIL,
  2179. "task 0x%p done with event 0x%x resp 0x%x stat 0x%x but aborted by upper layer!\n",
  2180. t, event, ts->resp, ts->stat);
  2181. pm8001_ccb_task_free(pm8001_ha, ccb);
  2182. } else {
  2183. spin_unlock_irqrestore(&t->task_state_lock, flags);
  2184. pm8001_ccb_task_free_done(pm8001_ha, ccb);
  2185. }
  2186. }
  2187. /*See the comments for mpi_ssp_completion */
  2188. static void
  2189. mpi_sata_completion(struct pm8001_hba_info *pm8001_ha,
  2190. struct outbound_queue_table *circularQ, void *piomb)
  2191. {
  2192. struct sas_task *t;
  2193. struct pm8001_ccb_info *ccb;
  2194. u32 param;
  2195. u32 status;
  2196. u32 tag;
  2197. int i, j;
  2198. u8 sata_addr_low[4];
  2199. u32 temp_sata_addr_low, temp_sata_addr_hi;
  2200. u8 sata_addr_hi[4];
  2201. struct sata_completion_resp *psataPayload;
  2202. struct task_status_struct *ts;
  2203. struct ata_task_resp *resp ;
  2204. u32 *sata_resp;
  2205. struct pm8001_device *pm8001_dev;
  2206. unsigned long flags;
  2207. psataPayload = (struct sata_completion_resp *)(piomb + 4);
  2208. status = le32_to_cpu(psataPayload->status);
  2209. param = le32_to_cpu(psataPayload->param);
  2210. tag = le32_to_cpu(psataPayload->tag);
  2211. ccb = &pm8001_ha->ccb_info[tag];
  2212. t = ccb->task;
  2213. pm8001_dev = ccb->device;
  2214. if (t) {
  2215. if (t->dev && (t->dev->lldd_dev))
  2216. pm8001_dev = t->dev->lldd_dev;
  2217. } else {
  2218. pm8001_dbg(pm8001_ha, FAIL, "task null\n");
  2219. return;
  2220. }
  2221. if ((pm8001_dev && !(pm8001_dev->id & NCQ_READ_LOG_FLAG))
  2222. && unlikely(!t || !t->lldd_task || !t->dev)) {
  2223. pm8001_dbg(pm8001_ha, FAIL, "task or dev null\n");
  2224. return;
  2225. }
  2226. ts = &t->task_status;
  2227. if (status != IO_SUCCESS) {
  2228. pm8001_dbg(pm8001_ha, FAIL,
  2229. "IO failed device_id %u status 0x%x tag %d\n",
  2230. pm8001_dev->device_id, status, tag);
  2231. }
  2232. /* Print sas address of IO failed device */
  2233. if ((status != IO_SUCCESS) && (status != IO_OVERFLOW) &&
  2234. (status != IO_UNDERFLOW)) {
  2235. if (!((t->dev->parent) &&
  2236. (dev_is_expander(t->dev->parent->dev_type)))) {
  2237. for (i = 0, j = 4; i <= 3 && j <= 7; i++, j++)
  2238. sata_addr_low[i] = pm8001_ha->sas_addr[j];
  2239. for (i = 0, j = 0; i <= 3 && j <= 3; i++, j++)
  2240. sata_addr_hi[i] = pm8001_ha->sas_addr[j];
  2241. memcpy(&temp_sata_addr_low, sata_addr_low,
  2242. sizeof(sata_addr_low));
  2243. memcpy(&temp_sata_addr_hi, sata_addr_hi,
  2244. sizeof(sata_addr_hi));
  2245. temp_sata_addr_hi = (((temp_sata_addr_hi >> 24) & 0xff)
  2246. |((temp_sata_addr_hi << 8) &
  2247. 0xff0000) |
  2248. ((temp_sata_addr_hi >> 8)
  2249. & 0xff00) |
  2250. ((temp_sata_addr_hi << 24) &
  2251. 0xff000000));
  2252. temp_sata_addr_low = ((((temp_sata_addr_low >> 24)
  2253. & 0xff) |
  2254. ((temp_sata_addr_low << 8)
  2255. & 0xff0000) |
  2256. ((temp_sata_addr_low >> 8)
  2257. & 0xff00) |
  2258. ((temp_sata_addr_low << 24)
  2259. & 0xff000000)) +
  2260. pm8001_dev->attached_phy +
  2261. 0x10);
  2262. pm8001_dbg(pm8001_ha, FAIL,
  2263. "SAS Address of IO Failure Drive:%08x%08x\n",
  2264. temp_sata_addr_hi,
  2265. temp_sata_addr_low);
  2266. } else {
  2267. pm8001_dbg(pm8001_ha, FAIL,
  2268. "SAS Address of IO Failure Drive:%016llx\n",
  2269. SAS_ADDR(t->dev->sas_addr));
  2270. }
  2271. }
  2272. switch (status) {
  2273. case IO_SUCCESS:
  2274. pm8001_dbg(pm8001_ha, IO, "IO_SUCCESS\n");
  2275. if (param == 0) {
  2276. ts->resp = SAS_TASK_COMPLETE;
  2277. ts->stat = SAS_SAM_STAT_GOOD;
  2278. /* check if response is for SEND READ LOG */
  2279. if (pm8001_dev &&
  2280. (pm8001_dev->id & NCQ_READ_LOG_FLAG)) {
  2281. pm80xx_send_abort_all(pm8001_ha, pm8001_dev);
  2282. /* Free the tag */
  2283. pm8001_tag_free(pm8001_ha, tag);
  2284. sas_free_task(t);
  2285. return;
  2286. }
  2287. } else {
  2288. u8 len;
  2289. ts->resp = SAS_TASK_COMPLETE;
  2290. ts->stat = SAS_PROTO_RESPONSE;
  2291. ts->residual = param;
  2292. pm8001_dbg(pm8001_ha, IO,
  2293. "SAS_PROTO_RESPONSE len = %d\n",
  2294. param);
  2295. sata_resp = &psataPayload->sata_resp[0];
  2296. resp = (struct ata_task_resp *)ts->buf;
  2297. if (t->ata_task.dma_xfer == 0 &&
  2298. t->data_dir == DMA_FROM_DEVICE) {
  2299. len = sizeof(struct pio_setup_fis);
  2300. pm8001_dbg(pm8001_ha, IO,
  2301. "PIO read len = %d\n", len);
  2302. } else if (t->ata_task.use_ncq &&
  2303. t->data_dir != DMA_NONE) {
  2304. len = sizeof(struct set_dev_bits_fis);
  2305. pm8001_dbg(pm8001_ha, IO, "FPDMA len = %d\n",
  2306. len);
  2307. } else {
  2308. len = sizeof(struct dev_to_host_fis);
  2309. pm8001_dbg(pm8001_ha, IO, "other len = %d\n",
  2310. len);
  2311. }
  2312. if (SAS_STATUS_BUF_SIZE >= sizeof(*resp)) {
  2313. resp->frame_len = len;
  2314. memcpy(&resp->ending_fis[0], sata_resp, len);
  2315. ts->buf_valid_size = sizeof(*resp);
  2316. } else
  2317. pm8001_dbg(pm8001_ha, IO,
  2318. "response too large\n");
  2319. }
  2320. if (pm8001_dev)
  2321. atomic_dec(&pm8001_dev->running_req);
  2322. break;
  2323. case IO_ABORTED:
  2324. pm8001_dbg(pm8001_ha, IO, "IO_ABORTED IOMB Tag\n");
  2325. ts->resp = SAS_TASK_COMPLETE;
  2326. ts->stat = SAS_ABORTED_TASK;
  2327. if (pm8001_dev)
  2328. atomic_dec(&pm8001_dev->running_req);
  2329. break;
  2330. /* following cases are to do cases */
  2331. case IO_UNDERFLOW:
  2332. /* SATA Completion with error */
  2333. pm8001_dbg(pm8001_ha, IO, "IO_UNDERFLOW param = %d\n", param);
  2334. ts->resp = SAS_TASK_COMPLETE;
  2335. ts->stat = SAS_DATA_UNDERRUN;
  2336. ts->residual = param;
  2337. if (pm8001_dev)
  2338. atomic_dec(&pm8001_dev->running_req);
  2339. break;
  2340. case IO_NO_DEVICE:
  2341. pm8001_dbg(pm8001_ha, IO, "IO_NO_DEVICE\n");
  2342. ts->resp = SAS_TASK_UNDELIVERED;
  2343. ts->stat = SAS_PHY_DOWN;
  2344. if (pm8001_dev)
  2345. atomic_dec(&pm8001_dev->running_req);
  2346. break;
  2347. case IO_XFER_ERROR_BREAK:
  2348. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_BREAK\n");
  2349. ts->resp = SAS_TASK_COMPLETE;
  2350. ts->stat = SAS_INTERRUPTED;
  2351. if (pm8001_dev)
  2352. atomic_dec(&pm8001_dev->running_req);
  2353. break;
  2354. case IO_XFER_ERROR_PHY_NOT_READY:
  2355. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_PHY_NOT_READY\n");
  2356. ts->resp = SAS_TASK_COMPLETE;
  2357. ts->stat = SAS_OPEN_REJECT;
  2358. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  2359. if (pm8001_dev)
  2360. atomic_dec(&pm8001_dev->running_req);
  2361. break;
  2362. case IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
  2363. pm8001_dbg(pm8001_ha, IO,
  2364. "IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED\n");
  2365. ts->resp = SAS_TASK_COMPLETE;
  2366. ts->stat = SAS_OPEN_REJECT;
  2367. ts->open_rej_reason = SAS_OREJ_EPROTO;
  2368. if (pm8001_dev)
  2369. atomic_dec(&pm8001_dev->running_req);
  2370. break;
  2371. case IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
  2372. pm8001_dbg(pm8001_ha, IO,
  2373. "IO_OPEN_CNX_ERROR_ZONE_VIOLATION\n");
  2374. ts->resp = SAS_TASK_COMPLETE;
  2375. ts->stat = SAS_OPEN_REJECT;
  2376. ts->open_rej_reason = SAS_OREJ_UNKNOWN;
  2377. if (pm8001_dev)
  2378. atomic_dec(&pm8001_dev->running_req);
  2379. break;
  2380. case IO_OPEN_CNX_ERROR_BREAK:
  2381. pm8001_dbg(pm8001_ha, IO, "IO_OPEN_CNX_ERROR_BREAK\n");
  2382. ts->resp = SAS_TASK_COMPLETE;
  2383. ts->stat = SAS_OPEN_REJECT;
  2384. ts->open_rej_reason = SAS_OREJ_RSVD_CONT0;
  2385. if (pm8001_dev)
  2386. atomic_dec(&pm8001_dev->running_req);
  2387. break;
  2388. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
  2389. case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
  2390. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
  2391. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
  2392. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
  2393. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
  2394. pm8001_dbg(pm8001_ha, IO, "IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS\n");
  2395. ts->resp = SAS_TASK_COMPLETE;
  2396. ts->stat = SAS_DEV_NO_RESPONSE;
  2397. if (!t->uldd_task) {
  2398. pm8001_handle_event(pm8001_ha,
  2399. pm8001_dev,
  2400. IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
  2401. ts->resp = SAS_TASK_UNDELIVERED;
  2402. ts->stat = SAS_QUEUE_FULL;
  2403. spin_unlock_irqrestore(&circularQ->oq_lock,
  2404. circularQ->lock_flags);
  2405. pm8001_ccb_task_free_done(pm8001_ha, ccb);
  2406. spin_lock_irqsave(&circularQ->oq_lock,
  2407. circularQ->lock_flags);
  2408. return;
  2409. }
  2410. break;
  2411. case IO_OPEN_CNX_ERROR_BAD_DESTINATION:
  2412. pm8001_dbg(pm8001_ha, IO,
  2413. "IO_OPEN_CNX_ERROR_BAD_DESTINATION\n");
  2414. ts->resp = SAS_TASK_UNDELIVERED;
  2415. ts->stat = SAS_OPEN_REJECT;
  2416. ts->open_rej_reason = SAS_OREJ_BAD_DEST;
  2417. if (!t->uldd_task) {
  2418. pm8001_handle_event(pm8001_ha,
  2419. pm8001_dev,
  2420. IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
  2421. ts->resp = SAS_TASK_UNDELIVERED;
  2422. ts->stat = SAS_QUEUE_FULL;
  2423. spin_unlock_irqrestore(&circularQ->oq_lock,
  2424. circularQ->lock_flags);
  2425. pm8001_ccb_task_free_done(pm8001_ha, ccb);
  2426. spin_lock_irqsave(&circularQ->oq_lock,
  2427. circularQ->lock_flags);
  2428. return;
  2429. }
  2430. break;
  2431. case IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
  2432. pm8001_dbg(pm8001_ha, IO,
  2433. "IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED\n");
  2434. ts->resp = SAS_TASK_COMPLETE;
  2435. ts->stat = SAS_OPEN_REJECT;
  2436. ts->open_rej_reason = SAS_OREJ_CONN_RATE;
  2437. if (pm8001_dev)
  2438. atomic_dec(&pm8001_dev->running_req);
  2439. break;
  2440. case IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
  2441. pm8001_dbg(pm8001_ha, IO,
  2442. "IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n");
  2443. ts->resp = SAS_TASK_COMPLETE;
  2444. ts->stat = SAS_DEV_NO_RESPONSE;
  2445. if (!t->uldd_task) {
  2446. pm8001_handle_event(pm8001_ha,
  2447. pm8001_dev,
  2448. IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY);
  2449. ts->resp = SAS_TASK_UNDELIVERED;
  2450. ts->stat = SAS_QUEUE_FULL;
  2451. spin_unlock_irqrestore(&circularQ->oq_lock,
  2452. circularQ->lock_flags);
  2453. pm8001_ccb_task_free_done(pm8001_ha, ccb);
  2454. spin_lock_irqsave(&circularQ->oq_lock,
  2455. circularQ->lock_flags);
  2456. return;
  2457. }
  2458. break;
  2459. case IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
  2460. pm8001_dbg(pm8001_ha, IO,
  2461. "IO_OPEN_CNX_ERROR_WRONG_DESTINATION\n");
  2462. ts->resp = SAS_TASK_COMPLETE;
  2463. ts->stat = SAS_OPEN_REJECT;
  2464. ts->open_rej_reason = SAS_OREJ_WRONG_DEST;
  2465. if (pm8001_dev)
  2466. atomic_dec(&pm8001_dev->running_req);
  2467. break;
  2468. case IO_XFER_ERROR_NAK_RECEIVED:
  2469. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_NAK_RECEIVED\n");
  2470. ts->resp = SAS_TASK_COMPLETE;
  2471. ts->stat = SAS_NAK_R_ERR;
  2472. if (pm8001_dev)
  2473. atomic_dec(&pm8001_dev->running_req);
  2474. break;
  2475. case IO_XFER_ERROR_ACK_NAK_TIMEOUT:
  2476. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_ACK_NAK_TIMEOUT\n");
  2477. ts->resp = SAS_TASK_COMPLETE;
  2478. ts->stat = SAS_NAK_R_ERR;
  2479. if (pm8001_dev)
  2480. atomic_dec(&pm8001_dev->running_req);
  2481. break;
  2482. case IO_XFER_ERROR_DMA:
  2483. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_DMA\n");
  2484. ts->resp = SAS_TASK_COMPLETE;
  2485. ts->stat = SAS_ABORTED_TASK;
  2486. if (pm8001_dev)
  2487. atomic_dec(&pm8001_dev->running_req);
  2488. break;
  2489. case IO_XFER_ERROR_SATA_LINK_TIMEOUT:
  2490. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_SATA_LINK_TIMEOUT\n");
  2491. ts->resp = SAS_TASK_UNDELIVERED;
  2492. ts->stat = SAS_DEV_NO_RESPONSE;
  2493. if (pm8001_dev)
  2494. atomic_dec(&pm8001_dev->running_req);
  2495. break;
  2496. case IO_XFER_ERROR_REJECTED_NCQ_MODE:
  2497. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_REJECTED_NCQ_MODE\n");
  2498. ts->resp = SAS_TASK_COMPLETE;
  2499. ts->stat = SAS_DATA_UNDERRUN;
  2500. if (pm8001_dev)
  2501. atomic_dec(&pm8001_dev->running_req);
  2502. break;
  2503. case IO_XFER_OPEN_RETRY_TIMEOUT:
  2504. pm8001_dbg(pm8001_ha, IO, "IO_XFER_OPEN_RETRY_TIMEOUT\n");
  2505. ts->resp = SAS_TASK_COMPLETE;
  2506. ts->stat = SAS_OPEN_TO;
  2507. if (pm8001_dev)
  2508. atomic_dec(&pm8001_dev->running_req);
  2509. break;
  2510. case IO_PORT_IN_RESET:
  2511. pm8001_dbg(pm8001_ha, IO, "IO_PORT_IN_RESET\n");
  2512. ts->resp = SAS_TASK_COMPLETE;
  2513. ts->stat = SAS_DEV_NO_RESPONSE;
  2514. if (pm8001_dev)
  2515. atomic_dec(&pm8001_dev->running_req);
  2516. break;
  2517. case IO_DS_NON_OPERATIONAL:
  2518. pm8001_dbg(pm8001_ha, IO, "IO_DS_NON_OPERATIONAL\n");
  2519. ts->resp = SAS_TASK_COMPLETE;
  2520. ts->stat = SAS_DEV_NO_RESPONSE;
  2521. if (!t->uldd_task) {
  2522. pm8001_handle_event(pm8001_ha, pm8001_dev,
  2523. IO_DS_NON_OPERATIONAL);
  2524. ts->resp = SAS_TASK_UNDELIVERED;
  2525. ts->stat = SAS_QUEUE_FULL;
  2526. spin_unlock_irqrestore(&circularQ->oq_lock,
  2527. circularQ->lock_flags);
  2528. pm8001_ccb_task_free_done(pm8001_ha, ccb);
  2529. spin_lock_irqsave(&circularQ->oq_lock,
  2530. circularQ->lock_flags);
  2531. return;
  2532. }
  2533. break;
  2534. case IO_DS_IN_RECOVERY:
  2535. pm8001_dbg(pm8001_ha, IO, "IO_DS_IN_RECOVERY\n");
  2536. ts->resp = SAS_TASK_COMPLETE;
  2537. ts->stat = SAS_DEV_NO_RESPONSE;
  2538. if (pm8001_dev)
  2539. atomic_dec(&pm8001_dev->running_req);
  2540. break;
  2541. case IO_DS_IN_ERROR:
  2542. pm8001_dbg(pm8001_ha, IO, "IO_DS_IN_ERROR\n");
  2543. ts->resp = SAS_TASK_COMPLETE;
  2544. ts->stat = SAS_DEV_NO_RESPONSE;
  2545. if (!t->uldd_task) {
  2546. pm8001_handle_event(pm8001_ha, pm8001_dev,
  2547. IO_DS_IN_ERROR);
  2548. ts->resp = SAS_TASK_UNDELIVERED;
  2549. ts->stat = SAS_QUEUE_FULL;
  2550. spin_unlock_irqrestore(&circularQ->oq_lock,
  2551. circularQ->lock_flags);
  2552. pm8001_ccb_task_free_done(pm8001_ha, ccb);
  2553. spin_lock_irqsave(&circularQ->oq_lock,
  2554. circularQ->lock_flags);
  2555. return;
  2556. }
  2557. break;
  2558. case IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY:
  2559. pm8001_dbg(pm8001_ha, IO,
  2560. "IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY\n");
  2561. ts->resp = SAS_TASK_COMPLETE;
  2562. ts->stat = SAS_OPEN_REJECT;
  2563. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  2564. if (pm8001_dev)
  2565. atomic_dec(&pm8001_dev->running_req);
  2566. break;
  2567. default:
  2568. pm8001_dbg(pm8001_ha, DEVIO,
  2569. "Unknown status device_id %u status 0x%x tag %d\n",
  2570. pm8001_dev->device_id, status, tag);
  2571. /* not allowed case. Therefore, return failed status */
  2572. ts->resp = SAS_TASK_COMPLETE;
  2573. ts->stat = SAS_DEV_NO_RESPONSE;
  2574. if (pm8001_dev)
  2575. atomic_dec(&pm8001_dev->running_req);
  2576. break;
  2577. }
  2578. spin_lock_irqsave(&t->task_state_lock, flags);
  2579. t->task_state_flags &= ~SAS_TASK_STATE_PENDING;
  2580. t->task_state_flags |= SAS_TASK_STATE_DONE;
  2581. if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) {
  2582. spin_unlock_irqrestore(&t->task_state_lock, flags);
  2583. pm8001_dbg(pm8001_ha, FAIL,
  2584. "task 0x%p done with io_status 0x%x resp 0x%x stat 0x%x but aborted by upper layer!\n",
  2585. t, status, ts->resp, ts->stat);
  2586. pm8001_ccb_task_free(pm8001_ha, ccb);
  2587. if (t->slow_task)
  2588. complete(&t->slow_task->completion);
  2589. } else {
  2590. spin_unlock_irqrestore(&t->task_state_lock, flags);
  2591. spin_unlock_irqrestore(&circularQ->oq_lock,
  2592. circularQ->lock_flags);
  2593. pm8001_ccb_task_free_done(pm8001_ha, ccb);
  2594. spin_lock_irqsave(&circularQ->oq_lock,
  2595. circularQ->lock_flags);
  2596. }
  2597. }
  2598. /*See the comments for mpi_ssp_completion */
  2599. static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha,
  2600. struct outbound_queue_table *circularQ, void *piomb)
  2601. {
  2602. struct sas_task *t;
  2603. struct task_status_struct *ts;
  2604. struct pm8001_ccb_info *ccb;
  2605. struct pm8001_device *pm8001_dev;
  2606. struct sata_event_resp *psataPayload =
  2607. (struct sata_event_resp *)(piomb + 4);
  2608. u32 event = le32_to_cpu(psataPayload->event);
  2609. u32 tag = le32_to_cpu(psataPayload->tag);
  2610. u32 port_id = le32_to_cpu(psataPayload->port_id);
  2611. u32 dev_id = le32_to_cpu(psataPayload->device_id);
  2612. if (event)
  2613. pm8001_dbg(pm8001_ha, FAIL, "SATA EVENT 0x%x\n", event);
  2614. /* Check if this is NCQ error */
  2615. if (event == IO_XFER_ERROR_ABORTED_NCQ_MODE) {
  2616. /* find device using device id */
  2617. pm8001_dev = pm8001_find_dev(pm8001_ha, dev_id);
  2618. /* send read log extension */
  2619. if (pm8001_dev)
  2620. pm80xx_send_read_log(pm8001_ha, pm8001_dev);
  2621. return;
  2622. }
  2623. ccb = &pm8001_ha->ccb_info[tag];
  2624. t = ccb->task;
  2625. pm8001_dev = ccb->device;
  2626. if (unlikely(!t || !t->lldd_task || !t->dev)) {
  2627. pm8001_dbg(pm8001_ha, FAIL, "task or dev null\n");
  2628. return;
  2629. }
  2630. ts = &t->task_status;
  2631. pm8001_dbg(pm8001_ha, IOERR, "port_id:0x%x, tag:0x%x, event:0x%x\n",
  2632. port_id, tag, event);
  2633. switch (event) {
  2634. case IO_OVERFLOW:
  2635. pm8001_dbg(pm8001_ha, IO, "IO_UNDERFLOW\n");
  2636. ts->resp = SAS_TASK_COMPLETE;
  2637. ts->stat = SAS_DATA_OVERRUN;
  2638. ts->residual = 0;
  2639. break;
  2640. case IO_XFER_ERROR_BREAK:
  2641. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_BREAK\n");
  2642. ts->resp = SAS_TASK_COMPLETE;
  2643. ts->stat = SAS_INTERRUPTED;
  2644. break;
  2645. case IO_XFER_ERROR_PHY_NOT_READY:
  2646. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_PHY_NOT_READY\n");
  2647. ts->resp = SAS_TASK_COMPLETE;
  2648. ts->stat = SAS_OPEN_REJECT;
  2649. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  2650. break;
  2651. case IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
  2652. pm8001_dbg(pm8001_ha, IO,
  2653. "IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED\n");
  2654. ts->resp = SAS_TASK_COMPLETE;
  2655. ts->stat = SAS_OPEN_REJECT;
  2656. ts->open_rej_reason = SAS_OREJ_EPROTO;
  2657. break;
  2658. case IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
  2659. pm8001_dbg(pm8001_ha, IO,
  2660. "IO_OPEN_CNX_ERROR_ZONE_VIOLATION\n");
  2661. ts->resp = SAS_TASK_COMPLETE;
  2662. ts->stat = SAS_OPEN_REJECT;
  2663. ts->open_rej_reason = SAS_OREJ_UNKNOWN;
  2664. break;
  2665. case IO_OPEN_CNX_ERROR_BREAK:
  2666. pm8001_dbg(pm8001_ha, IO, "IO_OPEN_CNX_ERROR_BREAK\n");
  2667. ts->resp = SAS_TASK_COMPLETE;
  2668. ts->stat = SAS_OPEN_REJECT;
  2669. ts->open_rej_reason = SAS_OREJ_RSVD_CONT0;
  2670. break;
  2671. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
  2672. case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
  2673. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
  2674. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
  2675. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
  2676. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
  2677. pm8001_dbg(pm8001_ha, FAIL,
  2678. "IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS\n");
  2679. ts->resp = SAS_TASK_UNDELIVERED;
  2680. ts->stat = SAS_DEV_NO_RESPONSE;
  2681. if (!t->uldd_task) {
  2682. pm8001_handle_event(pm8001_ha,
  2683. pm8001_dev,
  2684. IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
  2685. ts->resp = SAS_TASK_COMPLETE;
  2686. ts->stat = SAS_QUEUE_FULL;
  2687. return;
  2688. }
  2689. break;
  2690. case IO_OPEN_CNX_ERROR_BAD_DESTINATION:
  2691. pm8001_dbg(pm8001_ha, IO,
  2692. "IO_OPEN_CNX_ERROR_BAD_DESTINATION\n");
  2693. ts->resp = SAS_TASK_UNDELIVERED;
  2694. ts->stat = SAS_OPEN_REJECT;
  2695. ts->open_rej_reason = SAS_OREJ_BAD_DEST;
  2696. break;
  2697. case IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
  2698. pm8001_dbg(pm8001_ha, IO,
  2699. "IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED\n");
  2700. ts->resp = SAS_TASK_COMPLETE;
  2701. ts->stat = SAS_OPEN_REJECT;
  2702. ts->open_rej_reason = SAS_OREJ_CONN_RATE;
  2703. break;
  2704. case IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
  2705. pm8001_dbg(pm8001_ha, IO,
  2706. "IO_OPEN_CNX_ERROR_WRONG_DESTINATION\n");
  2707. ts->resp = SAS_TASK_COMPLETE;
  2708. ts->stat = SAS_OPEN_REJECT;
  2709. ts->open_rej_reason = SAS_OREJ_WRONG_DEST;
  2710. break;
  2711. case IO_XFER_ERROR_NAK_RECEIVED:
  2712. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_NAK_RECEIVED\n");
  2713. ts->resp = SAS_TASK_COMPLETE;
  2714. ts->stat = SAS_NAK_R_ERR;
  2715. break;
  2716. case IO_XFER_ERROR_PEER_ABORTED:
  2717. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_PEER_ABORTED\n");
  2718. ts->resp = SAS_TASK_COMPLETE;
  2719. ts->stat = SAS_NAK_R_ERR;
  2720. break;
  2721. case IO_XFER_ERROR_REJECTED_NCQ_MODE:
  2722. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_REJECTED_NCQ_MODE\n");
  2723. ts->resp = SAS_TASK_COMPLETE;
  2724. ts->stat = SAS_DATA_UNDERRUN;
  2725. break;
  2726. case IO_XFER_OPEN_RETRY_TIMEOUT:
  2727. pm8001_dbg(pm8001_ha, IO, "IO_XFER_OPEN_RETRY_TIMEOUT\n");
  2728. ts->resp = SAS_TASK_COMPLETE;
  2729. ts->stat = SAS_OPEN_TO;
  2730. break;
  2731. case IO_XFER_ERROR_UNEXPECTED_PHASE:
  2732. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_UNEXPECTED_PHASE\n");
  2733. ts->resp = SAS_TASK_COMPLETE;
  2734. ts->stat = SAS_OPEN_TO;
  2735. break;
  2736. case IO_XFER_ERROR_XFER_RDY_OVERRUN:
  2737. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_XFER_RDY_OVERRUN\n");
  2738. ts->resp = SAS_TASK_COMPLETE;
  2739. ts->stat = SAS_OPEN_TO;
  2740. break;
  2741. case IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED:
  2742. pm8001_dbg(pm8001_ha, IO,
  2743. "IO_XFER_ERROR_XFER_RDY_NOT_EXPECTED\n");
  2744. ts->resp = SAS_TASK_COMPLETE;
  2745. ts->stat = SAS_OPEN_TO;
  2746. break;
  2747. case IO_XFER_ERROR_OFFSET_MISMATCH:
  2748. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_OFFSET_MISMATCH\n");
  2749. ts->resp = SAS_TASK_COMPLETE;
  2750. ts->stat = SAS_OPEN_TO;
  2751. break;
  2752. case IO_XFER_ERROR_XFER_ZERO_DATA_LEN:
  2753. pm8001_dbg(pm8001_ha, IO,
  2754. "IO_XFER_ERROR_XFER_ZERO_DATA_LEN\n");
  2755. ts->resp = SAS_TASK_COMPLETE;
  2756. ts->stat = SAS_OPEN_TO;
  2757. break;
  2758. case IO_XFER_CMD_FRAME_ISSUED:
  2759. pm8001_dbg(pm8001_ha, IO, "IO_XFER_CMD_FRAME_ISSUED\n");
  2760. break;
  2761. case IO_XFER_PIO_SETUP_ERROR:
  2762. pm8001_dbg(pm8001_ha, IO, "IO_XFER_PIO_SETUP_ERROR\n");
  2763. ts->resp = SAS_TASK_COMPLETE;
  2764. ts->stat = SAS_OPEN_TO;
  2765. break;
  2766. case IO_XFER_ERROR_INTERNAL_CRC_ERROR:
  2767. pm8001_dbg(pm8001_ha, FAIL,
  2768. "IO_XFR_ERROR_INTERNAL_CRC_ERROR\n");
  2769. /* TBC: used default set values */
  2770. ts->resp = SAS_TASK_COMPLETE;
  2771. ts->stat = SAS_OPEN_TO;
  2772. break;
  2773. case IO_XFER_DMA_ACTIVATE_TIMEOUT:
  2774. pm8001_dbg(pm8001_ha, FAIL, "IO_XFR_DMA_ACTIVATE_TIMEOUT\n");
  2775. /* TBC: used default set values */
  2776. ts->resp = SAS_TASK_COMPLETE;
  2777. ts->stat = SAS_OPEN_TO;
  2778. break;
  2779. default:
  2780. pm8001_dbg(pm8001_ha, IO, "Unknown status 0x%x\n", event);
  2781. /* not allowed case. Therefore, return failed status */
  2782. ts->resp = SAS_TASK_COMPLETE;
  2783. ts->stat = SAS_OPEN_TO;
  2784. break;
  2785. }
  2786. }
  2787. /*See the comments for mpi_ssp_completion */
  2788. static void
  2789. mpi_smp_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
  2790. {
  2791. u32 param, i;
  2792. struct sas_task *t;
  2793. struct pm8001_ccb_info *ccb;
  2794. unsigned long flags;
  2795. u32 status;
  2796. u32 tag;
  2797. struct smp_completion_resp *psmpPayload;
  2798. struct task_status_struct *ts;
  2799. struct pm8001_device *pm8001_dev;
  2800. psmpPayload = (struct smp_completion_resp *)(piomb + 4);
  2801. status = le32_to_cpu(psmpPayload->status);
  2802. tag = le32_to_cpu(psmpPayload->tag);
  2803. ccb = &pm8001_ha->ccb_info[tag];
  2804. param = le32_to_cpu(psmpPayload->param);
  2805. t = ccb->task;
  2806. ts = &t->task_status;
  2807. pm8001_dev = ccb->device;
  2808. if (status)
  2809. pm8001_dbg(pm8001_ha, FAIL, "smp IO status 0x%x\n", status);
  2810. if (unlikely(!t || !t->lldd_task || !t->dev))
  2811. return;
  2812. pm8001_dbg(pm8001_ha, DEV, "tag::0x%x status::0x%x\n", tag, status);
  2813. switch (status) {
  2814. case IO_SUCCESS:
  2815. pm8001_dbg(pm8001_ha, IO, "IO_SUCCESS\n");
  2816. ts->resp = SAS_TASK_COMPLETE;
  2817. ts->stat = SAS_SAM_STAT_GOOD;
  2818. if (pm8001_dev)
  2819. atomic_dec(&pm8001_dev->running_req);
  2820. if (pm8001_ha->smp_exp_mode == SMP_DIRECT) {
  2821. struct scatterlist *sg_resp = &t->smp_task.smp_resp;
  2822. u8 *payload;
  2823. void *to;
  2824. pm8001_dbg(pm8001_ha, IO,
  2825. "DIRECT RESPONSE Length:%d\n",
  2826. param);
  2827. to = kmap_atomic(sg_page(sg_resp));
  2828. payload = to + sg_resp->offset;
  2829. for (i = 0; i < param; i++) {
  2830. *(payload + i) = psmpPayload->_r_a[i];
  2831. pm8001_dbg(pm8001_ha, IO,
  2832. "SMP Byte%d DMA data 0x%x psmp 0x%x\n",
  2833. i, *(payload + i),
  2834. psmpPayload->_r_a[i]);
  2835. }
  2836. kunmap_atomic(to);
  2837. }
  2838. break;
  2839. case IO_ABORTED:
  2840. pm8001_dbg(pm8001_ha, IO, "IO_ABORTED IOMB\n");
  2841. ts->resp = SAS_TASK_COMPLETE;
  2842. ts->stat = SAS_ABORTED_TASK;
  2843. if (pm8001_dev)
  2844. atomic_dec(&pm8001_dev->running_req);
  2845. break;
  2846. case IO_OVERFLOW:
  2847. pm8001_dbg(pm8001_ha, IO, "IO_UNDERFLOW\n");
  2848. ts->resp = SAS_TASK_COMPLETE;
  2849. ts->stat = SAS_DATA_OVERRUN;
  2850. ts->residual = 0;
  2851. if (pm8001_dev)
  2852. atomic_dec(&pm8001_dev->running_req);
  2853. break;
  2854. case IO_NO_DEVICE:
  2855. pm8001_dbg(pm8001_ha, IO, "IO_NO_DEVICE\n");
  2856. ts->resp = SAS_TASK_COMPLETE;
  2857. ts->stat = SAS_PHY_DOWN;
  2858. break;
  2859. case IO_ERROR_HW_TIMEOUT:
  2860. pm8001_dbg(pm8001_ha, IO, "IO_ERROR_HW_TIMEOUT\n");
  2861. ts->resp = SAS_TASK_COMPLETE;
  2862. ts->stat = SAS_SAM_STAT_BUSY;
  2863. break;
  2864. case IO_XFER_ERROR_BREAK:
  2865. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_BREAK\n");
  2866. ts->resp = SAS_TASK_COMPLETE;
  2867. ts->stat = SAS_SAM_STAT_BUSY;
  2868. break;
  2869. case IO_XFER_ERROR_PHY_NOT_READY:
  2870. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_PHY_NOT_READY\n");
  2871. ts->resp = SAS_TASK_COMPLETE;
  2872. ts->stat = SAS_SAM_STAT_BUSY;
  2873. break;
  2874. case IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
  2875. pm8001_dbg(pm8001_ha, IO,
  2876. "IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED\n");
  2877. ts->resp = SAS_TASK_COMPLETE;
  2878. ts->stat = SAS_OPEN_REJECT;
  2879. ts->open_rej_reason = SAS_OREJ_UNKNOWN;
  2880. break;
  2881. case IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
  2882. pm8001_dbg(pm8001_ha, IO,
  2883. "IO_OPEN_CNX_ERROR_ZONE_VIOLATION\n");
  2884. ts->resp = SAS_TASK_COMPLETE;
  2885. ts->stat = SAS_OPEN_REJECT;
  2886. ts->open_rej_reason = SAS_OREJ_UNKNOWN;
  2887. break;
  2888. case IO_OPEN_CNX_ERROR_BREAK:
  2889. pm8001_dbg(pm8001_ha, IO, "IO_OPEN_CNX_ERROR_BREAK\n");
  2890. ts->resp = SAS_TASK_COMPLETE;
  2891. ts->stat = SAS_OPEN_REJECT;
  2892. ts->open_rej_reason = SAS_OREJ_RSVD_CONT0;
  2893. break;
  2894. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
  2895. case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
  2896. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
  2897. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
  2898. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
  2899. case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
  2900. pm8001_dbg(pm8001_ha, IO, "IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS\n");
  2901. ts->resp = SAS_TASK_COMPLETE;
  2902. ts->stat = SAS_OPEN_REJECT;
  2903. ts->open_rej_reason = SAS_OREJ_UNKNOWN;
  2904. pm8001_handle_event(pm8001_ha,
  2905. pm8001_dev,
  2906. IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
  2907. break;
  2908. case IO_OPEN_CNX_ERROR_BAD_DESTINATION:
  2909. pm8001_dbg(pm8001_ha, IO,
  2910. "IO_OPEN_CNX_ERROR_BAD_DESTINATION\n");
  2911. ts->resp = SAS_TASK_COMPLETE;
  2912. ts->stat = SAS_OPEN_REJECT;
  2913. ts->open_rej_reason = SAS_OREJ_BAD_DEST;
  2914. break;
  2915. case IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
  2916. pm8001_dbg(pm8001_ha, IO,
  2917. "IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED\n");
  2918. ts->resp = SAS_TASK_COMPLETE;
  2919. ts->stat = SAS_OPEN_REJECT;
  2920. ts->open_rej_reason = SAS_OREJ_CONN_RATE;
  2921. break;
  2922. case IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
  2923. pm8001_dbg(pm8001_ha, IO,
  2924. "IO_OPEN_CNX_ERROR_WRONG_DESTINATION\n");
  2925. ts->resp = SAS_TASK_COMPLETE;
  2926. ts->stat = SAS_OPEN_REJECT;
  2927. ts->open_rej_reason = SAS_OREJ_WRONG_DEST;
  2928. break;
  2929. case IO_XFER_ERROR_RX_FRAME:
  2930. pm8001_dbg(pm8001_ha, IO, "IO_XFER_ERROR_RX_FRAME\n");
  2931. ts->resp = SAS_TASK_COMPLETE;
  2932. ts->stat = SAS_DEV_NO_RESPONSE;
  2933. break;
  2934. case IO_XFER_OPEN_RETRY_TIMEOUT:
  2935. pm8001_dbg(pm8001_ha, IO, "IO_XFER_OPEN_RETRY_TIMEOUT\n");
  2936. ts->resp = SAS_TASK_COMPLETE;
  2937. ts->stat = SAS_OPEN_REJECT;
  2938. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  2939. break;
  2940. case IO_ERROR_INTERNAL_SMP_RESOURCE:
  2941. pm8001_dbg(pm8001_ha, IO, "IO_ERROR_INTERNAL_SMP_RESOURCE\n");
  2942. ts->resp = SAS_TASK_COMPLETE;
  2943. ts->stat = SAS_QUEUE_FULL;
  2944. break;
  2945. case IO_PORT_IN_RESET:
  2946. pm8001_dbg(pm8001_ha, IO, "IO_PORT_IN_RESET\n");
  2947. ts->resp = SAS_TASK_COMPLETE;
  2948. ts->stat = SAS_OPEN_REJECT;
  2949. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  2950. break;
  2951. case IO_DS_NON_OPERATIONAL:
  2952. pm8001_dbg(pm8001_ha, IO, "IO_DS_NON_OPERATIONAL\n");
  2953. ts->resp = SAS_TASK_COMPLETE;
  2954. ts->stat = SAS_DEV_NO_RESPONSE;
  2955. break;
  2956. case IO_DS_IN_RECOVERY:
  2957. pm8001_dbg(pm8001_ha, IO, "IO_DS_IN_RECOVERY\n");
  2958. ts->resp = SAS_TASK_COMPLETE;
  2959. ts->stat = SAS_OPEN_REJECT;
  2960. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  2961. break;
  2962. case IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY:
  2963. pm8001_dbg(pm8001_ha, IO,
  2964. "IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY\n");
  2965. ts->resp = SAS_TASK_COMPLETE;
  2966. ts->stat = SAS_OPEN_REJECT;
  2967. ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
  2968. break;
  2969. default:
  2970. pm8001_dbg(pm8001_ha, DEVIO, "Unknown status 0x%x\n", status);
  2971. ts->resp = SAS_TASK_COMPLETE;
  2972. ts->stat = SAS_DEV_NO_RESPONSE;
  2973. /* not allowed case. Therefore, return failed status */
  2974. break;
  2975. }
  2976. spin_lock_irqsave(&t->task_state_lock, flags);
  2977. t->task_state_flags &= ~SAS_TASK_STATE_PENDING;
  2978. t->task_state_flags |= SAS_TASK_STATE_DONE;
  2979. if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) {
  2980. spin_unlock_irqrestore(&t->task_state_lock, flags);
  2981. pm8001_dbg(pm8001_ha, FAIL,
  2982. "task 0x%p done with io_status 0x%x resp 0x%xstat 0x%x but aborted by upper layer!\n",
  2983. t, status, ts->resp, ts->stat);
  2984. pm8001_ccb_task_free(pm8001_ha, ccb);
  2985. } else {
  2986. spin_unlock_irqrestore(&t->task_state_lock, flags);
  2987. pm8001_ccb_task_free(pm8001_ha, ccb);
  2988. mb();/* in order to force CPU ordering */
  2989. t->task_done(t);
  2990. }
  2991. }
  2992. /**
  2993. * pm80xx_hw_event_ack_req- For PM8001, some events need to acknowledge to FW.
  2994. * @pm8001_ha: our hba card information
  2995. * @Qnum: the outbound queue message number.
  2996. * @SEA: source of event to ack
  2997. * @port_id: port id.
  2998. * @phyId: phy id.
  2999. * @param0: parameter 0.
  3000. * @param1: parameter 1.
  3001. */
  3002. static void pm80xx_hw_event_ack_req(struct pm8001_hba_info *pm8001_ha,
  3003. u32 Qnum, u32 SEA, u32 port_id, u32 phyId, u32 param0, u32 param1)
  3004. {
  3005. struct hw_event_ack_req payload;
  3006. u32 opc = OPC_INB_SAS_HW_EVENT_ACK;
  3007. memset((u8 *)&payload, 0, sizeof(payload));
  3008. payload.tag = cpu_to_le32(1);
  3009. payload.phyid_sea_portid = cpu_to_le32(((SEA & 0xFFFF) << 8) |
  3010. ((phyId & 0xFF) << 24) | (port_id & 0xFF));
  3011. payload.param0 = cpu_to_le32(param0);
  3012. payload.param1 = cpu_to_le32(param1);
  3013. pm8001_mpi_build_cmd(pm8001_ha, Qnum, opc, &payload,
  3014. sizeof(payload), 0);
  3015. }
  3016. static int pm80xx_chip_phy_ctl_req(struct pm8001_hba_info *pm8001_ha,
  3017. u32 phyId, u32 phy_op);
  3018. static void hw_event_port_recover(struct pm8001_hba_info *pm8001_ha,
  3019. void *piomb)
  3020. {
  3021. struct hw_event_resp *pPayload = (struct hw_event_resp *)(piomb + 4);
  3022. u32 phyid_npip_portstate = le32_to_cpu(pPayload->phyid_npip_portstate);
  3023. u8 phy_id = (u8)((phyid_npip_portstate & 0xFF0000) >> 16);
  3024. u32 lr_status_evt_portid =
  3025. le32_to_cpu(pPayload->lr_status_evt_portid);
  3026. u8 deviceType = pPayload->sas_identify.dev_type;
  3027. u8 link_rate = (u8)((lr_status_evt_portid & 0xF0000000) >> 28);
  3028. struct pm8001_phy *phy = &pm8001_ha->phy[phy_id];
  3029. u8 port_id = (u8)(lr_status_evt_portid & 0x000000FF);
  3030. struct pm8001_port *port = &pm8001_ha->port[port_id];
  3031. if (deviceType == SAS_END_DEVICE) {
  3032. pm80xx_chip_phy_ctl_req(pm8001_ha, phy_id,
  3033. PHY_NOTIFY_ENABLE_SPINUP);
  3034. }
  3035. port->wide_port_phymap |= (1U << phy_id);
  3036. pm8001_get_lrate_mode(phy, link_rate);
  3037. phy->sas_phy.oob_mode = SAS_OOB_MODE;
  3038. phy->phy_state = PHY_STATE_LINK_UP_SPCV;
  3039. phy->phy_attached = 1;
  3040. }
  3041. /**
  3042. * hw_event_sas_phy_up - FW tells me a SAS phy up event.
  3043. * @pm8001_ha: our hba card information
  3044. * @piomb: IO message buffer
  3045. */
  3046. static void
  3047. hw_event_sas_phy_up(struct pm8001_hba_info *pm8001_ha, void *piomb)
  3048. {
  3049. struct hw_event_resp *pPayload =
  3050. (struct hw_event_resp *)(piomb + 4);
  3051. u32 lr_status_evt_portid =
  3052. le32_to_cpu(pPayload->lr_status_evt_portid);
  3053. u32 phyid_npip_portstate = le32_to_cpu(pPayload->phyid_npip_portstate);
  3054. u8 link_rate =
  3055. (u8)((lr_status_evt_portid & 0xF0000000) >> 28);
  3056. u8 port_id = (u8)(lr_status_evt_portid & 0x000000FF);
  3057. u8 phy_id =
  3058. (u8)((phyid_npip_portstate & 0xFF0000) >> 16);
  3059. u8 portstate = (u8)(phyid_npip_portstate & 0x0000000F);
  3060. struct pm8001_port *port = &pm8001_ha->port[port_id];
  3061. struct pm8001_phy *phy = &pm8001_ha->phy[phy_id];
  3062. unsigned long flags;
  3063. u8 deviceType = pPayload->sas_identify.dev_type;
  3064. phy->port = port;
  3065. port->port_id = port_id;
  3066. port->port_state = portstate;
  3067. port->wide_port_phymap |= (1U << phy_id);
  3068. phy->phy_state = PHY_STATE_LINK_UP_SPCV;
  3069. pm8001_dbg(pm8001_ha, MSG,
  3070. "portid:%d; phyid:%d; linkrate:%d; portstate:%x; devicetype:%x\n",
  3071. port_id, phy_id, link_rate, portstate, deviceType);
  3072. switch (deviceType) {
  3073. case SAS_PHY_UNUSED:
  3074. pm8001_dbg(pm8001_ha, MSG, "device type no device.\n");
  3075. break;
  3076. case SAS_END_DEVICE:
  3077. pm8001_dbg(pm8001_ha, MSG, "end device.\n");
  3078. pm80xx_chip_phy_ctl_req(pm8001_ha, phy_id,
  3079. PHY_NOTIFY_ENABLE_SPINUP);
  3080. port->port_attached = 1;
  3081. pm8001_get_lrate_mode(phy, link_rate);
  3082. break;
  3083. case SAS_EDGE_EXPANDER_DEVICE:
  3084. pm8001_dbg(pm8001_ha, MSG, "expander device.\n");
  3085. port->port_attached = 1;
  3086. pm8001_get_lrate_mode(phy, link_rate);
  3087. break;
  3088. case SAS_FANOUT_EXPANDER_DEVICE:
  3089. pm8001_dbg(pm8001_ha, MSG, "fanout expander device.\n");
  3090. port->port_attached = 1;
  3091. pm8001_get_lrate_mode(phy, link_rate);
  3092. break;
  3093. default:
  3094. pm8001_dbg(pm8001_ha, DEVIO, "unknown device type(%x)\n",
  3095. deviceType);
  3096. break;
  3097. }
  3098. phy->phy_type |= PORT_TYPE_SAS;
  3099. phy->identify.device_type = deviceType;
  3100. phy->phy_attached = 1;
  3101. if (phy->identify.device_type == SAS_END_DEVICE)
  3102. phy->identify.target_port_protocols = SAS_PROTOCOL_SSP;
  3103. else if (phy->identify.device_type != SAS_PHY_UNUSED)
  3104. phy->identify.target_port_protocols = SAS_PROTOCOL_SMP;
  3105. phy->sas_phy.oob_mode = SAS_OOB_MODE;
  3106. sas_notify_phy_event(&phy->sas_phy, PHYE_OOB_DONE, GFP_ATOMIC);
  3107. spin_lock_irqsave(&phy->sas_phy.frame_rcvd_lock, flags);
  3108. memcpy(phy->frame_rcvd, &pPayload->sas_identify,
  3109. sizeof(struct sas_identify_frame)-4);
  3110. phy->frame_rcvd_size = sizeof(struct sas_identify_frame) - 4;
  3111. pm8001_get_attached_sas_addr(phy, phy->sas_phy.attached_sas_addr);
  3112. spin_unlock_irqrestore(&phy->sas_phy.frame_rcvd_lock, flags);
  3113. if (pm8001_ha->flags == PM8001F_RUN_TIME)
  3114. mdelay(200); /* delay a moment to wait for disk to spin up */
  3115. pm8001_bytes_dmaed(pm8001_ha, phy_id);
  3116. }
  3117. /**
  3118. * hw_event_sata_phy_up - FW tells me a SATA phy up event.
  3119. * @pm8001_ha: our hba card information
  3120. * @piomb: IO message buffer
  3121. */
  3122. static void
  3123. hw_event_sata_phy_up(struct pm8001_hba_info *pm8001_ha, void *piomb)
  3124. {
  3125. struct hw_event_resp *pPayload =
  3126. (struct hw_event_resp *)(piomb + 4);
  3127. u32 phyid_npip_portstate = le32_to_cpu(pPayload->phyid_npip_portstate);
  3128. u32 lr_status_evt_portid =
  3129. le32_to_cpu(pPayload->lr_status_evt_portid);
  3130. u8 link_rate =
  3131. (u8)((lr_status_evt_portid & 0xF0000000) >> 28);
  3132. u8 port_id = (u8)(lr_status_evt_portid & 0x000000FF);
  3133. u8 phy_id =
  3134. (u8)((phyid_npip_portstate & 0xFF0000) >> 16);
  3135. u8 portstate = (u8)(phyid_npip_portstate & 0x0000000F);
  3136. struct pm8001_port *port = &pm8001_ha->port[port_id];
  3137. struct pm8001_phy *phy = &pm8001_ha->phy[phy_id];
  3138. unsigned long flags;
  3139. pm8001_dbg(pm8001_ha, DEVIO,
  3140. "port id %d, phy id %d link_rate %d portstate 0x%x\n",
  3141. port_id, phy_id, link_rate, portstate);
  3142. phy->port = port;
  3143. port->port_id = port_id;
  3144. port->port_state = portstate;
  3145. phy->phy_state = PHY_STATE_LINK_UP_SPCV;
  3146. port->port_attached = 1;
  3147. pm8001_get_lrate_mode(phy, link_rate);
  3148. phy->phy_type |= PORT_TYPE_SATA;
  3149. phy->phy_attached = 1;
  3150. phy->sas_phy.oob_mode = SATA_OOB_MODE;
  3151. sas_notify_phy_event(&phy->sas_phy, PHYE_OOB_DONE, GFP_ATOMIC);
  3152. spin_lock_irqsave(&phy->sas_phy.frame_rcvd_lock, flags);
  3153. memcpy(phy->frame_rcvd, ((u8 *)&pPayload->sata_fis - 4),
  3154. sizeof(struct dev_to_host_fis));
  3155. phy->frame_rcvd_size = sizeof(struct dev_to_host_fis);
  3156. phy->identify.target_port_protocols = SAS_PROTOCOL_SATA;
  3157. phy->identify.device_type = SAS_SATA_DEV;
  3158. pm8001_get_attached_sas_addr(phy, phy->sas_phy.attached_sas_addr);
  3159. spin_unlock_irqrestore(&phy->sas_phy.frame_rcvd_lock, flags);
  3160. pm8001_bytes_dmaed(pm8001_ha, phy_id);
  3161. }
  3162. /**
  3163. * hw_event_phy_down - we should notify the libsas the phy is down.
  3164. * @pm8001_ha: our hba card information
  3165. * @piomb: IO message buffer
  3166. */
  3167. static void
  3168. hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
  3169. {
  3170. struct hw_event_resp *pPayload =
  3171. (struct hw_event_resp *)(piomb + 4);
  3172. u32 lr_status_evt_portid =
  3173. le32_to_cpu(pPayload->lr_status_evt_portid);
  3174. u8 port_id = (u8)(lr_status_evt_portid & 0x000000FF);
  3175. u32 phyid_npip_portstate = le32_to_cpu(pPayload->phyid_npip_portstate);
  3176. u8 phy_id =
  3177. (u8)((phyid_npip_portstate & 0xFF0000) >> 16);
  3178. u8 portstate = (u8)(phyid_npip_portstate & 0x0000000F);
  3179. struct pm8001_port *port = &pm8001_ha->port[port_id];
  3180. struct pm8001_phy *phy = &pm8001_ha->phy[phy_id];
  3181. u32 port_sata = (phy->phy_type & PORT_TYPE_SATA);
  3182. port->port_state = portstate;
  3183. phy->identify.device_type = 0;
  3184. phy->phy_attached = 0;
  3185. switch (portstate) {
  3186. case PORT_VALID:
  3187. break;
  3188. case PORT_INVALID:
  3189. pm8001_dbg(pm8001_ha, MSG, " PortInvalid portID %d\n",
  3190. port_id);
  3191. pm8001_dbg(pm8001_ha, MSG,
  3192. " Last phy Down and port invalid\n");
  3193. if (port_sata) {
  3194. phy->phy_type = 0;
  3195. port->port_attached = 0;
  3196. pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
  3197. port_id, phy_id, 0, 0);
  3198. }
  3199. sas_phy_disconnected(&phy->sas_phy);
  3200. break;
  3201. case PORT_IN_RESET:
  3202. pm8001_dbg(pm8001_ha, MSG, " Port In Reset portID %d\n",
  3203. port_id);
  3204. break;
  3205. case PORT_NOT_ESTABLISHED:
  3206. pm8001_dbg(pm8001_ha, MSG,
  3207. " Phy Down and PORT_NOT_ESTABLISHED\n");
  3208. port->port_attached = 0;
  3209. break;
  3210. case PORT_LOSTCOMM:
  3211. pm8001_dbg(pm8001_ha, MSG, " Phy Down and PORT_LOSTCOMM\n");
  3212. pm8001_dbg(pm8001_ha, MSG,
  3213. " Last phy Down and port invalid\n");
  3214. if (port_sata) {
  3215. port->port_attached = 0;
  3216. phy->phy_type = 0;
  3217. pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
  3218. port_id, phy_id, 0, 0);
  3219. }
  3220. sas_phy_disconnected(&phy->sas_phy);
  3221. break;
  3222. default:
  3223. port->port_attached = 0;
  3224. pm8001_dbg(pm8001_ha, DEVIO,
  3225. " Phy Down and(default) = 0x%x\n",
  3226. portstate);
  3227. break;
  3228. }
  3229. if (port_sata && (portstate != PORT_IN_RESET))
  3230. sas_notify_phy_event(&phy->sas_phy, PHYE_LOSS_OF_SIGNAL,
  3231. GFP_ATOMIC);
  3232. }
  3233. static int mpi_phy_start_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
  3234. {
  3235. struct phy_start_resp *pPayload =
  3236. (struct phy_start_resp *)(piomb + 4);
  3237. u32 status =
  3238. le32_to_cpu(pPayload->status);
  3239. u32 phy_id =
  3240. le32_to_cpu(pPayload->phyid) & 0xFF;
  3241. struct pm8001_phy *phy = &pm8001_ha->phy[phy_id];
  3242. pm8001_dbg(pm8001_ha, INIT,
  3243. "phy start resp status:0x%x, phyid:0x%x\n",
  3244. status, phy_id);
  3245. if (status == 0)
  3246. phy->phy_state = PHY_LINK_DOWN;
  3247. if (pm8001_ha->flags == PM8001F_RUN_TIME &&
  3248. phy->enable_completion != NULL) {
  3249. complete(phy->enable_completion);
  3250. phy->enable_completion = NULL;
  3251. }
  3252. return 0;
  3253. }
  3254. /**
  3255. * mpi_thermal_hw_event - a thermal hw event has come.
  3256. * @pm8001_ha: our hba card information
  3257. * @piomb: IO message buffer
  3258. */
  3259. static int mpi_thermal_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
  3260. {
  3261. struct thermal_hw_event *pPayload =
  3262. (struct thermal_hw_event *)(piomb + 4);
  3263. u32 thermal_event = le32_to_cpu(pPayload->thermal_event);
  3264. u32 rht_lht = le32_to_cpu(pPayload->rht_lht);
  3265. if (thermal_event & 0x40) {
  3266. pm8001_dbg(pm8001_ha, IO,
  3267. "Thermal Event: Local high temperature violated!\n");
  3268. pm8001_dbg(pm8001_ha, IO,
  3269. "Thermal Event: Measured local high temperature %d\n",
  3270. ((rht_lht & 0xFF00) >> 8));
  3271. }
  3272. if (thermal_event & 0x10) {
  3273. pm8001_dbg(pm8001_ha, IO,
  3274. "Thermal Event: Remote high temperature violated!\n");
  3275. pm8001_dbg(pm8001_ha, IO,
  3276. "Thermal Event: Measured remote high temperature %d\n",
  3277. ((rht_lht & 0xFF000000) >> 24));
  3278. }
  3279. return 0;
  3280. }
  3281. /**
  3282. * mpi_hw_event - The hw event has come.
  3283. * @pm8001_ha: our hba card information
  3284. * @piomb: IO message buffer
  3285. */
  3286. static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
  3287. {
  3288. unsigned long flags, i;
  3289. struct hw_event_resp *pPayload =
  3290. (struct hw_event_resp *)(piomb + 4);
  3291. u32 lr_status_evt_portid =
  3292. le32_to_cpu(pPayload->lr_status_evt_portid);
  3293. u32 phyid_npip_portstate = le32_to_cpu(pPayload->phyid_npip_portstate);
  3294. u8 port_id = (u8)(lr_status_evt_portid & 0x000000FF);
  3295. u8 phy_id =
  3296. (u8)((phyid_npip_portstate & 0xFF0000) >> 16);
  3297. u16 eventType =
  3298. (u16)((lr_status_evt_portid & 0x00FFFF00) >> 8);
  3299. u8 status =
  3300. (u8)((lr_status_evt_portid & 0x0F000000) >> 24);
  3301. struct sas_ha_struct *sas_ha = pm8001_ha->sas;
  3302. struct pm8001_phy *phy = &pm8001_ha->phy[phy_id];
  3303. struct pm8001_port *port = &pm8001_ha->port[port_id];
  3304. struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id];
  3305. pm8001_dbg(pm8001_ha, DEV,
  3306. "portid:%d phyid:%d event:0x%x status:0x%x\n",
  3307. port_id, phy_id, eventType, status);
  3308. switch (eventType) {
  3309. case HW_EVENT_SAS_PHY_UP:
  3310. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_PHY_START_STATUS\n");
  3311. hw_event_sas_phy_up(pm8001_ha, piomb);
  3312. break;
  3313. case HW_EVENT_SATA_PHY_UP:
  3314. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_SATA_PHY_UP\n");
  3315. hw_event_sata_phy_up(pm8001_ha, piomb);
  3316. break;
  3317. case HW_EVENT_SATA_SPINUP_HOLD:
  3318. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_SATA_SPINUP_HOLD\n");
  3319. sas_notify_phy_event(&phy->sas_phy, PHYE_SPINUP_HOLD,
  3320. GFP_ATOMIC);
  3321. break;
  3322. case HW_EVENT_PHY_DOWN:
  3323. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_PHY_DOWN\n");
  3324. hw_event_phy_down(pm8001_ha, piomb);
  3325. if (pm8001_ha->reset_in_progress) {
  3326. pm8001_dbg(pm8001_ha, MSG, "Reset in progress\n");
  3327. return 0;
  3328. }
  3329. phy->phy_attached = 0;
  3330. phy->phy_state = PHY_LINK_DISABLE;
  3331. break;
  3332. case HW_EVENT_PORT_INVALID:
  3333. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_PORT_INVALID\n");
  3334. sas_phy_disconnected(sas_phy);
  3335. phy->phy_attached = 0;
  3336. sas_notify_port_event(sas_phy, PORTE_LINK_RESET_ERR,
  3337. GFP_ATOMIC);
  3338. break;
  3339. /* the broadcast change primitive received, tell the LIBSAS this event
  3340. to revalidate the sas domain*/
  3341. case HW_EVENT_BROADCAST_CHANGE:
  3342. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_BROADCAST_CHANGE\n");
  3343. pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_BROADCAST_CHANGE,
  3344. port_id, phy_id, 1, 0);
  3345. spin_lock_irqsave(&sas_phy->sas_prim_lock, flags);
  3346. sas_phy->sas_prim = HW_EVENT_BROADCAST_CHANGE;
  3347. spin_unlock_irqrestore(&sas_phy->sas_prim_lock, flags);
  3348. sas_notify_port_event(sas_phy, PORTE_BROADCAST_RCVD,
  3349. GFP_ATOMIC);
  3350. break;
  3351. case HW_EVENT_PHY_ERROR:
  3352. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_PHY_ERROR\n");
  3353. sas_phy_disconnected(&phy->sas_phy);
  3354. phy->phy_attached = 0;
  3355. sas_notify_phy_event(&phy->sas_phy, PHYE_OOB_ERROR, GFP_ATOMIC);
  3356. break;
  3357. case HW_EVENT_BROADCAST_EXP:
  3358. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_BROADCAST_EXP\n");
  3359. spin_lock_irqsave(&sas_phy->sas_prim_lock, flags);
  3360. sas_phy->sas_prim = HW_EVENT_BROADCAST_EXP;
  3361. spin_unlock_irqrestore(&sas_phy->sas_prim_lock, flags);
  3362. sas_notify_port_event(sas_phy, PORTE_BROADCAST_RCVD,
  3363. GFP_ATOMIC);
  3364. break;
  3365. case HW_EVENT_LINK_ERR_INVALID_DWORD:
  3366. pm8001_dbg(pm8001_ha, MSG,
  3367. "HW_EVENT_LINK_ERR_INVALID_DWORD\n");
  3368. pm80xx_hw_event_ack_req(pm8001_ha, 0,
  3369. HW_EVENT_LINK_ERR_INVALID_DWORD, port_id, phy_id, 0, 0);
  3370. break;
  3371. case HW_EVENT_LINK_ERR_DISPARITY_ERROR:
  3372. pm8001_dbg(pm8001_ha, MSG,
  3373. "HW_EVENT_LINK_ERR_DISPARITY_ERROR\n");
  3374. pm80xx_hw_event_ack_req(pm8001_ha, 0,
  3375. HW_EVENT_LINK_ERR_DISPARITY_ERROR,
  3376. port_id, phy_id, 0, 0);
  3377. break;
  3378. case HW_EVENT_LINK_ERR_CODE_VIOLATION:
  3379. pm8001_dbg(pm8001_ha, MSG,
  3380. "HW_EVENT_LINK_ERR_CODE_VIOLATION\n");
  3381. pm80xx_hw_event_ack_req(pm8001_ha, 0,
  3382. HW_EVENT_LINK_ERR_CODE_VIOLATION,
  3383. port_id, phy_id, 0, 0);
  3384. break;
  3385. case HW_EVENT_LINK_ERR_LOSS_OF_DWORD_SYNCH:
  3386. pm8001_dbg(pm8001_ha, MSG,
  3387. "HW_EVENT_LINK_ERR_LOSS_OF_DWORD_SYNCH\n");
  3388. pm80xx_hw_event_ack_req(pm8001_ha, 0,
  3389. HW_EVENT_LINK_ERR_LOSS_OF_DWORD_SYNCH,
  3390. port_id, phy_id, 0, 0);
  3391. break;
  3392. case HW_EVENT_MALFUNCTION:
  3393. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_MALFUNCTION\n");
  3394. break;
  3395. case HW_EVENT_BROADCAST_SES:
  3396. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_BROADCAST_SES\n");
  3397. spin_lock_irqsave(&sas_phy->sas_prim_lock, flags);
  3398. sas_phy->sas_prim = HW_EVENT_BROADCAST_SES;
  3399. spin_unlock_irqrestore(&sas_phy->sas_prim_lock, flags);
  3400. sas_notify_port_event(sas_phy, PORTE_BROADCAST_RCVD,
  3401. GFP_ATOMIC);
  3402. break;
  3403. case HW_EVENT_INBOUND_CRC_ERROR:
  3404. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_INBOUND_CRC_ERROR\n");
  3405. pm80xx_hw_event_ack_req(pm8001_ha, 0,
  3406. HW_EVENT_INBOUND_CRC_ERROR,
  3407. port_id, phy_id, 0, 0);
  3408. break;
  3409. case HW_EVENT_HARD_RESET_RECEIVED:
  3410. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_HARD_RESET_RECEIVED\n");
  3411. sas_notify_port_event(sas_phy, PORTE_HARD_RESET, GFP_ATOMIC);
  3412. break;
  3413. case HW_EVENT_ID_FRAME_TIMEOUT:
  3414. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_ID_FRAME_TIMEOUT\n");
  3415. sas_phy_disconnected(sas_phy);
  3416. phy->phy_attached = 0;
  3417. sas_notify_port_event(sas_phy, PORTE_LINK_RESET_ERR,
  3418. GFP_ATOMIC);
  3419. break;
  3420. case HW_EVENT_LINK_ERR_PHY_RESET_FAILED:
  3421. pm8001_dbg(pm8001_ha, MSG,
  3422. "HW_EVENT_LINK_ERR_PHY_RESET_FAILED\n");
  3423. pm80xx_hw_event_ack_req(pm8001_ha, 0,
  3424. HW_EVENT_LINK_ERR_PHY_RESET_FAILED,
  3425. port_id, phy_id, 0, 0);
  3426. sas_phy_disconnected(sas_phy);
  3427. phy->phy_attached = 0;
  3428. sas_notify_port_event(sas_phy, PORTE_LINK_RESET_ERR,
  3429. GFP_ATOMIC);
  3430. break;
  3431. case HW_EVENT_PORT_RESET_TIMER_TMO:
  3432. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_PORT_RESET_TIMER_TMO\n");
  3433. if (!pm8001_ha->phy[phy_id].reset_completion) {
  3434. pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
  3435. port_id, phy_id, 0, 0);
  3436. }
  3437. sas_phy_disconnected(sas_phy);
  3438. phy->phy_attached = 0;
  3439. sas_notify_port_event(sas_phy, PORTE_LINK_RESET_ERR,
  3440. GFP_ATOMIC);
  3441. if (pm8001_ha->phy[phy_id].reset_completion) {
  3442. pm8001_ha->phy[phy_id].port_reset_status =
  3443. PORT_RESET_TMO;
  3444. complete(pm8001_ha->phy[phy_id].reset_completion);
  3445. pm8001_ha->phy[phy_id].reset_completion = NULL;
  3446. }
  3447. break;
  3448. case HW_EVENT_PORT_RECOVERY_TIMER_TMO:
  3449. pm8001_dbg(pm8001_ha, MSG,
  3450. "HW_EVENT_PORT_RECOVERY_TIMER_TMO\n");
  3451. pm80xx_hw_event_ack_req(pm8001_ha, 0,
  3452. HW_EVENT_PORT_RECOVERY_TIMER_TMO,
  3453. port_id, phy_id, 0, 0);
  3454. for (i = 0; i < pm8001_ha->chip->n_phy; i++) {
  3455. if (port->wide_port_phymap & (1 << i)) {
  3456. phy = &pm8001_ha->phy[i];
  3457. sas_notify_phy_event(&phy->sas_phy,
  3458. PHYE_LOSS_OF_SIGNAL, GFP_ATOMIC);
  3459. port->wide_port_phymap &= ~(1 << i);
  3460. }
  3461. }
  3462. break;
  3463. case HW_EVENT_PORT_RECOVER:
  3464. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_PORT_RECOVER\n");
  3465. hw_event_port_recover(pm8001_ha, piomb);
  3466. break;
  3467. case HW_EVENT_PORT_RESET_COMPLETE:
  3468. pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_PORT_RESET_COMPLETE\n");
  3469. if (pm8001_ha->phy[phy_id].reset_completion) {
  3470. pm8001_ha->phy[phy_id].port_reset_status =
  3471. PORT_RESET_SUCCESS;
  3472. complete(pm8001_ha->phy[phy_id].reset_completion);
  3473. pm8001_ha->phy[phy_id].reset_completion = NULL;
  3474. }
  3475. break;
  3476. case EVENT_BROADCAST_ASYNCH_EVENT:
  3477. pm8001_dbg(pm8001_ha, MSG, "EVENT_BROADCAST_ASYNCH_EVENT\n");
  3478. break;
  3479. default:
  3480. pm8001_dbg(pm8001_ha, DEVIO, "Unknown event type 0x%x\n",
  3481. eventType);
  3482. break;
  3483. }
  3484. return 0;
  3485. }
  3486. /**
  3487. * mpi_phy_stop_resp - SPCv specific
  3488. * @pm8001_ha: our hba card information
  3489. * @piomb: IO message buffer
  3490. */
  3491. static int mpi_phy_stop_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
  3492. {
  3493. struct phy_stop_resp *pPayload =
  3494. (struct phy_stop_resp *)(piomb + 4);
  3495. u32 status =
  3496. le32_to_cpu(pPayload->status);
  3497. u32 phyid =
  3498. le32_to_cpu(pPayload->phyid) & 0xFF;
  3499. struct pm8001_phy *phy = &pm8001_ha->phy[phyid];
  3500. pm8001_dbg(pm8001_ha, MSG, "phy:0x%x status:0x%x\n",
  3501. phyid, status);
  3502. if (status == PHY_STOP_SUCCESS ||
  3503. status == PHY_STOP_ERR_DEVICE_ATTACHED) {
  3504. phy->phy_state = PHY_LINK_DISABLE;
  3505. phy->sas_phy.phy->negotiated_linkrate = SAS_PHY_DISABLED;
  3506. phy->sas_phy.linkrate = SAS_PHY_DISABLED;
  3507. }
  3508. return 0;
  3509. }
  3510. /**
  3511. * mpi_set_controller_config_resp - SPCv specific
  3512. * @pm8001_ha: our hba card information
  3513. * @piomb: IO message buffer
  3514. */
  3515. static int mpi_set_controller_config_resp(struct pm8001_hba_info *pm8001_ha,
  3516. void *piomb)
  3517. {
  3518. struct set_ctrl_cfg_resp *pPayload =
  3519. (struct set_ctrl_cfg_resp *)(piomb + 4);
  3520. u32 status = le32_to_cpu(pPayload->status);
  3521. u32 err_qlfr_pgcd = le32_to_cpu(pPayload->err_qlfr_pgcd);
  3522. u32 tag = le32_to_cpu(pPayload->tag);
  3523. pm8001_dbg(pm8001_ha, MSG,
  3524. "SET CONTROLLER RESP: status 0x%x qlfr_pgcd 0x%x\n",
  3525. status, err_qlfr_pgcd);
  3526. pm8001_tag_free(pm8001_ha, tag);
  3527. return 0;
  3528. }
  3529. /**
  3530. * mpi_get_controller_config_resp - SPCv specific
  3531. * @pm8001_ha: our hba card information
  3532. * @piomb: IO message buffer
  3533. */
  3534. static int mpi_get_controller_config_resp(struct pm8001_hba_info *pm8001_ha,
  3535. void *piomb)
  3536. {
  3537. pm8001_dbg(pm8001_ha, MSG, " pm80xx_addition_functionality\n");
  3538. return 0;
  3539. }
  3540. /**
  3541. * mpi_get_phy_profile_resp - SPCv specific
  3542. * @pm8001_ha: our hba card information
  3543. * @piomb: IO message buffer
  3544. */
  3545. static int mpi_get_phy_profile_resp(struct pm8001_hba_info *pm8001_ha,
  3546. void *piomb)
  3547. {
  3548. pm8001_dbg(pm8001_ha, MSG, " pm80xx_addition_functionality\n");
  3549. return 0;
  3550. }
  3551. /**
  3552. * mpi_flash_op_ext_resp - SPCv specific
  3553. * @pm8001_ha: our hba card information
  3554. * @piomb: IO message buffer
  3555. */
  3556. static int mpi_flash_op_ext_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
  3557. {
  3558. pm8001_dbg(pm8001_ha, MSG, " pm80xx_addition_functionality\n");
  3559. return 0;
  3560. }
  3561. /**
  3562. * mpi_set_phy_profile_resp - SPCv specific
  3563. * @pm8001_ha: our hba card information
  3564. * @piomb: IO message buffer
  3565. */
  3566. static int mpi_set_phy_profile_resp(struct pm8001_hba_info *pm8001_ha,
  3567. void *piomb)
  3568. {
  3569. u32 tag;
  3570. u8 page_code;
  3571. int rc = 0;
  3572. struct set_phy_profile_resp *pPayload =
  3573. (struct set_phy_profile_resp *)(piomb + 4);
  3574. u32 ppc_phyid = le32_to_cpu(pPayload->ppc_phyid);
  3575. u32 status = le32_to_cpu(pPayload->status);
  3576. tag = le32_to_cpu(pPayload->tag);
  3577. page_code = (u8)((ppc_phyid & 0xFF00) >> 8);
  3578. if (status) {
  3579. /* status is FAILED */
  3580. pm8001_dbg(pm8001_ha, FAIL,
  3581. "PhyProfile command failed with status 0x%08X\n",
  3582. status);
  3583. rc = -1;
  3584. } else {
  3585. if (page_code != SAS_PHY_ANALOG_SETTINGS_PAGE) {
  3586. pm8001_dbg(pm8001_ha, FAIL, "Invalid page code 0x%X\n",
  3587. page_code);
  3588. rc = -1;
  3589. }
  3590. }
  3591. pm8001_tag_free(pm8001_ha, tag);
  3592. return rc;
  3593. }
  3594. /**
  3595. * mpi_kek_management_resp - SPCv specific
  3596. * @pm8001_ha: our hba card information
  3597. * @piomb: IO message buffer
  3598. */
  3599. static int mpi_kek_management_resp(struct pm8001_hba_info *pm8001_ha,
  3600. void *piomb)
  3601. {
  3602. struct kek_mgmt_resp *pPayload = (struct kek_mgmt_resp *)(piomb + 4);
  3603. u32 status = le32_to_cpu(pPayload->status);
  3604. u32 kidx_new_curr_ksop = le32_to_cpu(pPayload->kidx_new_curr_ksop);
  3605. u32 err_qlfr = le32_to_cpu(pPayload->err_qlfr);
  3606. pm8001_dbg(pm8001_ha, MSG,
  3607. "KEK MGMT RESP. Status 0x%x idx_ksop 0x%x err_qlfr 0x%x\n",
  3608. status, kidx_new_curr_ksop, err_qlfr);
  3609. return 0;
  3610. }
  3611. /**
  3612. * mpi_dek_management_resp - SPCv specific
  3613. * @pm8001_ha: our hba card information
  3614. * @piomb: IO message buffer
  3615. */
  3616. static int mpi_dek_management_resp(struct pm8001_hba_info *pm8001_ha,
  3617. void *piomb)
  3618. {
  3619. pm8001_dbg(pm8001_ha, MSG, " pm80xx_addition_functionality\n");
  3620. return 0;
  3621. }
  3622. /**
  3623. * ssp_coalesced_comp_resp - SPCv specific
  3624. * @pm8001_ha: our hba card information
  3625. * @piomb: IO message buffer
  3626. */
  3627. static int ssp_coalesced_comp_resp(struct pm8001_hba_info *pm8001_ha,
  3628. void *piomb)
  3629. {
  3630. pm8001_dbg(pm8001_ha, MSG, " pm80xx_addition_functionality\n");
  3631. return 0;
  3632. }
  3633. /**
  3634. * process_one_iomb - process one outbound Queue memory block
  3635. * @pm8001_ha: our hba card information
  3636. * @circularQ: outbound circular queue
  3637. * @piomb: IO message buffer
  3638. */
  3639. static void process_one_iomb(struct pm8001_hba_info *pm8001_ha,
  3640. struct outbound_queue_table *circularQ, void *piomb)
  3641. {
  3642. __le32 pHeader = *(__le32 *)piomb;
  3643. u32 opc = (u32)((le32_to_cpu(pHeader)) & 0xFFF);
  3644. switch (opc) {
  3645. case OPC_OUB_ECHO:
  3646. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_ECHO\n");
  3647. break;
  3648. case OPC_OUB_HW_EVENT:
  3649. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_HW_EVENT\n");
  3650. mpi_hw_event(pm8001_ha, piomb);
  3651. break;
  3652. case OPC_OUB_THERM_HW_EVENT:
  3653. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_THERMAL_EVENT\n");
  3654. mpi_thermal_hw_event(pm8001_ha, piomb);
  3655. break;
  3656. case OPC_OUB_SSP_COMP:
  3657. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SSP_COMP\n");
  3658. mpi_ssp_completion(pm8001_ha, piomb);
  3659. break;
  3660. case OPC_OUB_SMP_COMP:
  3661. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SMP_COMP\n");
  3662. mpi_smp_completion(pm8001_ha, piomb);
  3663. break;
  3664. case OPC_OUB_LOCAL_PHY_CNTRL:
  3665. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_LOCAL_PHY_CNTRL\n");
  3666. pm8001_mpi_local_phy_ctl(pm8001_ha, piomb);
  3667. break;
  3668. case OPC_OUB_DEV_REGIST:
  3669. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_DEV_REGIST\n");
  3670. pm8001_mpi_reg_resp(pm8001_ha, piomb);
  3671. break;
  3672. case OPC_OUB_DEREG_DEV:
  3673. pm8001_dbg(pm8001_ha, MSG, "unregister the device\n");
  3674. pm8001_mpi_dereg_resp(pm8001_ha, piomb);
  3675. break;
  3676. case OPC_OUB_GET_DEV_HANDLE:
  3677. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_GET_DEV_HANDLE\n");
  3678. break;
  3679. case OPC_OUB_SATA_COMP:
  3680. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SATA_COMP\n");
  3681. mpi_sata_completion(pm8001_ha, circularQ, piomb);
  3682. break;
  3683. case OPC_OUB_SATA_EVENT:
  3684. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SATA_EVENT\n");
  3685. mpi_sata_event(pm8001_ha, circularQ, piomb);
  3686. break;
  3687. case OPC_OUB_SSP_EVENT:
  3688. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SSP_EVENT\n");
  3689. mpi_ssp_event(pm8001_ha, piomb);
  3690. break;
  3691. case OPC_OUB_DEV_HANDLE_ARRIV:
  3692. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_DEV_HANDLE_ARRIV\n");
  3693. /*This is for target*/
  3694. break;
  3695. case OPC_OUB_SSP_RECV_EVENT:
  3696. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SSP_RECV_EVENT\n");
  3697. /*This is for target*/
  3698. break;
  3699. case OPC_OUB_FW_FLASH_UPDATE:
  3700. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_FW_FLASH_UPDATE\n");
  3701. pm8001_mpi_fw_flash_update_resp(pm8001_ha, piomb);
  3702. break;
  3703. case OPC_OUB_GPIO_RESPONSE:
  3704. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_GPIO_RESPONSE\n");
  3705. break;
  3706. case OPC_OUB_GPIO_EVENT:
  3707. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_GPIO_EVENT\n");
  3708. break;
  3709. case OPC_OUB_GENERAL_EVENT:
  3710. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_GENERAL_EVENT\n");
  3711. pm8001_mpi_general_event(pm8001_ha, piomb);
  3712. break;
  3713. case OPC_OUB_SSP_ABORT_RSP:
  3714. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SSP_ABORT_RSP\n");
  3715. pm8001_mpi_task_abort_resp(pm8001_ha, piomb);
  3716. break;
  3717. case OPC_OUB_SATA_ABORT_RSP:
  3718. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SATA_ABORT_RSP\n");
  3719. pm8001_mpi_task_abort_resp(pm8001_ha, piomb);
  3720. break;
  3721. case OPC_OUB_SAS_DIAG_MODE_START_END:
  3722. pm8001_dbg(pm8001_ha, MSG,
  3723. "OPC_OUB_SAS_DIAG_MODE_START_END\n");
  3724. break;
  3725. case OPC_OUB_SAS_DIAG_EXECUTE:
  3726. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SAS_DIAG_EXECUTE\n");
  3727. break;
  3728. case OPC_OUB_GET_TIME_STAMP:
  3729. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_GET_TIME_STAMP\n");
  3730. break;
  3731. case OPC_OUB_SAS_HW_EVENT_ACK:
  3732. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SAS_HW_EVENT_ACK\n");
  3733. break;
  3734. case OPC_OUB_PORT_CONTROL:
  3735. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_PORT_CONTROL\n");
  3736. break;
  3737. case OPC_OUB_SMP_ABORT_RSP:
  3738. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SMP_ABORT_RSP\n");
  3739. pm8001_mpi_task_abort_resp(pm8001_ha, piomb);
  3740. break;
  3741. case OPC_OUB_GET_NVMD_DATA:
  3742. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_GET_NVMD_DATA\n");
  3743. pm8001_mpi_get_nvmd_resp(pm8001_ha, piomb);
  3744. break;
  3745. case OPC_OUB_SET_NVMD_DATA:
  3746. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SET_NVMD_DATA\n");
  3747. pm8001_mpi_set_nvmd_resp(pm8001_ha, piomb);
  3748. break;
  3749. case OPC_OUB_DEVICE_HANDLE_REMOVAL:
  3750. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_DEVICE_HANDLE_REMOVAL\n");
  3751. break;
  3752. case OPC_OUB_SET_DEVICE_STATE:
  3753. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SET_DEVICE_STATE\n");
  3754. pm8001_mpi_set_dev_state_resp(pm8001_ha, piomb);
  3755. break;
  3756. case OPC_OUB_GET_DEVICE_STATE:
  3757. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_GET_DEVICE_STATE\n");
  3758. break;
  3759. case OPC_OUB_SET_DEV_INFO:
  3760. pm8001_dbg(pm8001_ha, MSG, "OPC_OUB_SET_DEV_INFO\n");
  3761. break;
  3762. /* spcv specific commands */
  3763. case OPC_OUB_PHY_START_RESP:
  3764. pm8001_dbg(pm8001_ha, MSG,
  3765. "OPC_OUB_PHY_START_RESP opcode:%x\n", opc);
  3766. mpi_phy_start_resp(pm8001_ha, piomb);
  3767. break;
  3768. case OPC_OUB_PHY_STOP_RESP:
  3769. pm8001_dbg(pm8001_ha, MSG,
  3770. "OPC_OUB_PHY_STOP_RESP opcode:%x\n", opc);
  3771. mpi_phy_stop_resp(pm8001_ha, piomb);
  3772. break;
  3773. case OPC_OUB_SET_CONTROLLER_CONFIG:
  3774. pm8001_dbg(pm8001_ha, MSG,
  3775. "OPC_OUB_SET_CONTROLLER_CONFIG opcode:%x\n", opc);
  3776. mpi_set_controller_config_resp(pm8001_ha, piomb);
  3777. break;
  3778. case OPC_OUB_GET_CONTROLLER_CONFIG:
  3779. pm8001_dbg(pm8001_ha, MSG,
  3780. "OPC_OUB_GET_CONTROLLER_CONFIG opcode:%x\n", opc);
  3781. mpi_get_controller_config_resp(pm8001_ha, piomb);
  3782. break;
  3783. case OPC_OUB_GET_PHY_PROFILE:
  3784. pm8001_dbg(pm8001_ha, MSG,
  3785. "OPC_OUB_GET_PHY_PROFILE opcode:%x\n", opc);
  3786. mpi_get_phy_profile_resp(pm8001_ha, piomb);
  3787. break;
  3788. case OPC_OUB_FLASH_OP_EXT:
  3789. pm8001_dbg(pm8001_ha, MSG,
  3790. "OPC_OUB_FLASH_OP_EXT opcode:%x\n", opc);
  3791. mpi_flash_op_ext_resp(pm8001_ha, piomb);
  3792. break;
  3793. case OPC_OUB_SET_PHY_PROFILE:
  3794. pm8001_dbg(pm8001_ha, MSG,
  3795. "OPC_OUB_SET_PHY_PROFILE opcode:%x\n", opc);
  3796. mpi_set_phy_profile_resp(pm8001_ha, piomb);
  3797. break;
  3798. case OPC_OUB_KEK_MANAGEMENT_RESP:
  3799. pm8001_dbg(pm8001_ha, MSG,
  3800. "OPC_OUB_KEK_MANAGEMENT_RESP opcode:%x\n", opc);
  3801. mpi_kek_management_resp(pm8001_ha, piomb);
  3802. break;
  3803. case OPC_OUB_DEK_MANAGEMENT_RESP:
  3804. pm8001_dbg(pm8001_ha, MSG,
  3805. "OPC_OUB_DEK_MANAGEMENT_RESP opcode:%x\n", opc);
  3806. mpi_dek_management_resp(pm8001_ha, piomb);
  3807. break;
  3808. case OPC_OUB_SSP_COALESCED_COMP_RESP:
  3809. pm8001_dbg(pm8001_ha, MSG,
  3810. "OPC_OUB_SSP_COALESCED_COMP_RESP opcode:%x\n", opc);
  3811. ssp_coalesced_comp_resp(pm8001_ha, piomb);
  3812. break;
  3813. default:
  3814. pm8001_dbg(pm8001_ha, DEVIO,
  3815. "Unknown outbound Queue IOMB OPC = 0x%x\n", opc);
  3816. break;
  3817. }
  3818. }
  3819. static void print_scratchpad_registers(struct pm8001_hba_info *pm8001_ha)
  3820. {
  3821. pm8001_dbg(pm8001_ha, FAIL, "MSGU_SCRATCH_PAD_0: 0x%x\n",
  3822. pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_0));
  3823. pm8001_dbg(pm8001_ha, FAIL, "MSGU_SCRATCH_PAD_1:0x%x\n",
  3824. pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1));
  3825. pm8001_dbg(pm8001_ha, FAIL, "MSGU_SCRATCH_PAD_2: 0x%x\n",
  3826. pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_2));
  3827. pm8001_dbg(pm8001_ha, FAIL, "MSGU_SCRATCH_PAD_3: 0x%x\n",
  3828. pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_3));
  3829. pm8001_dbg(pm8001_ha, FAIL, "MSGU_HOST_SCRATCH_PAD_0: 0x%x\n",
  3830. pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_0));
  3831. pm8001_dbg(pm8001_ha, FAIL, "MSGU_HOST_SCRATCH_PAD_1: 0x%x\n",
  3832. pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_1));
  3833. pm8001_dbg(pm8001_ha, FAIL, "MSGU_HOST_SCRATCH_PAD_2: 0x%x\n",
  3834. pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_2));
  3835. pm8001_dbg(pm8001_ha, FAIL, "MSGU_HOST_SCRATCH_PAD_3: 0x%x\n",
  3836. pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_3));
  3837. pm8001_dbg(pm8001_ha, FAIL, "MSGU_HOST_SCRATCH_PAD_4: 0x%x\n",
  3838. pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_4));
  3839. pm8001_dbg(pm8001_ha, FAIL, "MSGU_HOST_SCRATCH_PAD_5: 0x%x\n",
  3840. pm8001_cr32(pm8001_ha, 0, MSGU_HOST_SCRATCH_PAD_5));
  3841. pm8001_dbg(pm8001_ha, FAIL, "MSGU_RSVD_SCRATCH_PAD_0: 0x%x\n",
  3842. pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_RSVD_0));
  3843. pm8001_dbg(pm8001_ha, FAIL, "MSGU_RSVD_SCRATCH_PAD_1: 0x%x\n",
  3844. pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_RSVD_1));
  3845. }
  3846. static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec)
  3847. {
  3848. struct outbound_queue_table *circularQ;
  3849. void *pMsg1 = NULL;
  3850. u8 bc;
  3851. u32 ret = MPI_IO_STATUS_FAIL;
  3852. u32 regval;
  3853. /*
  3854. * Fatal errors are programmed to be signalled in irq vector
  3855. * pm8001_ha->max_q_num - 1 through pm8001_ha->main_cfg_tbl.pm80xx_tbl.
  3856. * fatal_err_interrupt
  3857. */
  3858. if (vec == (pm8001_ha->max_q_num - 1)) {
  3859. u32 mipsall_ready;
  3860. if (pm8001_ha->chip_id == chip_8008 ||
  3861. pm8001_ha->chip_id == chip_8009)
  3862. mipsall_ready = SCRATCH_PAD_MIPSALL_READY_8PORT;
  3863. else
  3864. mipsall_ready = SCRATCH_PAD_MIPSALL_READY_16PORT;
  3865. regval = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1);
  3866. if ((regval & mipsall_ready) != mipsall_ready) {
  3867. pm8001_ha->controller_fatal_error = true;
  3868. pm8001_dbg(pm8001_ha, FAIL,
  3869. "Firmware Fatal error! Regval:0x%x\n",
  3870. regval);
  3871. pm8001_handle_event(pm8001_ha, NULL, IO_FATAL_ERROR);
  3872. print_scratchpad_registers(pm8001_ha);
  3873. return ret;
  3874. } else {
  3875. /*read scratchpad rsvd 0 register*/
  3876. regval = pm8001_cr32(pm8001_ha, 0,
  3877. MSGU_SCRATCH_PAD_RSVD_0);
  3878. switch (regval) {
  3879. case NON_FATAL_SPBC_LBUS_ECC_ERR:
  3880. case NON_FATAL_BDMA_ERR:
  3881. case NON_FATAL_THERM_OVERTEMP_ERR:
  3882. /*Clear the register*/
  3883. pm8001_cw32(pm8001_ha, 0,
  3884. MSGU_SCRATCH_PAD_RSVD_0,
  3885. 0x00000000);
  3886. break;
  3887. default:
  3888. break;
  3889. }
  3890. }
  3891. }
  3892. circularQ = &pm8001_ha->outbnd_q_tbl[vec];
  3893. spin_lock_irqsave(&circularQ->oq_lock, circularQ->lock_flags);
  3894. do {
  3895. /* spurious interrupt during setup if kexec-ing and
  3896. * driver doing a doorbell access w/ the pre-kexec oq
  3897. * interrupt setup.
  3898. */
  3899. if (!circularQ->pi_virt)
  3900. break;
  3901. ret = pm8001_mpi_msg_consume(pm8001_ha, circularQ, &pMsg1, &bc);
  3902. if (MPI_IO_STATUS_SUCCESS == ret) {
  3903. /* process the outbound message */
  3904. process_one_iomb(pm8001_ha, circularQ,
  3905. (void *)(pMsg1 - 4));
  3906. /* free the message from the outbound circular buffer */
  3907. pm8001_mpi_msg_free_set(pm8001_ha, pMsg1,
  3908. circularQ, bc);
  3909. }
  3910. if (MPI_IO_STATUS_BUSY == ret) {
  3911. /* Update the producer index from SPC */
  3912. circularQ->producer_index =
  3913. cpu_to_le32(pm8001_read_32(circularQ->pi_virt));
  3914. if (le32_to_cpu(circularQ->producer_index) ==
  3915. circularQ->consumer_idx)
  3916. /* OQ is empty */
  3917. break;
  3918. }
  3919. } while (1);
  3920. spin_unlock_irqrestore(&circularQ->oq_lock, circularQ->lock_flags);
  3921. return ret;
  3922. }
  3923. /* DMA_... to our direction translation. */
  3924. static const u8 data_dir_flags[] = {
  3925. [DMA_BIDIRECTIONAL] = DATA_DIR_BYRECIPIENT, /* UNSPECIFIED */
  3926. [DMA_TO_DEVICE] = DATA_DIR_OUT, /* OUTBOUND */
  3927. [DMA_FROM_DEVICE] = DATA_DIR_IN, /* INBOUND */
  3928. [DMA_NONE] = DATA_DIR_NONE, /* NO TRANSFER */
  3929. };
  3930. static void build_smp_cmd(u32 deviceID, __le32 hTag,
  3931. struct smp_req *psmp_cmd, int mode, int length)
  3932. {
  3933. psmp_cmd->tag = hTag;
  3934. psmp_cmd->device_id = cpu_to_le32(deviceID);
  3935. if (mode == SMP_DIRECT) {
  3936. length = length - 4; /* subtract crc */
  3937. psmp_cmd->len_ip_ir = cpu_to_le32(length << 16);
  3938. } else {
  3939. psmp_cmd->len_ip_ir = cpu_to_le32(1|(1 << 1));
  3940. }
  3941. }
  3942. /**
  3943. * pm80xx_chip_smp_req - send an SMP task to FW
  3944. * @pm8001_ha: our hba card information.
  3945. * @ccb: the ccb information this request used.
  3946. */
  3947. static int pm80xx_chip_smp_req(struct pm8001_hba_info *pm8001_ha,
  3948. struct pm8001_ccb_info *ccb)
  3949. {
  3950. int elem, rc;
  3951. struct sas_task *task = ccb->task;
  3952. struct domain_device *dev = task->dev;
  3953. struct pm8001_device *pm8001_dev = dev->lldd_dev;
  3954. struct scatterlist *sg_req, *sg_resp, *smp_req;
  3955. u32 req_len, resp_len;
  3956. struct smp_req smp_cmd;
  3957. u32 opc;
  3958. u32 i, length;
  3959. u8 *payload;
  3960. u8 *to;
  3961. memset(&smp_cmd, 0, sizeof(smp_cmd));
  3962. /*
  3963. * DMA-map SMP request, response buffers
  3964. */
  3965. sg_req = &task->smp_task.smp_req;
  3966. elem = dma_map_sg(pm8001_ha->dev, sg_req, 1, DMA_TO_DEVICE);
  3967. if (!elem)
  3968. return -ENOMEM;
  3969. req_len = sg_dma_len(sg_req);
  3970. sg_resp = &task->smp_task.smp_resp;
  3971. elem = dma_map_sg(pm8001_ha->dev, sg_resp, 1, DMA_FROM_DEVICE);
  3972. if (!elem) {
  3973. rc = -ENOMEM;
  3974. goto err_out;
  3975. }
  3976. resp_len = sg_dma_len(sg_resp);
  3977. /* must be in dwords */
  3978. if ((req_len & 0x3) || (resp_len & 0x3)) {
  3979. rc = -EINVAL;
  3980. goto err_out_2;
  3981. }
  3982. opc = OPC_INB_SMP_REQUEST;
  3983. smp_cmd.tag = cpu_to_le32(ccb->ccb_tag);
  3984. length = sg_req->length;
  3985. pm8001_dbg(pm8001_ha, IO, "SMP Frame Length %d\n", sg_req->length);
  3986. if (!(length - 8))
  3987. pm8001_ha->smp_exp_mode = SMP_DIRECT;
  3988. else
  3989. pm8001_ha->smp_exp_mode = SMP_INDIRECT;
  3990. smp_req = &task->smp_task.smp_req;
  3991. to = kmap_atomic(sg_page(smp_req));
  3992. payload = to + smp_req->offset;
  3993. /* INDIRECT MODE command settings. Use DMA */
  3994. if (pm8001_ha->smp_exp_mode == SMP_INDIRECT) {
  3995. pm8001_dbg(pm8001_ha, IO, "SMP REQUEST INDIRECT MODE\n");
  3996. /* for SPCv indirect mode. Place the top 4 bytes of
  3997. * SMP Request header here. */
  3998. for (i = 0; i < 4; i++)
  3999. smp_cmd.smp_req16[i] = *(payload + i);
  4000. /* exclude top 4 bytes for SMP req header */
  4001. smp_cmd.long_smp_req.long_req_addr =
  4002. cpu_to_le64((u64)sg_dma_address
  4003. (&task->smp_task.smp_req) + 4);
  4004. /* exclude 4 bytes for SMP req header and CRC */
  4005. smp_cmd.long_smp_req.long_req_size =
  4006. cpu_to_le32((u32)sg_dma_len(&task->smp_task.smp_req)-8);
  4007. smp_cmd.long_smp_req.long_resp_addr =
  4008. cpu_to_le64((u64)sg_dma_address
  4009. (&task->smp_task.smp_resp));
  4010. smp_cmd.long_smp_req.long_resp_size =
  4011. cpu_to_le32((u32)sg_dma_len
  4012. (&task->smp_task.smp_resp)-4);
  4013. } else { /* DIRECT MODE */
  4014. smp_cmd.long_smp_req.long_req_addr =
  4015. cpu_to_le64((u64)sg_dma_address
  4016. (&task->smp_task.smp_req));
  4017. smp_cmd.long_smp_req.long_req_size =
  4018. cpu_to_le32((u32)sg_dma_len(&task->smp_task.smp_req)-4);
  4019. smp_cmd.long_smp_req.long_resp_addr =
  4020. cpu_to_le64((u64)sg_dma_address
  4021. (&task->smp_task.smp_resp));
  4022. smp_cmd.long_smp_req.long_resp_size =
  4023. cpu_to_le32
  4024. ((u32)sg_dma_len(&task->smp_task.smp_resp)-4);
  4025. }
  4026. if (pm8001_ha->smp_exp_mode == SMP_DIRECT) {
  4027. pm8001_dbg(pm8001_ha, IO, "SMP REQUEST DIRECT MODE\n");
  4028. for (i = 0; i < length; i++)
  4029. if (i < 16) {
  4030. smp_cmd.smp_req16[i] = *(payload + i);
  4031. pm8001_dbg(pm8001_ha, IO,
  4032. "Byte[%d]:%x (DMA data:%x)\n",
  4033. i, smp_cmd.smp_req16[i],
  4034. *(payload));
  4035. } else {
  4036. smp_cmd.smp_req[i] = *(payload + i);
  4037. pm8001_dbg(pm8001_ha, IO,
  4038. "Byte[%d]:%x (DMA data:%x)\n",
  4039. i, smp_cmd.smp_req[i],
  4040. *(payload));
  4041. }
  4042. }
  4043. kunmap_atomic(to);
  4044. build_smp_cmd(pm8001_dev->device_id, smp_cmd.tag,
  4045. &smp_cmd, pm8001_ha->smp_exp_mode, length);
  4046. rc = pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &smp_cmd,
  4047. sizeof(smp_cmd), 0);
  4048. if (rc)
  4049. goto err_out_2;
  4050. return 0;
  4051. err_out_2:
  4052. dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_resp, 1,
  4053. DMA_FROM_DEVICE);
  4054. err_out:
  4055. dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_req, 1,
  4056. DMA_TO_DEVICE);
  4057. return rc;
  4058. }
  4059. static int check_enc_sas_cmd(struct sas_task *task)
  4060. {
  4061. u8 cmd = task->ssp_task.cmd->cmnd[0];
  4062. if (cmd == READ_10 || cmd == WRITE_10 || cmd == WRITE_VERIFY)
  4063. return 1;
  4064. else
  4065. return 0;
  4066. }
  4067. static int check_enc_sat_cmd(struct sas_task *task)
  4068. {
  4069. int ret = 0;
  4070. switch (task->ata_task.fis.command) {
  4071. case ATA_CMD_FPDMA_READ:
  4072. case ATA_CMD_READ_EXT:
  4073. case ATA_CMD_READ:
  4074. case ATA_CMD_FPDMA_WRITE:
  4075. case ATA_CMD_WRITE_EXT:
  4076. case ATA_CMD_WRITE:
  4077. case ATA_CMD_PIO_READ:
  4078. case ATA_CMD_PIO_READ_EXT:
  4079. case ATA_CMD_PIO_WRITE:
  4080. case ATA_CMD_PIO_WRITE_EXT:
  4081. ret = 1;
  4082. break;
  4083. default:
  4084. ret = 0;
  4085. break;
  4086. }
  4087. return ret;
  4088. }
  4089. static u32 pm80xx_chip_get_q_index(struct sas_task *task)
  4090. {
  4091. struct scsi_cmnd *scmd = NULL;
  4092. u32 blk_tag;
  4093. if (task->uldd_task) {
  4094. struct ata_queued_cmd *qc;
  4095. if (dev_is_sata(task->dev)) {
  4096. qc = task->uldd_task;
  4097. scmd = qc->scsicmd;
  4098. } else {
  4099. scmd = task->uldd_task;
  4100. }
  4101. }
  4102. if (!scmd)
  4103. return 0;
  4104. blk_tag = blk_mq_unique_tag(scsi_cmd_to_rq(scmd));
  4105. return blk_mq_unique_tag_to_hwq(blk_tag);
  4106. }
  4107. /**
  4108. * pm80xx_chip_ssp_io_req - send an SSP task to FW
  4109. * @pm8001_ha: our hba card information.
  4110. * @ccb: the ccb information this request used.
  4111. */
  4112. static int pm80xx_chip_ssp_io_req(struct pm8001_hba_info *pm8001_ha,
  4113. struct pm8001_ccb_info *ccb)
  4114. {
  4115. struct sas_task *task = ccb->task;
  4116. struct domain_device *dev = task->dev;
  4117. struct pm8001_device *pm8001_dev = dev->lldd_dev;
  4118. struct ssp_ini_io_start_req ssp_cmd;
  4119. u32 tag = ccb->ccb_tag;
  4120. u64 phys_addr, end_addr;
  4121. u32 end_addr_high, end_addr_low;
  4122. u32 q_index;
  4123. u32 opc = OPC_INB_SSPINIIOSTART;
  4124. memset(&ssp_cmd, 0, sizeof(ssp_cmd));
  4125. memcpy(ssp_cmd.ssp_iu.lun, task->ssp_task.LUN, 8);
  4126. /* data address domain added for spcv; set to 0 by host,
  4127. * used internally by controller
  4128. * 0 for SAS 1.1 and SAS 2.0 compatible TLR
  4129. */
  4130. ssp_cmd.dad_dir_m_tlr =
  4131. cpu_to_le32(data_dir_flags[task->data_dir] << 8 | 0x0);
  4132. ssp_cmd.data_len = cpu_to_le32(task->total_xfer_len);
  4133. ssp_cmd.device_id = cpu_to_le32(pm8001_dev->device_id);
  4134. ssp_cmd.tag = cpu_to_le32(tag);
  4135. if (task->ssp_task.enable_first_burst)
  4136. ssp_cmd.ssp_iu.efb_prio_attr = 0x80;
  4137. ssp_cmd.ssp_iu.efb_prio_attr |= (task->ssp_task.task_prio << 3);
  4138. ssp_cmd.ssp_iu.efb_prio_attr |= (task->ssp_task.task_attr & 7);
  4139. memcpy(ssp_cmd.ssp_iu.cdb, task->ssp_task.cmd->cmnd,
  4140. task->ssp_task.cmd->cmd_len);
  4141. q_index = pm80xx_chip_get_q_index(task);
  4142. /* Check if encryption is set */
  4143. if (pm8001_ha->chip->encrypt &&
  4144. !(pm8001_ha->encrypt_info.status) && check_enc_sas_cmd(task)) {
  4145. pm8001_dbg(pm8001_ha, IO,
  4146. "Encryption enabled.Sending Encrypt SAS command 0x%x\n",
  4147. task->ssp_task.cmd->cmnd[0]);
  4148. opc = OPC_INB_SSP_INI_DIF_ENC_IO;
  4149. /* enable encryption. 0 for SAS 1.1 and SAS 2.0 compatible TLR*/
  4150. ssp_cmd.dad_dir_m_tlr = cpu_to_le32
  4151. ((data_dir_flags[task->data_dir] << 8) | 0x20 | 0x0);
  4152. /* fill in PRD (scatter/gather) table, if any */
  4153. if (task->num_scatter > 1) {
  4154. pm8001_chip_make_sg(task->scatter,
  4155. ccb->n_elem, ccb->buf_prd);
  4156. phys_addr = ccb->ccb_dma_handle;
  4157. ssp_cmd.enc_addr_low =
  4158. cpu_to_le32(lower_32_bits(phys_addr));
  4159. ssp_cmd.enc_addr_high =
  4160. cpu_to_le32(upper_32_bits(phys_addr));
  4161. ssp_cmd.enc_esgl = cpu_to_le32(1<<31);
  4162. } else if (task->num_scatter == 1) {
  4163. u64 dma_addr = sg_dma_address(task->scatter);
  4164. ssp_cmd.enc_addr_low =
  4165. cpu_to_le32(lower_32_bits(dma_addr));
  4166. ssp_cmd.enc_addr_high =
  4167. cpu_to_le32(upper_32_bits(dma_addr));
  4168. ssp_cmd.enc_len = cpu_to_le32(task->total_xfer_len);
  4169. ssp_cmd.enc_esgl = 0;
  4170. /* Check 4G Boundary */
  4171. end_addr = dma_addr + le32_to_cpu(ssp_cmd.enc_len) - 1;
  4172. end_addr_low = lower_32_bits(end_addr);
  4173. end_addr_high = upper_32_bits(end_addr);
  4174. if (end_addr_high != le32_to_cpu(ssp_cmd.enc_addr_high)) {
  4175. pm8001_dbg(pm8001_ha, FAIL,
  4176. "The sg list address start_addr=0x%016llx data_len=0x%x end_addr_high=0x%08x end_addr_low=0x%08x has crossed 4G boundary\n",
  4177. dma_addr,
  4178. le32_to_cpu(ssp_cmd.enc_len),
  4179. end_addr_high, end_addr_low);
  4180. pm8001_chip_make_sg(task->scatter, 1,
  4181. ccb->buf_prd);
  4182. phys_addr = ccb->ccb_dma_handle;
  4183. ssp_cmd.enc_addr_low =
  4184. cpu_to_le32(lower_32_bits(phys_addr));
  4185. ssp_cmd.enc_addr_high =
  4186. cpu_to_le32(upper_32_bits(phys_addr));
  4187. ssp_cmd.enc_esgl = cpu_to_le32(1U<<31);
  4188. }
  4189. } else if (task->num_scatter == 0) {
  4190. ssp_cmd.enc_addr_low = 0;
  4191. ssp_cmd.enc_addr_high = 0;
  4192. ssp_cmd.enc_len = cpu_to_le32(task->total_xfer_len);
  4193. ssp_cmd.enc_esgl = 0;
  4194. }
  4195. /* XTS mode. All other fields are 0 */
  4196. ssp_cmd.key_cmode = cpu_to_le32(0x6 << 4);
  4197. /* set tweak values. Should be the start lba */
  4198. ssp_cmd.twk_val0 = cpu_to_le32((task->ssp_task.cmd->cmnd[2] << 24) |
  4199. (task->ssp_task.cmd->cmnd[3] << 16) |
  4200. (task->ssp_task.cmd->cmnd[4] << 8) |
  4201. (task->ssp_task.cmd->cmnd[5]));
  4202. } else {
  4203. pm8001_dbg(pm8001_ha, IO,
  4204. "Sending Normal SAS command 0x%x inb q %x\n",
  4205. task->ssp_task.cmd->cmnd[0], q_index);
  4206. /* fill in PRD (scatter/gather) table, if any */
  4207. if (task->num_scatter > 1) {
  4208. pm8001_chip_make_sg(task->scatter, ccb->n_elem,
  4209. ccb->buf_prd);
  4210. phys_addr = ccb->ccb_dma_handle;
  4211. ssp_cmd.addr_low =
  4212. cpu_to_le32(lower_32_bits(phys_addr));
  4213. ssp_cmd.addr_high =
  4214. cpu_to_le32(upper_32_bits(phys_addr));
  4215. ssp_cmd.esgl = cpu_to_le32(1<<31);
  4216. } else if (task->num_scatter == 1) {
  4217. u64 dma_addr = sg_dma_address(task->scatter);
  4218. ssp_cmd.addr_low = cpu_to_le32(lower_32_bits(dma_addr));
  4219. ssp_cmd.addr_high =
  4220. cpu_to_le32(upper_32_bits(dma_addr));
  4221. ssp_cmd.len = cpu_to_le32(task->total_xfer_len);
  4222. ssp_cmd.esgl = 0;
  4223. /* Check 4G Boundary */
  4224. end_addr = dma_addr + le32_to_cpu(ssp_cmd.len) - 1;
  4225. end_addr_low = lower_32_bits(end_addr);
  4226. end_addr_high = upper_32_bits(end_addr);
  4227. if (end_addr_high != le32_to_cpu(ssp_cmd.addr_high)) {
  4228. pm8001_dbg(pm8001_ha, FAIL,
  4229. "The sg list address start_addr=0x%016llx data_len=0x%x end_addr_high=0x%08x end_addr_low=0x%08x has crossed 4G boundary\n",
  4230. dma_addr,
  4231. le32_to_cpu(ssp_cmd.len),
  4232. end_addr_high, end_addr_low);
  4233. pm8001_chip_make_sg(task->scatter, 1,
  4234. ccb->buf_prd);
  4235. phys_addr = ccb->ccb_dma_handle;
  4236. ssp_cmd.addr_low =
  4237. cpu_to_le32(lower_32_bits(phys_addr));
  4238. ssp_cmd.addr_high =
  4239. cpu_to_le32(upper_32_bits(phys_addr));
  4240. ssp_cmd.esgl = cpu_to_le32(1<<31);
  4241. }
  4242. } else if (task->num_scatter == 0) {
  4243. ssp_cmd.addr_low = 0;
  4244. ssp_cmd.addr_high = 0;
  4245. ssp_cmd.len = cpu_to_le32(task->total_xfer_len);
  4246. ssp_cmd.esgl = 0;
  4247. }
  4248. }
  4249. return pm8001_mpi_build_cmd(pm8001_ha, q_index, opc, &ssp_cmd,
  4250. sizeof(ssp_cmd), q_index);
  4251. }
  4252. static int pm80xx_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
  4253. struct pm8001_ccb_info *ccb)
  4254. {
  4255. struct sas_task *task = ccb->task;
  4256. struct domain_device *dev = task->dev;
  4257. struct pm8001_device *pm8001_ha_dev = dev->lldd_dev;
  4258. struct ata_queued_cmd *qc = task->uldd_task;
  4259. u32 tag = ccb->ccb_tag, q_index;
  4260. struct sata_start_req sata_cmd;
  4261. u32 hdr_tag, ncg_tag = 0;
  4262. u64 phys_addr, end_addr;
  4263. u32 end_addr_high, end_addr_low;
  4264. u32 ATAP = 0x0;
  4265. u32 dir;
  4266. unsigned long flags;
  4267. u32 opc = OPC_INB_SATA_HOST_OPSTART;
  4268. memset(&sata_cmd, 0, sizeof(sata_cmd));
  4269. q_index = pm80xx_chip_get_q_index(task);
  4270. if (task->data_dir == DMA_NONE && !task->ata_task.use_ncq) {
  4271. ATAP = 0x04; /* no data*/
  4272. pm8001_dbg(pm8001_ha, IO, "no data\n");
  4273. } else if (likely(!task->ata_task.device_control_reg_update)) {
  4274. if (task->ata_task.use_ncq &&
  4275. dev->sata_dev.class != ATA_DEV_ATAPI) {
  4276. ATAP = 0x07; /* FPDMA */
  4277. pm8001_dbg(pm8001_ha, IO, "FPDMA\n");
  4278. } else if (task->ata_task.dma_xfer) {
  4279. ATAP = 0x06; /* DMA */
  4280. pm8001_dbg(pm8001_ha, IO, "DMA\n");
  4281. } else {
  4282. ATAP = 0x05; /* PIO*/
  4283. pm8001_dbg(pm8001_ha, IO, "PIO\n");
  4284. }
  4285. }
  4286. if (task->ata_task.use_ncq && pm8001_get_ncq_tag(task, &hdr_tag)) {
  4287. task->ata_task.fis.sector_count |= (u8) (hdr_tag << 3);
  4288. ncg_tag = hdr_tag;
  4289. }
  4290. dir = data_dir_flags[task->data_dir] << 8;
  4291. sata_cmd.tag = cpu_to_le32(tag);
  4292. sata_cmd.device_id = cpu_to_le32(pm8001_ha_dev->device_id);
  4293. sata_cmd.data_len = cpu_to_le32(task->total_xfer_len);
  4294. sata_cmd.sata_fis = task->ata_task.fis;
  4295. if (likely(!task->ata_task.device_control_reg_update))
  4296. sata_cmd.sata_fis.flags |= 0x80;/* C=1: update ATA cmd reg */
  4297. sata_cmd.sata_fis.flags &= 0xF0;/* PM_PORT field shall be 0 */
  4298. /* Check if encryption is set */
  4299. if (pm8001_ha->chip->encrypt &&
  4300. !(pm8001_ha->encrypt_info.status) && check_enc_sat_cmd(task)) {
  4301. pm8001_dbg(pm8001_ha, IO,
  4302. "Encryption enabled.Sending Encrypt SATA cmd 0x%x\n",
  4303. sata_cmd.sata_fis.command);
  4304. opc = OPC_INB_SATA_DIF_ENC_IO;
  4305. /* set encryption bit */
  4306. sata_cmd.ncqtag_atap_dir_m_dad =
  4307. cpu_to_le32(((ncg_tag & 0xff)<<16)|
  4308. ((ATAP & 0x3f) << 10) | 0x20 | dir);
  4309. /* dad (bit 0-1) is 0 */
  4310. /* fill in PRD (scatter/gather) table, if any */
  4311. if (task->num_scatter > 1) {
  4312. pm8001_chip_make_sg(task->scatter,
  4313. ccb->n_elem, ccb->buf_prd);
  4314. phys_addr = ccb->ccb_dma_handle;
  4315. sata_cmd.enc_addr_low =
  4316. cpu_to_le32(lower_32_bits(phys_addr));
  4317. sata_cmd.enc_addr_high =
  4318. cpu_to_le32(upper_32_bits(phys_addr));
  4319. sata_cmd.enc_esgl = cpu_to_le32(1 << 31);
  4320. } else if (task->num_scatter == 1) {
  4321. u64 dma_addr = sg_dma_address(task->scatter);
  4322. sata_cmd.enc_addr_low =
  4323. cpu_to_le32(lower_32_bits(dma_addr));
  4324. sata_cmd.enc_addr_high =
  4325. cpu_to_le32(upper_32_bits(dma_addr));
  4326. sata_cmd.enc_len = cpu_to_le32(task->total_xfer_len);
  4327. sata_cmd.enc_esgl = 0;
  4328. /* Check 4G Boundary */
  4329. end_addr = dma_addr + le32_to_cpu(sata_cmd.enc_len) - 1;
  4330. end_addr_low = lower_32_bits(end_addr);
  4331. end_addr_high = upper_32_bits(end_addr);
  4332. if (end_addr_high != le32_to_cpu(sata_cmd.enc_addr_high)) {
  4333. pm8001_dbg(pm8001_ha, FAIL,
  4334. "The sg list address start_addr=0x%016llx data_len=0x%x end_addr_high=0x%08x end_addr_low=0x%08x has crossed 4G boundary\n",
  4335. dma_addr,
  4336. le32_to_cpu(sata_cmd.enc_len),
  4337. end_addr_high, end_addr_low);
  4338. pm8001_chip_make_sg(task->scatter, 1,
  4339. ccb->buf_prd);
  4340. phys_addr = ccb->ccb_dma_handle;
  4341. sata_cmd.enc_addr_low =
  4342. cpu_to_le32(lower_32_bits(phys_addr));
  4343. sata_cmd.enc_addr_high =
  4344. cpu_to_le32(upper_32_bits(phys_addr));
  4345. sata_cmd.enc_esgl =
  4346. cpu_to_le32(1 << 31);
  4347. }
  4348. } else if (task->num_scatter == 0) {
  4349. sata_cmd.enc_addr_low = 0;
  4350. sata_cmd.enc_addr_high = 0;
  4351. sata_cmd.enc_len = cpu_to_le32(task->total_xfer_len);
  4352. sata_cmd.enc_esgl = 0;
  4353. }
  4354. /* XTS mode. All other fields are 0 */
  4355. sata_cmd.key_index_mode = cpu_to_le32(0x6 << 4);
  4356. /* set tweak values. Should be the start lba */
  4357. sata_cmd.twk_val0 =
  4358. cpu_to_le32((sata_cmd.sata_fis.lbal_exp << 24) |
  4359. (sata_cmd.sata_fis.lbah << 16) |
  4360. (sata_cmd.sata_fis.lbam << 8) |
  4361. (sata_cmd.sata_fis.lbal));
  4362. sata_cmd.twk_val1 =
  4363. cpu_to_le32((sata_cmd.sata_fis.lbah_exp << 8) |
  4364. (sata_cmd.sata_fis.lbam_exp));
  4365. } else {
  4366. pm8001_dbg(pm8001_ha, IO,
  4367. "Sending Normal SATA command 0x%x inb %x\n",
  4368. sata_cmd.sata_fis.command, q_index);
  4369. /* dad (bit 0-1) is 0 */
  4370. sata_cmd.ncqtag_atap_dir_m_dad =
  4371. cpu_to_le32(((ncg_tag & 0xff)<<16) |
  4372. ((ATAP & 0x3f) << 10) | dir);
  4373. /* fill in PRD (scatter/gather) table, if any */
  4374. if (task->num_scatter > 1) {
  4375. pm8001_chip_make_sg(task->scatter,
  4376. ccb->n_elem, ccb->buf_prd);
  4377. phys_addr = ccb->ccb_dma_handle;
  4378. sata_cmd.addr_low = lower_32_bits(phys_addr);
  4379. sata_cmd.addr_high = upper_32_bits(phys_addr);
  4380. sata_cmd.esgl = cpu_to_le32(1U << 31);
  4381. } else if (task->num_scatter == 1) {
  4382. u64 dma_addr = sg_dma_address(task->scatter);
  4383. sata_cmd.addr_low = lower_32_bits(dma_addr);
  4384. sata_cmd.addr_high = upper_32_bits(dma_addr);
  4385. sata_cmd.len = cpu_to_le32(task->total_xfer_len);
  4386. sata_cmd.esgl = 0;
  4387. /* Check 4G Boundary */
  4388. end_addr = dma_addr + le32_to_cpu(sata_cmd.len) - 1;
  4389. end_addr_low = lower_32_bits(end_addr);
  4390. end_addr_high = upper_32_bits(end_addr);
  4391. if (end_addr_high != sata_cmd.addr_high) {
  4392. pm8001_dbg(pm8001_ha, FAIL,
  4393. "The sg list address start_addr=0x%016llx data_len=0x%xend_addr_high=0x%08x end_addr_low=0x%08x has crossed 4G boundary\n",
  4394. dma_addr,
  4395. le32_to_cpu(sata_cmd.len),
  4396. end_addr_high, end_addr_low);
  4397. pm8001_chip_make_sg(task->scatter, 1,
  4398. ccb->buf_prd);
  4399. phys_addr = ccb->ccb_dma_handle;
  4400. sata_cmd.addr_low = lower_32_bits(phys_addr);
  4401. sata_cmd.addr_high = upper_32_bits(phys_addr);
  4402. sata_cmd.esgl = cpu_to_le32(1U << 31);
  4403. }
  4404. } else if (task->num_scatter == 0) {
  4405. sata_cmd.addr_low = 0;
  4406. sata_cmd.addr_high = 0;
  4407. sata_cmd.len = cpu_to_le32(task->total_xfer_len);
  4408. sata_cmd.esgl = 0;
  4409. }
  4410. /* scsi cdb */
  4411. sata_cmd.atapi_scsi_cdb[0] =
  4412. cpu_to_le32(((task->ata_task.atapi_packet[0]) |
  4413. (task->ata_task.atapi_packet[1] << 8) |
  4414. (task->ata_task.atapi_packet[2] << 16) |
  4415. (task->ata_task.atapi_packet[3] << 24)));
  4416. sata_cmd.atapi_scsi_cdb[1] =
  4417. cpu_to_le32(((task->ata_task.atapi_packet[4]) |
  4418. (task->ata_task.atapi_packet[5] << 8) |
  4419. (task->ata_task.atapi_packet[6] << 16) |
  4420. (task->ata_task.atapi_packet[7] << 24)));
  4421. sata_cmd.atapi_scsi_cdb[2] =
  4422. cpu_to_le32(((task->ata_task.atapi_packet[8]) |
  4423. (task->ata_task.atapi_packet[9] << 8) |
  4424. (task->ata_task.atapi_packet[10] << 16) |
  4425. (task->ata_task.atapi_packet[11] << 24)));
  4426. sata_cmd.atapi_scsi_cdb[3] =
  4427. cpu_to_le32(((task->ata_task.atapi_packet[12]) |
  4428. (task->ata_task.atapi_packet[13] << 8) |
  4429. (task->ata_task.atapi_packet[14] << 16) |
  4430. (task->ata_task.atapi_packet[15] << 24)));
  4431. }
  4432. /* Check for read log for failed drive and return */
  4433. if (sata_cmd.sata_fis.command == 0x2f) {
  4434. if (pm8001_ha_dev && ((pm8001_ha_dev->id & NCQ_READ_LOG_FLAG) ||
  4435. (pm8001_ha_dev->id & NCQ_ABORT_ALL_FLAG) ||
  4436. (pm8001_ha_dev->id & NCQ_2ND_RLE_FLAG))) {
  4437. struct task_status_struct *ts;
  4438. pm8001_ha_dev->id &= 0xDFFFFFFF;
  4439. ts = &task->task_status;
  4440. spin_lock_irqsave(&task->task_state_lock, flags);
  4441. ts->resp = SAS_TASK_COMPLETE;
  4442. ts->stat = SAS_SAM_STAT_GOOD;
  4443. task->task_state_flags &= ~SAS_TASK_STATE_PENDING;
  4444. task->task_state_flags |= SAS_TASK_STATE_DONE;
  4445. if (unlikely((task->task_state_flags &
  4446. SAS_TASK_STATE_ABORTED))) {
  4447. spin_unlock_irqrestore(&task->task_state_lock,
  4448. flags);
  4449. pm8001_dbg(pm8001_ha, FAIL,
  4450. "task 0x%p resp 0x%x stat 0x%x but aborted by upper layer\n",
  4451. task, ts->resp,
  4452. ts->stat);
  4453. pm8001_ccb_task_free(pm8001_ha, ccb);
  4454. return 0;
  4455. } else {
  4456. spin_unlock_irqrestore(&task->task_state_lock,
  4457. flags);
  4458. pm8001_ccb_task_free_done(pm8001_ha, ccb);
  4459. atomic_dec(&pm8001_ha_dev->running_req);
  4460. return 0;
  4461. }
  4462. }
  4463. }
  4464. trace_pm80xx_request_issue(pm8001_ha->id,
  4465. ccb->device ? ccb->device->attached_phy : PM8001_MAX_PHYS,
  4466. ccb->ccb_tag, opc,
  4467. qc ? qc->tf.command : 0, // ata opcode
  4468. ccb->device ? atomic_read(&ccb->device->running_req) : 0);
  4469. return pm8001_mpi_build_cmd(pm8001_ha, q_index, opc, &sata_cmd,
  4470. sizeof(sata_cmd), q_index);
  4471. }
  4472. /**
  4473. * pm80xx_chip_phy_start_req - start phy via PHY_START COMMAND
  4474. * @pm8001_ha: our hba card information.
  4475. * @phy_id: the phy id which we wanted to start up.
  4476. */
  4477. static int
  4478. pm80xx_chip_phy_start_req(struct pm8001_hba_info *pm8001_ha, u8 phy_id)
  4479. {
  4480. struct phy_start_req payload;
  4481. u32 tag = 0x01;
  4482. u32 opcode = OPC_INB_PHYSTART;
  4483. memset(&payload, 0, sizeof(payload));
  4484. payload.tag = cpu_to_le32(tag);
  4485. pm8001_dbg(pm8001_ha, INIT, "PHY START REQ for phy_id %d\n", phy_id);
  4486. payload.ase_sh_lm_slr_phyid = cpu_to_le32(SPINHOLD_DISABLE |
  4487. LINKMODE_AUTO | pm8001_ha->link_rate | phy_id);
  4488. /* SSC Disable and SAS Analog ST configuration */
  4489. /*
  4490. payload.ase_sh_lm_slr_phyid =
  4491. cpu_to_le32(SSC_DISABLE_30 | SAS_ASE | SPINHOLD_DISABLE |
  4492. LINKMODE_AUTO | LINKRATE_15 | LINKRATE_30 | LINKRATE_60 |
  4493. phy_id);
  4494. Have to add "SAS PHY Analog Setup SPASTI 1 Byte" Based on need
  4495. */
  4496. payload.sas_identify.dev_type = SAS_END_DEVICE;
  4497. payload.sas_identify.initiator_bits = SAS_PROTOCOL_ALL;
  4498. memcpy(payload.sas_identify.sas_addr,
  4499. &pm8001_ha->phy[phy_id].dev_sas_addr, SAS_ADDR_SIZE);
  4500. payload.sas_identify.phy_id = phy_id;
  4501. return pm8001_mpi_build_cmd(pm8001_ha, 0, opcode, &payload,
  4502. sizeof(payload), 0);
  4503. }
  4504. /**
  4505. * pm80xx_chip_phy_stop_req - start phy via PHY_STOP COMMAND
  4506. * @pm8001_ha: our hba card information.
  4507. * @phy_id: the phy id which we wanted to start up.
  4508. */
  4509. static int pm80xx_chip_phy_stop_req(struct pm8001_hba_info *pm8001_ha,
  4510. u8 phy_id)
  4511. {
  4512. struct phy_stop_req payload;
  4513. u32 tag = 0x01;
  4514. u32 opcode = OPC_INB_PHYSTOP;
  4515. memset(&payload, 0, sizeof(payload));
  4516. payload.tag = cpu_to_le32(tag);
  4517. payload.phy_id = cpu_to_le32(phy_id);
  4518. return pm8001_mpi_build_cmd(pm8001_ha, 0, opcode, &payload,
  4519. sizeof(payload), 0);
  4520. }
  4521. /*
  4522. * see comments on pm8001_mpi_reg_resp.
  4523. */
  4524. static int pm80xx_chip_reg_dev_req(struct pm8001_hba_info *pm8001_ha,
  4525. struct pm8001_device *pm8001_dev, u32 flag)
  4526. {
  4527. struct reg_dev_req payload;
  4528. u32 opc;
  4529. u32 stp_sspsmp_sata = 0x4;
  4530. u32 linkrate, phy_id;
  4531. int rc;
  4532. struct pm8001_ccb_info *ccb;
  4533. u8 retryFlag = 0x1;
  4534. u16 firstBurstSize = 0;
  4535. u16 ITNT = 2000;
  4536. struct domain_device *dev = pm8001_dev->sas_device;
  4537. struct domain_device *parent_dev = dev->parent;
  4538. struct pm8001_port *port = dev->port->lldd_port;
  4539. memset(&payload, 0, sizeof(payload));
  4540. ccb = pm8001_ccb_alloc(pm8001_ha, pm8001_dev, NULL);
  4541. if (!ccb)
  4542. return -SAS_QUEUE_FULL;
  4543. payload.tag = cpu_to_le32(ccb->ccb_tag);
  4544. if (flag == 1) {
  4545. stp_sspsmp_sata = 0x02; /*direct attached sata */
  4546. } else {
  4547. if (pm8001_dev->dev_type == SAS_SATA_DEV)
  4548. stp_sspsmp_sata = 0x00; /* stp*/
  4549. else if (pm8001_dev->dev_type == SAS_END_DEVICE ||
  4550. dev_is_expander(pm8001_dev->dev_type))
  4551. stp_sspsmp_sata = 0x01; /*ssp or smp*/
  4552. }
  4553. if (parent_dev && dev_is_expander(parent_dev->dev_type))
  4554. phy_id = parent_dev->ex_dev.ex_phy->phy_id;
  4555. else
  4556. phy_id = pm8001_dev->attached_phy;
  4557. opc = OPC_INB_REG_DEV;
  4558. linkrate = (pm8001_dev->sas_device->linkrate < dev->port->linkrate) ?
  4559. pm8001_dev->sas_device->linkrate : dev->port->linkrate;
  4560. payload.phyid_portid =
  4561. cpu_to_le32(((port->port_id) & 0xFF) |
  4562. ((phy_id & 0xFF) << 8));
  4563. payload.dtype_dlr_mcn_ir_retry = cpu_to_le32((retryFlag & 0x01) |
  4564. ((linkrate & 0x0F) << 24) |
  4565. ((stp_sspsmp_sata & 0x03) << 28));
  4566. payload.firstburstsize_ITNexustimeout =
  4567. cpu_to_le32(ITNT | (firstBurstSize * 0x10000));
  4568. memcpy(payload.sas_addr, pm8001_dev->sas_device->sas_addr,
  4569. SAS_ADDR_SIZE);
  4570. rc = pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &payload,
  4571. sizeof(payload), 0);
  4572. if (rc)
  4573. pm8001_ccb_free(pm8001_ha, ccb);
  4574. return rc;
  4575. }
  4576. /**
  4577. * pm80xx_chip_phy_ctl_req - support the local phy operation
  4578. * @pm8001_ha: our hba card information.
  4579. * @phyId: the phy id which we wanted to operate
  4580. * @phy_op: phy operation to request
  4581. */
  4582. static int pm80xx_chip_phy_ctl_req(struct pm8001_hba_info *pm8001_ha,
  4583. u32 phyId, u32 phy_op)
  4584. {
  4585. u32 tag;
  4586. int rc;
  4587. struct local_phy_ctl_req payload;
  4588. u32 opc = OPC_INB_LOCAL_PHY_CONTROL;
  4589. memset(&payload, 0, sizeof(payload));
  4590. rc = pm8001_tag_alloc(pm8001_ha, &tag);
  4591. if (rc)
  4592. return rc;
  4593. payload.tag = cpu_to_le32(tag);
  4594. payload.phyop_phyid =
  4595. cpu_to_le32(((phy_op & 0xFF) << 8) | (phyId & 0xFF));
  4596. rc = pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &payload,
  4597. sizeof(payload), 0);
  4598. if (rc)
  4599. pm8001_tag_free(pm8001_ha, tag);
  4600. return rc;
  4601. }
  4602. static u32 pm80xx_chip_is_our_interrupt(struct pm8001_hba_info *pm8001_ha)
  4603. {
  4604. #ifdef PM8001_USE_MSIX
  4605. return 1;
  4606. #else
  4607. u32 value;
  4608. value = pm8001_cr32(pm8001_ha, 0, MSGU_ODR);
  4609. if (value)
  4610. return 1;
  4611. return 0;
  4612. #endif
  4613. }
  4614. /**
  4615. * pm80xx_chip_isr - PM8001 isr handler.
  4616. * @pm8001_ha: our hba card information.
  4617. * @vec: irq number.
  4618. */
  4619. static irqreturn_t
  4620. pm80xx_chip_isr(struct pm8001_hba_info *pm8001_ha, u8 vec)
  4621. {
  4622. pm80xx_chip_interrupt_disable(pm8001_ha, vec);
  4623. pm8001_dbg(pm8001_ha, DEVIO,
  4624. "irq vec %d, ODMR:0x%x\n",
  4625. vec, pm8001_cr32(pm8001_ha, 0, 0x30));
  4626. process_oq(pm8001_ha, vec);
  4627. pm80xx_chip_interrupt_enable(pm8001_ha, vec);
  4628. return IRQ_HANDLED;
  4629. }
  4630. static void mpi_set_phy_profile_req(struct pm8001_hba_info *pm8001_ha,
  4631. u32 operation, u32 phyid,
  4632. u32 length, u32 *buf)
  4633. {
  4634. u32 tag, i, j = 0;
  4635. int rc;
  4636. struct set_phy_profile_req payload;
  4637. u32 opc = OPC_INB_SET_PHY_PROFILE;
  4638. memset(&payload, 0, sizeof(payload));
  4639. rc = pm8001_tag_alloc(pm8001_ha, &tag);
  4640. if (rc) {
  4641. pm8001_dbg(pm8001_ha, FAIL, "Invalid tag\n");
  4642. return;
  4643. }
  4644. payload.tag = cpu_to_le32(tag);
  4645. payload.ppc_phyid =
  4646. cpu_to_le32(((operation & 0xF) << 8) | (phyid & 0xFF));
  4647. pm8001_dbg(pm8001_ha, INIT,
  4648. " phy profile command for phy %x ,length is %d\n",
  4649. le32_to_cpu(payload.ppc_phyid), length);
  4650. for (i = length; i < (length + PHY_DWORD_LENGTH - 1); i++) {
  4651. payload.reserved[j] = cpu_to_le32(*((u32 *)buf + i));
  4652. j++;
  4653. }
  4654. rc = pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &payload,
  4655. sizeof(payload), 0);
  4656. if (rc)
  4657. pm8001_tag_free(pm8001_ha, tag);
  4658. }
  4659. void pm8001_set_phy_profile(struct pm8001_hba_info *pm8001_ha,
  4660. u32 length, u8 *buf)
  4661. {
  4662. u32 i;
  4663. for (i = 0; i < pm8001_ha->chip->n_phy; i++) {
  4664. mpi_set_phy_profile_req(pm8001_ha,
  4665. SAS_PHY_ANALOG_SETTINGS_PAGE, i, length, (u32 *)buf);
  4666. length = length + PHY_DWORD_LENGTH;
  4667. }
  4668. pm8001_dbg(pm8001_ha, INIT, "phy settings completed\n");
  4669. }
  4670. void pm8001_set_phy_profile_single(struct pm8001_hba_info *pm8001_ha,
  4671. u32 phy, u32 length, u32 *buf)
  4672. {
  4673. u32 tag, opc;
  4674. int rc, i;
  4675. struct set_phy_profile_req payload;
  4676. memset(&payload, 0, sizeof(payload));
  4677. rc = pm8001_tag_alloc(pm8001_ha, &tag);
  4678. if (rc) {
  4679. pm8001_dbg(pm8001_ha, INIT, "Invalid tag\n");
  4680. return;
  4681. }
  4682. opc = OPC_INB_SET_PHY_PROFILE;
  4683. payload.tag = cpu_to_le32(tag);
  4684. payload.ppc_phyid =
  4685. cpu_to_le32(((SAS_PHY_ANALOG_SETTINGS_PAGE & 0xF) << 8)
  4686. | (phy & 0xFF));
  4687. for (i = 0; i < length; i++)
  4688. payload.reserved[i] = cpu_to_le32(*(buf + i));
  4689. rc = pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &payload,
  4690. sizeof(payload), 0);
  4691. if (rc)
  4692. pm8001_tag_free(pm8001_ha, tag);
  4693. pm8001_dbg(pm8001_ha, INIT, "PHY %d settings applied\n", phy);
  4694. }
  4695. const struct pm8001_dispatch pm8001_80xx_dispatch = {
  4696. .name = "pmc80xx",
  4697. .chip_init = pm80xx_chip_init,
  4698. .chip_post_init = pm80xx_chip_post_init,
  4699. .chip_soft_rst = pm80xx_chip_soft_rst,
  4700. .chip_rst = pm80xx_hw_chip_rst,
  4701. .chip_iounmap = pm8001_chip_iounmap,
  4702. .isr = pm80xx_chip_isr,
  4703. .is_our_interrupt = pm80xx_chip_is_our_interrupt,
  4704. .isr_process_oq = process_oq,
  4705. .interrupt_enable = pm80xx_chip_interrupt_enable,
  4706. .interrupt_disable = pm80xx_chip_interrupt_disable,
  4707. .make_prd = pm8001_chip_make_sg,
  4708. .smp_req = pm80xx_chip_smp_req,
  4709. .ssp_io_req = pm80xx_chip_ssp_io_req,
  4710. .sata_req = pm80xx_chip_sata_req,
  4711. .phy_start_req = pm80xx_chip_phy_start_req,
  4712. .phy_stop_req = pm80xx_chip_phy_stop_req,
  4713. .reg_dev_req = pm80xx_chip_reg_dev_req,
  4714. .dereg_dev_req = pm8001_chip_dereg_dev_req,
  4715. .phy_ctl_req = pm80xx_chip_phy_ctl_req,
  4716. .task_abort = pm8001_chip_abort_task,
  4717. .ssp_tm_req = pm8001_chip_ssp_tm_req,
  4718. .get_nvmd_req = pm8001_chip_get_nvmd_req,
  4719. .set_nvmd_req = pm8001_chip_set_nvmd_req,
  4720. .fw_flash_update_req = pm8001_chip_fw_flash_update_req,
  4721. .set_dev_state_req = pm8001_chip_set_dev_state_req,
  4722. .fatal_errors = pm80xx_fatal_errors,
  4723. .hw_event_ack_req = pm80xx_hw_event_ack_req,
  4724. };