FlashPoint.c 214 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233
  1. /*
  2. FlashPoint.c -- FlashPoint SCCB Manager for Linux
  3. This file contains the FlashPoint SCCB Manager from BusLogic's FlashPoint
  4. Driver Developer's Kit, with minor modifications by Leonard N. Zubkoff for
  5. Linux compatibility. It was provided by BusLogic in the form of 16 separate
  6. source files, which would have unnecessarily cluttered the scsi directory, so
  7. the individual files have been combined into this single file.
  8. Copyright 1995-1996 by Mylex Corporation. All Rights Reserved
  9. This file is available under both the GNU General Public License
  10. and a BSD-style copyright; see LICENSE.FlashPoint for details.
  11. */
  12. #include <linux/config.h>
  13. #ifndef CONFIG_SCSI_OMIT_FLASHPOINT
  14. #define MAX_CARDS 8
  15. #undef BUSTYPE_PCI
  16. #define OS_InPortByte(port) inb(port)
  17. #define OS_InPortWord(port) inw(port)
  18. #define OS_InPortLong(port) inl(port)
  19. #define OS_OutPortByte(port, value) outb(value, port)
  20. #define OS_OutPortWord(port, value) outw(value, port)
  21. #define OS_OutPortLong(port, value) outl(value, port)
  22. /*
  23. Define name replacements for compatibility with the Linux BusLogic Driver.
  24. */
  25. #define SccbMgr_sense_adapter FlashPoint_ProbeHostAdapter
  26. #define SccbMgr_config_adapter FlashPoint_HardwareResetHostAdapter
  27. #define SccbMgr_unload_card FlashPoint_ReleaseHostAdapter
  28. #define SccbMgr_start_sccb FlashPoint_StartCCB
  29. #define SccbMgr_abort_sccb FlashPoint_AbortCCB
  30. #define SccbMgr_my_int FlashPoint_InterruptPending
  31. #define SccbMgr_isr FlashPoint_HandleInterrupt
  32. #define MAX_CDBLEN 12
  33. #define SCAM_LEV_2 1
  34. #define CRCMASK 0xA001
  35. #define BL_VENDOR_ID 0x104B
  36. #define FP_DEVICE_ID 0x8130
  37. #define MM_DEVICE_ID 0x1040
  38. #define FAILURE 0xFFFFFFFFL
  39. typedef unsigned char UCHAR;
  40. typedef unsigned short USHORT;
  41. typedef unsigned int UINT;
  42. typedef unsigned long ULONG;
  43. typedef unsigned char * PUCHAR;
  44. typedef unsigned short* PUSHORT;
  45. typedef unsigned long * PULONG;
  46. typedef void * PVOID;
  47. typedef unsigned char * uchar_ptr;
  48. typedef unsigned short * ushort_ptr;
  49. typedef unsigned long * ulong_ptr;
  50. #define s08bits char
  51. #define s16bits short
  52. #define s32bits long
  53. #define u08bits unsigned s08bits
  54. #define u16bits unsigned s16bits
  55. #define u32bits unsigned s32bits
  56. typedef u08bits * pu08bits;
  57. typedef u16bits * pu16bits;
  58. typedef u32bits * pu32bits;
  59. #define BIT(x) ((UCHAR)(1<<(x))) /* single-bit mask in bit position x */
  60. #define BITW(x) ((USHORT)(1<<(x))) /* single-bit mask in bit position x */
  61. typedef struct _SCCB *PSCCB;
  62. typedef void (*CALL_BK_FN)(PSCCB);
  63. typedef struct SCCBMgr_info {
  64. ULONG si_baseaddr;
  65. UCHAR si_present;
  66. UCHAR si_intvect;
  67. UCHAR si_id;
  68. UCHAR si_lun;
  69. USHORT si_fw_revision;
  70. USHORT si_per_targ_init_sync;
  71. USHORT si_per_targ_fast_nego;
  72. USHORT si_per_targ_ultra_nego;
  73. USHORT si_per_targ_no_disc;
  74. USHORT si_per_targ_wide_nego;
  75. USHORT si_flags;
  76. UCHAR si_card_family;
  77. UCHAR si_bustype;
  78. UCHAR si_card_model[3];
  79. UCHAR si_relative_cardnum;
  80. UCHAR si_reserved[4];
  81. ULONG si_OS_reserved;
  82. UCHAR si_XlatInfo[4];
  83. ULONG si_reserved2[5];
  84. ULONG si_secondary_range;
  85. } SCCBMGR_INFO;
  86. typedef SCCBMGR_INFO * PSCCBMGR_INFO;
  87. #define SCSI_PARITY_ENA 0x0001
  88. #define LOW_BYTE_TERM 0x0010
  89. #define HIGH_BYTE_TERM 0x0020
  90. #define BUSTYPE_PCI 0x3
  91. #define SUPPORT_16TAR_32LUN 0x0002
  92. #define SOFT_RESET 0x0004
  93. #define EXTENDED_TRANSLATION 0x0008
  94. #define POST_ALL_UNDERRRUNS 0x0040
  95. #define FLAG_SCAM_ENABLED 0x0080
  96. #define FLAG_SCAM_LEVEL2 0x0100
  97. #define HARPOON_FAMILY 0x02
  98. #define ISA_BUS_CARD 0x01
  99. #define EISA_BUS_CARD 0x02
  100. #define PCI_BUS_CARD 0x03
  101. #define VESA_BUS_CARD 0x04
  102. /* SCCB struc used for both SCCB and UCB manager compiles!
  103. * The UCB Manager treats the SCCB as it's 'native hardware structure'
  104. */
  105. #pragma pack(1)
  106. typedef struct _SCCB {
  107. UCHAR OperationCode;
  108. UCHAR ControlByte;
  109. UCHAR CdbLength;
  110. UCHAR RequestSenseLength;
  111. ULONG DataLength;
  112. ULONG DataPointer;
  113. UCHAR CcbRes[2];
  114. UCHAR HostStatus;
  115. UCHAR TargetStatus;
  116. UCHAR TargID;
  117. UCHAR Lun;
  118. UCHAR Cdb[12];
  119. UCHAR CcbRes1;
  120. UCHAR Reserved1;
  121. ULONG Reserved2;
  122. ULONG SensePointer;
  123. CALL_BK_FN SccbCallback; /* VOID (*SccbCallback)(); */
  124. ULONG SccbIOPort; /* Identifies board base port */
  125. UCHAR SccbStatus;
  126. UCHAR SCCBRes2;
  127. USHORT SccbOSFlags;
  128. ULONG Sccb_XferCnt; /* actual transfer count */
  129. ULONG Sccb_ATC;
  130. ULONG SccbVirtDataPtr; /* virtual addr for OS/2 */
  131. ULONG Sccb_res1;
  132. USHORT Sccb_MGRFlags;
  133. USHORT Sccb_sgseg;
  134. UCHAR Sccb_scsimsg; /* identify msg for selection */
  135. UCHAR Sccb_tag;
  136. UCHAR Sccb_scsistat;
  137. UCHAR Sccb_idmsg; /* image of last msg in */
  138. PSCCB Sccb_forwardlink;
  139. PSCCB Sccb_backlink;
  140. ULONG Sccb_savedATC;
  141. UCHAR Save_Cdb[6];
  142. UCHAR Save_CdbLen;
  143. UCHAR Sccb_XferState;
  144. ULONG Sccb_SGoffset;
  145. } SCCB;
  146. #define SCCB_SIZE sizeof(SCCB)
  147. #pragma pack()
  148. #define SCSI_INITIATOR_COMMAND 0x00
  149. #define TARGET_MODE_COMMAND 0x01
  150. #define SCATTER_GATHER_COMMAND 0x02
  151. #define RESIDUAL_COMMAND 0x03
  152. #define RESIDUAL_SG_COMMAND 0x04
  153. #define RESET_COMMAND 0x81
  154. #define F_USE_CMD_Q 0x20 /*Inidcates TAGGED command. */
  155. #define TAG_TYPE_MASK 0xC0 /*Type of tag msg to send. */
  156. #define TAG_Q_MASK 0xE0
  157. #define SCCB_DATA_XFER_OUT 0x10 /* Write */
  158. #define SCCB_DATA_XFER_IN 0x08 /* Read */
  159. #define FOURTEEN_BYTES 0x00 /* Request Sense Buffer size */
  160. #define NO_AUTO_REQUEST_SENSE 0x01 /* No Request Sense Buffer */
  161. #define BUS_FREE_ST 0
  162. #define SELECT_ST 1
  163. #define SELECT_BDR_ST 2 /* Select w\ Bus Device Reset */
  164. #define SELECT_SN_ST 3 /* Select w\ Sync Nego */
  165. #define SELECT_WN_ST 4 /* Select w\ Wide Data Nego */
  166. #define SELECT_Q_ST 5 /* Select w\ Tagged Q'ing */
  167. #define COMMAND_ST 6
  168. #define DATA_OUT_ST 7
  169. #define DATA_IN_ST 8
  170. #define DISCONNECT_ST 9
  171. #define STATUS_ST 10
  172. #define ABORT_ST 11
  173. #define MESSAGE_ST 12
  174. #define F_HOST_XFER_DIR 0x01
  175. #define F_ALL_XFERRED 0x02
  176. #define F_SG_XFER 0x04
  177. #define F_AUTO_SENSE 0x08
  178. #define F_ODD_BALL_CNT 0x10
  179. #define F_NO_DATA_YET 0x80
  180. #define F_STATUSLOADED 0x01
  181. #define F_MSGLOADED 0x02
  182. #define F_DEV_SELECTED 0x04
  183. #define SCCB_COMPLETE 0x00 /* SCCB completed without error */
  184. #define SCCB_DATA_UNDER_RUN 0x0C
  185. #define SCCB_SELECTION_TIMEOUT 0x11 /* Set SCSI selection timed out */
  186. #define SCCB_DATA_OVER_RUN 0x12
  187. #define SCCB_UNEXPECTED_BUS_FREE 0x13 /* Target dropped SCSI BSY */
  188. #define SCCB_PHASE_SEQUENCE_FAIL 0x14 /* Target bus phase sequence failure */
  189. #define SCCB_INVALID_OP_CODE 0x16 /* SCCB invalid operation code */
  190. #define SCCB_INVALID_SCCB 0x1A /* Invalid SCCB - bad parameter */
  191. #define SCCB_GROSS_FW_ERR 0x27 /* Major problem! */
  192. #define SCCB_BM_ERR 0x30 /* BusMaster error. */
  193. #define SCCB_PARITY_ERR 0x34 /* SCSI parity error */
  194. #define SCCB_INVALID_DIRECTION 0x18 /* Invalid target direction */
  195. #define SCCB_DUPLICATE_SCCB 0x19 /* Duplicate SCCB */
  196. #define SCCB_SCSI_RST 0x35 /* SCSI RESET detected. */
  197. #define SCCB_IN_PROCESS 0x00
  198. #define SCCB_SUCCESS 0x01
  199. #define SCCB_ABORT 0x02
  200. #define SCCB_NOT_FOUND 0x03
  201. #define SCCB_ERROR 0x04
  202. #define SCCB_INVALID 0x05
  203. #define SCCB_SIZE sizeof(SCCB)
  204. #define ORION_FW_REV 3110
  205. #define HARP_REVD 1
  206. #define QUEUE_DEPTH 254+1 /*1 for Normal disconnect 32 for Q'ing. */
  207. #define MAX_MB_CARDS 4 /* Max. no of cards suppoerted on Mother Board */
  208. #define WIDE_SCSI 1
  209. #define MAX_SCSI_TAR 16
  210. #define MAX_LUN 32
  211. #define LUN_MASK 0x1f
  212. #if defined(HARP_REVA)
  213. #define SG_BUF_CNT 15 /*Number of prefetched elements. */
  214. #else
  215. #define SG_BUF_CNT 16 /*Number of prefetched elements. */
  216. #endif
  217. #define SG_ELEMENT_SIZE 8 /*Eight byte per element. */
  218. #define SG_LOCAL_MASK 0x00000000L
  219. #define SG_ELEMENT_MASK 0xFFFFFFFFL
  220. #define RD_HARPOON(ioport) OS_InPortByte((u32bits)ioport)
  221. #define RDW_HARPOON(ioport) OS_InPortWord((u32bits)ioport)
  222. #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((u32bits)(ioport + offset)))
  223. #define WR_HARPOON(ioport,val) OS_OutPortByte((u32bits)ioport,(u08bits) val)
  224. #define WRW_HARPOON(ioport,val) OS_OutPortWord((u32bits)ioport,(u16bits)val)
  225. #define WR_HARP32(ioport,offset,data) OS_OutPortLong((u32bits)(ioport + offset), data)
  226. #define TAR_SYNC_MASK (BIT(7)+BIT(6))
  227. #define SYNC_UNKNOWN 0x00
  228. #define SYNC_TRYING BIT(6)
  229. #define SYNC_SUPPORTED (BIT(7)+BIT(6))
  230. #define TAR_WIDE_MASK (BIT(5)+BIT(4))
  231. #define WIDE_DISABLED 0x00
  232. #define WIDE_ENABLED BIT(4)
  233. #define WIDE_NEGOCIATED BIT(5)
  234. #define TAR_TAG_Q_MASK (BIT(3)+BIT(2))
  235. #define TAG_Q_UNKNOWN 0x00
  236. #define TAG_Q_TRYING BIT(2)
  237. #define TAG_Q_REJECT BIT(3)
  238. #define TAG_Q_SUPPORTED (BIT(3)+BIT(2))
  239. #define TAR_ALLOW_DISC BIT(0)
  240. #define EE_SYNC_MASK (BIT(0)+BIT(1))
  241. #define EE_SYNC_ASYNC 0x00
  242. #define EE_SYNC_5MB BIT(0)
  243. #define EE_SYNC_10MB BIT(1)
  244. #define EE_SYNC_20MB (BIT(0)+BIT(1))
  245. #define EE_ALLOW_DISC BIT(6)
  246. #define EE_WIDE_SCSI BIT(7)
  247. typedef struct SCCBMgr_tar_info *PSCCBMgr_tar_info;
  248. typedef struct SCCBMgr_tar_info {
  249. PSCCB TarSelQ_Head;
  250. PSCCB TarSelQ_Tail;
  251. UCHAR TarLUN_CA; /*Contingent Allgiance */
  252. UCHAR TarTagQ_Cnt;
  253. UCHAR TarSelQ_Cnt;
  254. UCHAR TarStatus;
  255. UCHAR TarEEValue;
  256. UCHAR TarSyncCtrl;
  257. UCHAR TarReserved[2]; /* for alignment */
  258. UCHAR LunDiscQ_Idx[MAX_LUN];
  259. UCHAR TarLUNBusy[MAX_LUN];
  260. } SCCBMGR_TAR_INFO;
  261. typedef struct NVRAMInfo {
  262. UCHAR niModel; /* Model No. of card */
  263. UCHAR niCardNo; /* Card no. */
  264. ULONG niBaseAddr; /* Port Address of card */
  265. UCHAR niSysConf; /* Adapter Configuration byte - Byte 16 of eeprom map */
  266. UCHAR niScsiConf; /* SCSI Configuration byte - Byte 17 of eeprom map */
  267. UCHAR niScamConf; /* SCAM Configuration byte - Byte 20 of eeprom map */
  268. UCHAR niAdapId; /* Host Adapter ID - Byte 24 of eerpom map */
  269. UCHAR niSyncTbl[MAX_SCSI_TAR / 2]; /* Sync/Wide byte of targets */
  270. UCHAR niScamTbl[MAX_SCSI_TAR][4]; /* Compressed Scam name string of Targets */
  271. }NVRAMINFO;
  272. typedef NVRAMINFO *PNVRamInfo;
  273. #define MODEL_LT 1
  274. #define MODEL_DL 2
  275. #define MODEL_LW 3
  276. #define MODEL_DW 4
  277. typedef struct SCCBcard {
  278. PSCCB currentSCCB;
  279. PSCCBMGR_INFO cardInfo;
  280. ULONG ioPort;
  281. USHORT cmdCounter;
  282. UCHAR discQCount;
  283. UCHAR tagQ_Lst;
  284. UCHAR cardIndex;
  285. UCHAR scanIndex;
  286. UCHAR globalFlags;
  287. UCHAR ourId;
  288. PNVRamInfo pNvRamInfo;
  289. PSCCB discQ_Tbl[QUEUE_DEPTH];
  290. }SCCBCARD;
  291. typedef struct SCCBcard *PSCCBcard;
  292. #define F_TAG_STARTED 0x01
  293. #define F_CONLUN_IO 0x02
  294. #define F_DO_RENEGO 0x04
  295. #define F_NO_FILTER 0x08
  296. #define F_GREEN_PC 0x10
  297. #define F_HOST_XFER_ACT 0x20
  298. #define F_NEW_SCCB_CMD 0x40
  299. #define F_UPDATE_EEPROM 0x80
  300. #define ID_STRING_LENGTH 32
  301. #define TYPE_CODE0 0x63 /*Level2 Mstr (bits 7-6), */
  302. #define TYPE_CODE1 00 /*No ID yet */
  303. #define SLV_TYPE_CODE0 0xA3 /*Priority Bit set (bits 7-6), */
  304. #define ASSIGN_ID 0x00
  305. #define SET_P_FLAG 0x01
  306. #define CFG_CMPLT 0x03
  307. #define DOM_MSTR 0x0F
  308. #define SYNC_PTRN 0x1F
  309. #define ID_0_7 0x18
  310. #define ID_8_F 0x11
  311. #define ID_10_17 0x12
  312. #define ID_18_1F 0x0B
  313. #define MISC_CODE 0x14
  314. #define CLR_P_FLAG 0x18
  315. #define LOCATE_ON 0x12
  316. #define LOCATE_OFF 0x0B
  317. #define LVL_1_MST 0x00
  318. #define LVL_2_MST 0x40
  319. #define DOM_LVL_2 0xC0
  320. #define INIT_SELTD 0x01
  321. #define LEVEL2_TAR 0x02
  322. enum scam_id_st { ID0,ID1,ID2,ID3,ID4,ID5,ID6,ID7,ID8,ID9,ID10,ID11,ID12,
  323. ID13,ID14,ID15,ID_UNUSED,ID_UNASSIGNED,ID_ASSIGNED,LEGACY,
  324. CLR_PRIORITY,NO_ID_AVAIL };
  325. typedef struct SCCBscam_info {
  326. UCHAR id_string[ID_STRING_LENGTH];
  327. enum scam_id_st state;
  328. } SCCBSCAM_INFO, *PSCCBSCAM_INFO;
  329. #define SCSI_TEST_UNIT_READY 0x00
  330. #define SCSI_REZERO_UNIT 0x01
  331. #define SCSI_REQUEST_SENSE 0x03
  332. #define SCSI_FORMAT_UNIT 0x04
  333. #define SCSI_REASSIGN 0x07
  334. #define SCSI_READ 0x08
  335. #define SCSI_WRITE 0x0A
  336. #define SCSI_SEEK 0x0B
  337. #define SCSI_INQUIRY 0x12
  338. #define SCSI_MODE_SELECT 0x15
  339. #define SCSI_RESERVE_UNIT 0x16
  340. #define SCSI_RELEASE_UNIT 0x17
  341. #define SCSI_MODE_SENSE 0x1A
  342. #define SCSI_START_STOP_UNIT 0x1B
  343. #define SCSI_SEND_DIAGNOSTIC 0x1D
  344. #define SCSI_READ_CAPACITY 0x25
  345. #define SCSI_READ_EXTENDED 0x28
  346. #define SCSI_WRITE_EXTENDED 0x2A
  347. #define SCSI_SEEK_EXTENDED 0x2B
  348. #define SCSI_WRITE_AND_VERIFY 0x2E
  349. #define SCSI_VERIFY 0x2F
  350. #define SCSI_READ_DEFECT_DATA 0x37
  351. #define SCSI_WRITE_BUFFER 0x3B
  352. #define SCSI_READ_BUFFER 0x3C
  353. #define SCSI_RECV_DIAGNOSTIC 0x1C
  354. #define SCSI_READ_LONG 0x3E
  355. #define SCSI_WRITE_LONG 0x3F
  356. #define SCSI_LAST_SCSI_CMND SCSI_WRITE_LONG
  357. #define SCSI_INVALID_CMND 0xFF
  358. #define SSGOOD 0x00
  359. #define SSCHECK 0x02
  360. #define SSCOND_MET 0x04
  361. #define SSBUSY 0x08
  362. #define SSRESERVATION_CONFLICT 0x18
  363. #define SSCMD_TERM 0x22
  364. #define SSQ_FULL 0x28
  365. #define SKNO_SEN 0x00
  366. #define SKRECOV_ERR 0x01
  367. #define SKNOT_RDY 0x02
  368. #define SKMED_ERR 0x03
  369. #define SKHW_ERR 0x04
  370. #define SKILL_REQ 0x05
  371. #define SKUNIT_ATTN 0x06
  372. #define SKDATA_PROTECT 0x07
  373. #define SKBLNK_CHK 0x08
  374. #define SKCPY_ABORT 0x0A
  375. #define SKABORT_CMD 0x0B
  376. #define SKEQUAL 0x0C
  377. #define SKVOL_OVF 0x0D
  378. #define SKMIS_CMP 0x0E
  379. #define SMCMD_COMP 0x00
  380. #define SMEXT 0x01
  381. #define SMSAVE_DATA_PTR 0x02
  382. #define SMREST_DATA_PTR 0x03
  383. #define SMDISC 0x04
  384. #define SMINIT_DETEC_ERR 0x05
  385. #define SMABORT 0x06
  386. #define SMREJECT 0x07
  387. #define SMNO_OP 0x08
  388. #define SMPARITY 0x09
  389. #define SMDEV_RESET 0x0C
  390. #define SMABORT_TAG 0x0D
  391. #define SMINIT_RECOVERY 0x0F
  392. #define SMREL_RECOVERY 0x10
  393. #define SMIDENT 0x80
  394. #define DISC_PRIV 0x40
  395. #define SMSYNC 0x01
  396. #define SM10MBS 0x19 /* 100ns */
  397. #define SM5MBS 0x32 /* 200ns */
  398. #define SMOFFSET 0x0F /* Maxoffset value */
  399. #define SMWDTR 0x03
  400. #define SM8BIT 0x00
  401. #define SM16BIT 0x01
  402. #define SM32BIT 0x02
  403. #define SMIGNORWR 0x23 /* Ignore Wide Residue */
  404. #define ARBITRATION_DELAY 0x01 /* 2.4us using a 40Mhz clock */
  405. #define BUS_SETTLE_DELAY 0x01 /* 400ns */
  406. #define BUS_CLEAR_DELAY 0x01 /* 800ns */
  407. #define SPHASE_TO 0x0A /* 10 second timeout waiting for */
  408. #define SCMD_TO 0x0F /* Overall command timeout */
  409. #define SIX_BYTE_CMD 0x06
  410. #define TEN_BYTE_CMD 0x0A
  411. #define TWELVE_BYTE_CMD 0x0C
  412. #define ASYNC 0x00
  413. #define PERI25NS 0x06 /* 25/4ns to next clock for xbow. */
  414. #define SYNC10MBS 0x19
  415. #define SYNC5MBS 0x32
  416. #define MAX_OFFSET 0x0F /* Maxbyteoffset for Sync Xfers */
  417. #define EEPROM_WD_CNT 256
  418. #define EEPROM_CHECK_SUM 0
  419. #define FW_SIGNATURE 2
  420. #define MODEL_NUMB_0 4
  421. #define MODEL_NUMB_1 5
  422. #define MODEL_NUMB_2 6
  423. #define MODEL_NUMB_3 7
  424. #define MODEL_NUMB_4 8
  425. #define MODEL_NUMB_5 9
  426. #define IO_BASE_ADDR 10
  427. #define IRQ_NUMBER 12
  428. #define PCI_INT_PIN 13
  429. #define BUS_DELAY 14 /*On time in byte 14 off delay in 15 */
  430. #define SYSTEM_CONFIG 16
  431. #define SCSI_CONFIG 17
  432. #define BIOS_CONFIG 18
  433. #define SPIN_UP_DELAY 19
  434. #define SCAM_CONFIG 20
  435. #define ADAPTER_SCSI_ID 24
  436. #define IGNORE_B_SCAN 32
  437. #define SEND_START_ENA 34
  438. #define DEVICE_ENABLE 36
  439. #define SYNC_RATE_TBL 38
  440. #define SYNC_RATE_TBL01 38
  441. #define SYNC_RATE_TBL23 40
  442. #define SYNC_RATE_TBL45 42
  443. #define SYNC_RATE_TBL67 44
  444. #define SYNC_RATE_TBL89 46
  445. #define SYNC_RATE_TBLab 48
  446. #define SYNC_RATE_TBLcd 50
  447. #define SYNC_RATE_TBLef 52
  448. #define EE_SCAMBASE 256
  449. #define DOM_MASTER (BIT(0) + BIT(1))
  450. #define SCAM_ENABLED BIT(2)
  451. #define SCAM_LEVEL2 BIT(3)
  452. #define RENEGO_ENA BITW(10)
  453. #define CONNIO_ENA BITW(11)
  454. #define GREEN_PC_ENA BITW(12)
  455. #define AUTO_RATE_00 00
  456. #define AUTO_RATE_05 01
  457. #define AUTO_RATE_10 02
  458. #define AUTO_RATE_20 03
  459. #define WIDE_NEGO_BIT BIT(7)
  460. #define DISC_ENABLE_BIT BIT(6)
  461. #define hp_vendor_id_0 0x00 /* LSB */
  462. #define ORION_VEND_0 0x4B
  463. #define hp_vendor_id_1 0x01 /* MSB */
  464. #define ORION_VEND_1 0x10
  465. #define hp_device_id_0 0x02 /* LSB */
  466. #define ORION_DEV_0 0x30
  467. #define hp_device_id_1 0x03 /* MSB */
  468. #define ORION_DEV_1 0x81
  469. /* Sub Vendor ID and Sub Device ID only available in
  470. Harpoon Version 2 and higher */
  471. #define hp_sub_vendor_id_0 0x04 /* LSB */
  472. #define hp_sub_vendor_id_1 0x05 /* MSB */
  473. #define hp_sub_device_id_0 0x06 /* LSB */
  474. #define hp_sub_device_id_1 0x07 /* MSB */
  475. #define hp_dual_addr_lo 0x08
  476. #define hp_dual_addr_lmi 0x09
  477. #define hp_dual_addr_hmi 0x0A
  478. #define hp_dual_addr_hi 0x0B
  479. #define hp_semaphore 0x0C
  480. #define SCCB_MGR_ACTIVE BIT(0)
  481. #define TICKLE_ME BIT(1)
  482. #define SCCB_MGR_PRESENT BIT(3)
  483. #define BIOS_IN_USE BIT(4)
  484. #define hp_user_defined_D 0x0D
  485. #define hp_reserved_E 0x0E
  486. #define hp_sys_ctrl 0x0F
  487. #define STOP_CLK BIT(0) /*Turn off BusMaster Clock */
  488. #define DRVR_RST BIT(1) /*Firmware Reset to 80C15 chip */
  489. #define HALT_MACH BIT(3) /*Halt State Machine */
  490. #define HARD_ABORT BIT(4) /*Hard Abort */
  491. #define DIAG_MODE BIT(5) /*Diagnostic Mode */
  492. #define BM_ABORT_TMOUT 0x50 /*Halt State machine time out */
  493. #define hp_sys_cfg 0x10
  494. #define DONT_RST_FIFO BIT(7) /*Don't reset FIFO */
  495. #define hp_host_ctrl0 0x11
  496. #define DUAL_ADDR_MODE BIT(0) /*Enable 64-bit addresses */
  497. #define IO_MEM_SPACE BIT(1) /*I/O Memory Space */
  498. #define RESOURCE_LOCK BIT(2) /*Enable Resource Lock */
  499. #define IGNOR_ACCESS_ERR BIT(3) /*Ignore Access Error */
  500. #define HOST_INT_EDGE BIT(4) /*Host interrupt level/edge mode sel */
  501. #define SIX_CLOCKS BIT(5) /*6 Clocks between Strobe */
  502. #define DMA_EVEN_PARITY BIT(6) /*Enable DMA Enen Parity */
  503. /*
  504. #define BURST_MODE BIT(0)
  505. */
  506. #define hp_reserved_12 0x12
  507. #define hp_host_blk_cnt 0x13
  508. #define XFER_BLK1 0x00 /* 0 0 0 1 byte per block*/
  509. #define XFER_BLK2 0x01 /* 0 0 1 2 byte per block*/
  510. #define XFER_BLK4 0x02 /* 0 1 0 4 byte per block*/
  511. #define XFER_BLK8 0x03 /* 0 1 1 8 byte per block*/
  512. #define XFER_BLK16 0x04 /* 1 0 0 16 byte per block*/
  513. #define XFER_BLK32 0x05 /* 1 0 1 32 byte per block*/
  514. #define XFER_BLK64 0x06 /* 1 1 0 64 byte per block*/
  515. #define BM_THRESHOLD 0x40 /* PCI mode can only xfer 16 bytes*/
  516. #define hp_reserved_14 0x14
  517. #define hp_reserved_15 0x15
  518. #define hp_reserved_16 0x16
  519. #define hp_int_mask 0x17
  520. #define INT_CMD_COMPL BIT(0) /* DMA command complete */
  521. #define INT_EXT_STATUS BIT(1) /* Extended Status Set */
  522. #define INT_SCSI BIT(2) /* Scsi block interrupt */
  523. #define INT_FIFO_RDY BIT(4) /* FIFO data ready */
  524. #define hp_xfer_cnt_lo 0x18
  525. #define hp_xfer_cnt_mi 0x19
  526. #define hp_xfer_cnt_hi 0x1A
  527. #define hp_xfer_cmd 0x1B
  528. #define XFER_HOST_DMA 0x00 /* 0 0 0 Transfer Host -> DMA */
  529. #define XFER_DMA_HOST 0x01 /* 0 0 1 Transfer DMA -> Host */
  530. #define XFER_HOST_MPU 0x02 /* 0 1 0 Transfer Host -> MPU */
  531. #define XFER_MPU_HOST 0x03 /* 0 1 1 Transfer MPU -> Host */
  532. #define XFER_DMA_MPU 0x04 /* 1 0 0 Transfer DMA -> MPU */
  533. #define XFER_MPU_DMA 0x05 /* 1 0 1 Transfer MPU -> DMA */
  534. #define SET_SEMAPHORE 0x06 /* 1 1 0 Set Semaphore */
  535. #define XFER_NOP 0x07 /* 1 1 1 Transfer NOP */
  536. #define XFER_MB_MPU 0x06 /* 1 1 0 Transfer MB -> MPU */
  537. #define XFER_MB_DMA 0x07 /* 1 1 1 Transfer MB -> DMA */
  538. #define XFER_HOST_AUTO 0x00 /* 0 0 Auto Transfer Size */
  539. #define XFER_HOST_8BIT 0x08 /* 0 1 8 BIT Transfer Size */
  540. #define XFER_HOST_16BIT 0x10 /* 1 0 16 BIT Transfer Size */
  541. #define XFER_HOST_32BIT 0x18 /* 1 1 32 BIT Transfer Size */
  542. #define XFER_DMA_8BIT 0x20 /* 0 1 8 BIT Transfer Size */
  543. #define XFER_DMA_16BIT 0x40 /* 1 0 16 BIT Transfer Size */
  544. #define DISABLE_INT BIT(7) /*Do not interrupt at end of cmd. */
  545. #define HOST_WRT_CMD ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_8BIT))
  546. #define HOST_RD_CMD ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_8BIT))
  547. #define WIDE_HOST_WRT_CMD ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_16BIT))
  548. #define WIDE_HOST_RD_CMD ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_16BIT))
  549. #define hp_host_addr_lo 0x1C
  550. #define hp_host_addr_lmi 0x1D
  551. #define hp_host_addr_hmi 0x1E
  552. #define hp_host_addr_hi 0x1F
  553. #define hp_pio_data 0x20
  554. #define hp_reserved_21 0x21
  555. #define hp_ee_ctrl 0x22
  556. #define EXT_ARB_ACK BIT(7)
  557. #define SCSI_TERM_ENA_H BIT(6) /* SCSI high byte terminator */
  558. #define SEE_MS BIT(5)
  559. #define SEE_CS BIT(3)
  560. #define SEE_CLK BIT(2)
  561. #define SEE_DO BIT(1)
  562. #define SEE_DI BIT(0)
  563. #define EE_READ 0x06
  564. #define EE_WRITE 0x05
  565. #define EWEN 0x04
  566. #define EWEN_ADDR 0x03C0
  567. #define EWDS 0x04
  568. #define EWDS_ADDR 0x0000
  569. #define hp_brdctl 0x23
  570. #define DAT_7 BIT(7)
  571. #define DAT_6 BIT(6)
  572. #define DAT_5 BIT(5)
  573. #define BRD_STB BIT(4)
  574. #define BRD_CS BIT(3)
  575. #define BRD_WR BIT(2)
  576. #define hp_reserved_24 0x24
  577. #define hp_reserved_25 0x25
  578. #define hp_bm_ctrl 0x26
  579. #define SCSI_TERM_ENA_L BIT(0) /*Enable/Disable external terminators */
  580. #define FLUSH_XFER_CNTR BIT(1) /*Flush transfer counter */
  581. #define BM_XFER_MIN_8 BIT(2) /*Enable bus master transfer of 9 */
  582. #define BIOS_ENA BIT(3) /*Enable BIOS/FLASH Enable */
  583. #define FORCE1_XFER BIT(5) /*Always xfer one byte in byte mode */
  584. #define FAST_SINGLE BIT(6) /*?? */
  585. #define BMCTRL_DEFAULT (FORCE1_XFER|FAST_SINGLE|SCSI_TERM_ENA_L)
  586. #define hp_reserved_27 0x27
  587. #define hp_sg_addr 0x28
  588. #define hp_page_ctrl 0x29
  589. #define SCATTER_EN BIT(0)
  590. #define SGRAM_ARAM BIT(1)
  591. #define BIOS_SHADOW BIT(2)
  592. #define G_INT_DISABLE BIT(3) /* Enable/Disable all Interrupts */
  593. #define NARROW_SCSI_CARD BIT(4) /* NARROW/WIDE SCSI config pin */
  594. #define hp_reserved_2A 0x2A
  595. #define hp_pci_cmd_cfg 0x2B
  596. #define IO_SPACE_ENA BIT(0) /*enable I/O space */
  597. #define MEM_SPACE_ENA BIT(1) /*enable memory space */
  598. #define BUS_MSTR_ENA BIT(2) /*enable bus master operation */
  599. #define MEM_WI_ENA BIT(4) /*enable Write and Invalidate */
  600. #define PAR_ERR_RESP BIT(6) /*enable parity error responce. */
  601. #define hp_reserved_2C 0x2C
  602. #define hp_pci_stat_cfg 0x2D
  603. #define DATA_PARITY_ERR BIT(0)
  604. #define REC_TARGET_ABORT BIT(4) /*received Target abort */
  605. #define REC_MASTER_ABORT BIT(5) /*received Master abort */
  606. #define SIG_SYSTEM_ERR BIT(6)
  607. #define DETECTED_PAR_ERR BIT(7)
  608. #define hp_reserved_2E 0x2E
  609. #define hp_sys_status 0x2F
  610. #define SLV_DATA_RDY BIT(0) /*Slave data ready */
  611. #define XFER_CNT_ZERO BIT(1) /*Transfer counter = 0 */
  612. #define BM_FIFO_EMPTY BIT(2) /*FIFO empty */
  613. #define BM_FIFO_FULL BIT(3) /*FIFO full */
  614. #define HOST_OP_DONE BIT(4) /*host operation done */
  615. #define DMA_OP_DONE BIT(5) /*DMA operation done */
  616. #define SLV_OP_DONE BIT(6) /*Slave operation done */
  617. #define PWR_ON_FLAG BIT(7) /*Power on flag */
  618. #define hp_reserved_30 0x30
  619. #define hp_host_status0 0x31
  620. #define HOST_TERM BIT(5) /*Host Terminal Count */
  621. #define HOST_TRSHLD BIT(6) /*Host Threshold */
  622. #define CONNECTED_2_HOST BIT(7) /*Connected to Host */
  623. #define hp_reserved_32 0x32
  624. #define hp_rev_num 0x33
  625. #define REV_A_CONST 0x0E
  626. #define REV_B_CONST 0x0E
  627. #define hp_stack_data 0x34
  628. #define hp_stack_addr 0x35
  629. #define hp_ext_status 0x36
  630. #define BM_FORCE_OFF BIT(0) /*Bus Master is forced to get off */
  631. #define PCI_TGT_ABORT BIT(0) /*PCI bus master transaction aborted */
  632. #define PCI_DEV_TMOUT BIT(1) /*PCI Device Time out */
  633. #define FIFO_TC_NOT_ZERO BIT(2) /*FIFO or transfer counter not zero */
  634. #define CHIP_RST_OCCUR BIT(3) /*Chip reset occurs */
  635. #define CMD_ABORTED BIT(4) /*Command aborted */
  636. #define BM_PARITY_ERR BIT(5) /*parity error on data received */
  637. #define PIO_OVERRUN BIT(6) /*Slave data overrun */
  638. #define BM_CMD_BUSY BIT(7) /*Bus master transfer command busy */
  639. #define BAD_EXT_STATUS (BM_FORCE_OFF | PCI_DEV_TMOUT | CMD_ABORTED | \
  640. BM_PARITY_ERR | PIO_OVERRUN)
  641. #define hp_int_status 0x37
  642. #define BM_CMD_CMPL BIT(0) /*Bus Master command complete */
  643. #define EXT_STATUS_ON BIT(1) /*Extended status is valid */
  644. #define SCSI_INTERRUPT BIT(2) /*Global indication of a SCSI int. */
  645. #define BM_FIFO_RDY BIT(4)
  646. #define INT_ASSERTED BIT(5) /* */
  647. #define SRAM_BUSY BIT(6) /*Scatter/Gather RAM busy */
  648. #define CMD_REG_BUSY BIT(7)
  649. #define hp_fifo_cnt 0x38
  650. #define hp_curr_host_cnt 0x39
  651. #define hp_reserved_3A 0x3A
  652. #define hp_fifo_in_addr 0x3B
  653. #define hp_fifo_out_addr 0x3C
  654. #define hp_reserved_3D 0x3D
  655. #define hp_reserved_3E 0x3E
  656. #define hp_reserved_3F 0x3F
  657. #define hp_intena 0x40
  658. #define RESET BITW(7)
  659. #define PROG_HLT BITW(6)
  660. #define PARITY BITW(5)
  661. #define FIFO BITW(4)
  662. #define SEL BITW(3)
  663. #define SCAM_SEL BITW(2)
  664. #define RSEL BITW(1)
  665. #define TIMEOUT BITW(0)
  666. #define BUS_FREE BITW(15)
  667. #define XFER_CNT_0 BITW(14)
  668. #define PHASE BITW(13)
  669. #define IUNKWN BITW(12)
  670. #define ICMD_COMP BITW(11)
  671. #define ITICKLE BITW(10)
  672. #define IDO_STRT BITW(9)
  673. #define ITAR_DISC BITW(8)
  674. #define AUTO_INT (BITW(12)+BITW(11)+BITW(10)+BITW(9)+BITW(8))
  675. #define CLR_ALL_INT 0xFFFF
  676. #define CLR_ALL_INT_1 0xFF00
  677. #define hp_intstat 0x42
  678. #define hp_scsisig 0x44
  679. #define SCSI_SEL BIT(7)
  680. #define SCSI_BSY BIT(6)
  681. #define SCSI_REQ BIT(5)
  682. #define SCSI_ACK BIT(4)
  683. #define SCSI_ATN BIT(3)
  684. #define SCSI_CD BIT(2)
  685. #define SCSI_MSG BIT(1)
  686. #define SCSI_IOBIT BIT(0)
  687. #define S_SCSI_PHZ (BIT(2)+BIT(1)+BIT(0))
  688. #define S_CMD_PH (BIT(2) )
  689. #define S_MSGO_PH (BIT(2)+BIT(1) )
  690. #define S_STAT_PH (BIT(2) +BIT(0))
  691. #define S_MSGI_PH (BIT(2)+BIT(1)+BIT(0))
  692. #define S_DATAI_PH ( BIT(0))
  693. #define S_DATAO_PH 0x00
  694. #define S_ILL_PH ( BIT(1) )
  695. #define hp_scsictrl_0 0x45
  696. #define NO_ARB BIT(7)
  697. #define SEL_TAR BIT(6)
  698. #define ENA_ATN BIT(4)
  699. #define ENA_RESEL BIT(2)
  700. #define SCSI_RST BIT(1)
  701. #define ENA_SCAM_SEL BIT(0)
  702. #define hp_portctrl_0 0x46
  703. #define SCSI_PORT BIT(7)
  704. #define SCSI_INBIT BIT(6)
  705. #define DMA_PORT BIT(5)
  706. #define DMA_RD BIT(4)
  707. #define HOST_PORT BIT(3)
  708. #define HOST_WRT BIT(2)
  709. #define SCSI_BUS_EN BIT(1)
  710. #define START_TO BIT(0)
  711. #define hp_scsireset 0x47
  712. #define SCSI_TAR BIT(7)
  713. #define SCSI_INI BIT(6)
  714. #define SCAM_EN BIT(5)
  715. #define ACK_HOLD BIT(4)
  716. #define DMA_RESET BIT(3)
  717. #define HPSCSI_RESET BIT(2)
  718. #define PROG_RESET BIT(1)
  719. #define FIFO_CLR BIT(0)
  720. #define hp_xfercnt_0 0x48
  721. #define hp_xfercnt_1 0x49
  722. #define hp_xfercnt_2 0x4A
  723. #define hp_xfercnt_3 0x4B
  724. #define hp_fifodata_0 0x4C
  725. #define hp_fifodata_1 0x4D
  726. #define hp_addstat 0x4E
  727. #define SCAM_TIMER BIT(7)
  728. #define AUTO_RUNNING BIT(6)
  729. #define FAST_SYNC BIT(5)
  730. #define SCSI_MODE8 BIT(3)
  731. #define SCSI_PAR_ERR BIT(0)
  732. #define hp_prgmcnt_0 0x4F
  733. #define AUTO_PC_MASK 0x3F
  734. #define hp_selfid_0 0x50
  735. #define hp_selfid_1 0x51
  736. #define hp_arb_id 0x52
  737. #define ARB_ID (BIT(3) + BIT(2) + BIT(1) + BIT(0))
  738. #define hp_select_id 0x53
  739. #define RESEL_ID (BIT(7) + BIT(6) + BIT(5) + BIT(4))
  740. #define SELECT_ID (BIT(3) + BIT(2) + BIT(1) + BIT(0))
  741. #define hp_synctarg_base 0x54
  742. #define hp_synctarg_12 0x54
  743. #define hp_synctarg_13 0x55
  744. #define hp_synctarg_14 0x56
  745. #define hp_synctarg_15 0x57
  746. #define hp_synctarg_8 0x58
  747. #define hp_synctarg_9 0x59
  748. #define hp_synctarg_10 0x5A
  749. #define hp_synctarg_11 0x5B
  750. #define hp_synctarg_4 0x5C
  751. #define hp_synctarg_5 0x5D
  752. #define hp_synctarg_6 0x5E
  753. #define hp_synctarg_7 0x5F
  754. #define hp_synctarg_0 0x60
  755. #define hp_synctarg_1 0x61
  756. #define hp_synctarg_2 0x62
  757. #define hp_synctarg_3 0x63
  758. #define RATE_20MB 0x00
  759. #define RATE_10MB ( BIT(5))
  760. #define RATE_6_6MB ( BIT(6) )
  761. #define RATE_5MB ( BIT(6)+BIT(5))
  762. #define RATE_4MB (BIT(7) )
  763. #define RATE_3_33MB (BIT(7) +BIT(5))
  764. #define RATE_2_85MB (BIT(7)+BIT(6) )
  765. #define RATE_2_5MB (BIT(7)+BIT(5)+BIT(6))
  766. #define NEXT_CLK BIT(5)
  767. #define SLOWEST_SYNC (BIT(7)+BIT(6)+BIT(5))
  768. #define NARROW_SCSI BIT(4)
  769. #define SYNC_OFFSET (BIT(3) + BIT(2) + BIT(1) + BIT(0))
  770. #define DEFAULT_ASYNC 0x00
  771. #define DEFAULT_OFFSET 0x0F
  772. #define hp_autostart_0 0x64
  773. #define hp_autostart_1 0x65
  774. #define hp_autostart_2 0x66
  775. #define hp_autostart_3 0x67
  776. #define DISABLE 0x00
  777. #define AUTO_IMMED BIT(5)
  778. #define SELECT BIT(6)
  779. #define RESELECT (BIT(6)+BIT(5))
  780. #define BUSFREE BIT(7)
  781. #define XFER_0 (BIT(7)+BIT(5))
  782. #define END_DATA (BIT(7)+BIT(6))
  783. #define MSG_PHZ (BIT(7)+BIT(6)+BIT(5))
  784. #define hp_gp_reg_0 0x68
  785. #define hp_gp_reg_1 0x69
  786. #define hp_gp_reg_2 0x6A
  787. #define hp_gp_reg_3 0x6B
  788. #define hp_seltimeout 0x6C
  789. #define TO_2ms 0x54 /* 2.0503ms */
  790. #define TO_4ms 0x67 /* 3.9959ms */
  791. #define TO_5ms 0x03 /* 4.9152ms */
  792. #define TO_10ms 0x07 /* 11.xxxms */
  793. #define TO_250ms 0x99 /* 250.68ms */
  794. #define TO_290ms 0xB1 /* 289.99ms */
  795. #define TO_350ms 0xD6 /* 350.62ms */
  796. #define TO_417ms 0xFF /* 417.79ms */
  797. #define hp_clkctrl_0 0x6D
  798. #define PWR_DWN BIT(6)
  799. #define ACTdeassert BIT(4)
  800. #define ATNonErr BIT(3)
  801. #define CLK_30MHZ BIT(1)
  802. #define CLK_40MHZ (BIT(1) + BIT(0))
  803. #define CLK_50MHZ BIT(2)
  804. #define CLKCTRL_DEFAULT (ACTdeassert | CLK_40MHZ)
  805. #define hp_fiforead 0x6E
  806. #define hp_fifowrite 0x6F
  807. #define hp_offsetctr 0x70
  808. #define hp_xferstat 0x71
  809. #define FIFO_FULL BIT(7)
  810. #define FIFO_EMPTY BIT(6)
  811. #define FIFO_MASK 0x3F /* Mask for the FIFO count value. */
  812. #define FIFO_LEN 0x20
  813. #define hp_portctrl_1 0x72
  814. #define EVEN_HOST_P BIT(5)
  815. #define INVT_SCSI BIT(4)
  816. #define CHK_SCSI_P BIT(3)
  817. #define HOST_MODE8 BIT(0)
  818. #define HOST_MODE16 0x00
  819. #define hp_xfer_pad 0x73
  820. #define ID_UNLOCK BIT(3)
  821. #define XFER_PAD BIT(2)
  822. #define hp_scsidata_0 0x74
  823. #define hp_scsidata_1 0x75
  824. #define hp_timer_0 0x76
  825. #define hp_timer_1 0x77
  826. #define hp_reserved_78 0x78
  827. #define hp_reserved_79 0x79
  828. #define hp_reserved_7A 0x7A
  829. #define hp_reserved_7B 0x7B
  830. #define hp_reserved_7C 0x7C
  831. #define hp_reserved_7D 0x7D
  832. #define hp_reserved_7E 0x7E
  833. #define hp_reserved_7F 0x7F
  834. #define hp_aramBase 0x80
  835. #define BIOS_DATA_OFFSET 0x60
  836. #define BIOS_RELATIVE_CARD 0x64
  837. #define AUTO_LEN 0x80
  838. #define AR0 0x00
  839. #define AR1 BITW(8)
  840. #define AR2 BITW(9)
  841. #define AR3 (BITW(9) + BITW(8))
  842. #define SDATA BITW(10)
  843. #define NOP_OP 0x00 /* Nop command */
  844. #define CRD_OP BITW(11) /* Cmp Reg. w/ Data */
  845. #define CRR_OP BITW(12) /* Cmp Reg. w. Reg. */
  846. #define CBE_OP (BITW(14)+BITW(12)+BITW(11)) /* Cmp SCSI cmd class & Branch EQ */
  847. #define CBN_OP (BITW(14)+BITW(13)) /* Cmp SCSI cmd class & Branch NOT EQ */
  848. #define CPE_OP (BITW(14)+BITW(11)) /* Cmp SCSI phs & Branch EQ */
  849. #define CPN_OP (BITW(14)+BITW(12)) /* Cmp SCSI phs & Branch NOT EQ */
  850. #define ADATA_OUT 0x00
  851. #define ADATA_IN BITW(8)
  852. #define ACOMMAND BITW(10)
  853. #define ASTATUS (BITW(10)+BITW(8))
  854. #define AMSG_OUT (BITW(10)+BITW(9))
  855. #define AMSG_IN (BITW(10)+BITW(9)+BITW(8))
  856. #define AILLEGAL (BITW(9)+BITW(8))
  857. #define BRH_OP BITW(13) /* Branch */
  858. #define ALWAYS 0x00
  859. #define EQUAL BITW(8)
  860. #define NOT_EQ BITW(9)
  861. #define TCB_OP (BITW(13)+BITW(11)) /* Test condition & branch */
  862. #define ATN_SET BITW(8)
  863. #define ATN_RESET BITW(9)
  864. #define XFER_CNT (BITW(9)+BITW(8))
  865. #define FIFO_0 BITW(10)
  866. #define FIFO_NOT0 (BITW(10)+BITW(8))
  867. #define T_USE_SYNC0 (BITW(10)+BITW(9))
  868. #define MPM_OP BITW(15) /* Match phase and move data */
  869. #define MDR_OP (BITW(12)+BITW(11)) /* Move data to Reg. */
  870. #define MRR_OP BITW(14) /* Move DReg. to Reg. */
  871. #define S_IDREG (BIT(2)+BIT(1)+BIT(0))
  872. #define D_AR0 0x00
  873. #define D_AR1 BIT(0)
  874. #define D_AR2 BIT(1)
  875. #define D_AR3 (BIT(1) + BIT(0))
  876. #define D_SDATA BIT(2)
  877. #define D_BUCKET (BIT(2) + BIT(1) + BIT(0))
  878. #define ADR_OP (BITW(13)+BITW(12)) /* Logical AND Reg. w. Data */
  879. #define ADS_OP (BITW(14)+BITW(13)+BITW(12))
  880. #define ODR_OP (BITW(13)+BITW(12)+BITW(11))
  881. #define ODS_OP (BITW(14)+BITW(13)+BITW(12)+BITW(11))
  882. #define STR_OP (BITW(15)+BITW(14)) /* Store to A_Reg. */
  883. #define AINT_ENA1 0x00
  884. #define AINT_STAT1 BITW(8)
  885. #define ASCSI_SIG BITW(9)
  886. #define ASCSI_CNTL (BITW(9)+BITW(8))
  887. #define APORT_CNTL BITW(10)
  888. #define ARST_CNTL (BITW(10)+BITW(8))
  889. #define AXFERCNT0 (BITW(10)+BITW(9))
  890. #define AXFERCNT1 (BITW(10)+BITW(9)+BITW(8))
  891. #define AXFERCNT2 BITW(11)
  892. #define AFIFO_DATA (BITW(11)+BITW(8))
  893. #define ASCSISELID (BITW(11)+BITW(9))
  894. #define ASCSISYNC0 (BITW(11)+BITW(9)+BITW(8))
  895. #define RAT_OP (BITW(14)+BITW(13)+BITW(11))
  896. #define SSI_OP (BITW(15)+BITW(11))
  897. #define SSI_ITAR_DISC (ITAR_DISC >> 8)
  898. #define SSI_IDO_STRT (IDO_STRT >> 8)
  899. #define SSI_IDI_STRT (IDO_STRT >> 8)
  900. #define SSI_ICMD_COMP (ICMD_COMP >> 8)
  901. #define SSI_ITICKLE (ITICKLE >> 8)
  902. #define SSI_IUNKWN (IUNKWN >> 8)
  903. #define SSI_INO_CC (IUNKWN >> 8)
  904. #define SSI_IRFAIL (IUNKWN >> 8)
  905. #define NP 0x10 /*Next Phase */
  906. #define NTCMD 0x02 /*Non- Tagged Command start */
  907. #define CMDPZ 0x04 /*Command phase */
  908. #define DINT 0x12 /*Data Out/In interrupt */
  909. #define DI 0x13 /*Data Out */
  910. #define MI 0x14 /*Message In */
  911. #define DC 0x19 /*Disconnect Message */
  912. #define ST 0x1D /*Status Phase */
  913. #define UNKNWN 0x24 /*Unknown bus action */
  914. #define CC 0x25 /*Command Completion failure */
  915. #define TICK 0x26 /*New target reselected us. */
  916. #define RFAIL 0x27 /*Reselection failed */
  917. #define SELCHK 0x28 /*Select & Check SCSI ID latch reg */
  918. #define ID_MSG_STRT hp_aramBase + 0x00
  919. #define NON_TAG_ID_MSG hp_aramBase + 0x06
  920. #define CMD_STRT hp_aramBase + 0x08
  921. #define SYNC_MSGS hp_aramBase + 0x08
  922. #define TAG_STRT 0x00
  923. #define SELECTION_START 0x00
  924. #define DISCONNECT_START 0x10/2
  925. #define END_DATA_START 0x14/2
  926. #define NONTAG_STRT 0x02/2
  927. #define CMD_ONLY_STRT CMDPZ/2
  928. #define TICKLE_STRT TICK/2
  929. #define SELCHK_STRT SELCHK/2
  930. #define mEEPROM_CLK_DELAY(port) (RD_HARPOON(port+hp_intstat_1))
  931. #define mWAIT_10MS(port) (RD_HARPOON(port+hp_intstat_1))
  932. #define CLR_XFER_CNT(port) (WR_HARPOON(port+hp_xfercnt_0, 0x00))
  933. #define SET_XFER_CNT(port, data) (WR_HARP32(port,hp_xfercnt_0,data))
  934. #define GET_XFER_CNT(port, xfercnt) {RD_HARP32(port,hp_xfercnt_0,xfercnt); xfercnt &= 0xFFFFFF;}
  935. /* #define GET_XFER_CNT(port, xfercnt) (xfercnt = RD_HARPOON(port+hp_xfercnt_2), \
  936. xfercnt <<= 16,\
  937. xfercnt |= RDW_HARPOON((USHORT)(port+hp_xfercnt_0)))
  938. */
  939. #define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((port+hp_host_addr_lo), (USHORT)(addr & 0x0000FFFFL)),\
  940. addr >>= 16,\
  941. WRW_HARPOON((port+hp_host_addr_hmi), (USHORT)(addr & 0x0000FFFFL)),\
  942. WR_HARP32(port,hp_xfercnt_0,count),\
  943. WRW_HARPOON((port+hp_xfer_cnt_lo), (USHORT)(count & 0x0000FFFFL)),\
  944. count >>= 16,\
  945. WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
  946. #define ACCEPT_MSG(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
  947. WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
  948. #define ACCEPT_MSG_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
  949. WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
  950. #define ACCEPT_STAT(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
  951. WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
  952. #define ACCEPT_STAT_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
  953. WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
  954. #define DISABLE_AUTO(port) (WR_HARPOON(port+hp_scsireset, PROG_RESET),\
  955. WR_HARPOON(port+hp_scsireset, 0x00))
  956. #define ARAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
  957. (RD_HARPOON(p_port+hp_page_ctrl) | SGRAM_ARAM)))
  958. #define SGRAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
  959. (RD_HARPOON(p_port+hp_page_ctrl) & ~SGRAM_ARAM)))
  960. #define MDISABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
  961. (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE)))
  962. #define MENABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
  963. (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE)))
  964. void scsiStartAuto(ULONG port);
  965. static UCHAR FPT_sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag);
  966. static void FPT_ssel(ULONG port, UCHAR p_card);
  967. static void FPT_sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard);
  968. static void FPT_shandem(ULONG port, UCHAR p_card,PSCCB pCurrSCCB);
  969. static void FPT_stsyncn(ULONG port, UCHAR p_card);
  970. static void FPT_sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset);
  971. static void FPT_sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value,
  972. PSCCBMgr_tar_info currTar_Info);
  973. static void FPT_sresb(ULONG port, UCHAR p_card);
  974. static void FPT_sxfrp(ULONG p_port, UCHAR p_card);
  975. static void FPT_schkdd(ULONG port, UCHAR p_card);
  976. static UCHAR FPT_RdStack(ULONG port, UCHAR index);
  977. static void FPT_WrStack(ULONG portBase, UCHAR index, UCHAR data);
  978. static UCHAR FPT_ChkIfChipInitialized(ULONG ioPort);
  979. static void FPT_SendMsg(ULONG port, UCHAR message);
  980. static void FPT_queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg,
  981. UCHAR error_code);
  982. static void FPT_sinits(PSCCB p_sccb, UCHAR p_card);
  983. static void FPT_RNVRamData(PNVRamInfo pNvRamInfo);
  984. static UCHAR FPT_siwidn(ULONG port, UCHAR p_card);
  985. static void FPT_stwidn(ULONG port, UCHAR p_card);
  986. static void FPT_siwidr(ULONG port, UCHAR width);
  987. static void FPT_queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card);
  988. static void FPT_queueDisconnect(PSCCB p_SCCB, UCHAR p_card);
  989. static void FPT_queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_SCCB,
  990. UCHAR p_card);
  991. static void FPT_queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card);
  992. static void FPT_queueFlushSccb(UCHAR p_card, UCHAR error_code);
  993. static void FPT_queueAddSccb(PSCCB p_SCCB, UCHAR card);
  994. static UCHAR FPT_queueFindSccb(PSCCB p_SCCB, UCHAR p_card);
  995. static void FPT_utilUpdateResidual(PSCCB p_SCCB);
  996. static USHORT FPT_CalcCrc16(UCHAR buffer[]);
  997. static UCHAR FPT_CalcLrc(UCHAR buffer[]);
  998. static void FPT_Wait1Second(ULONG p_port);
  999. static void FPT_Wait(ULONG p_port, UCHAR p_delay);
  1000. static void FPT_utilEEWriteOnOff(ULONG p_port,UCHAR p_mode);
  1001. static void FPT_utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr);
  1002. static USHORT FPT_utilEERead(ULONG p_port, USHORT ee_addr);
  1003. static USHORT FPT_utilEEReadOrg(ULONG p_port, USHORT ee_addr);
  1004. static void FPT_utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr);
  1005. static void FPT_phaseDataOut(ULONG port, UCHAR p_card);
  1006. static void FPT_phaseDataIn(ULONG port, UCHAR p_card);
  1007. static void FPT_phaseCommand(ULONG port, UCHAR p_card);
  1008. static void FPT_phaseStatus(ULONG port, UCHAR p_card);
  1009. static void FPT_phaseMsgOut(ULONG port, UCHAR p_card);
  1010. static void FPT_phaseMsgIn(ULONG port, UCHAR p_card);
  1011. static void FPT_phaseIllegal(ULONG port, UCHAR p_card);
  1012. static void FPT_phaseDecode(ULONG port, UCHAR p_card);
  1013. static void FPT_phaseChkFifo(ULONG port, UCHAR p_card);
  1014. static void FPT_phaseBusFree(ULONG p_port, UCHAR p_card);
  1015. static void FPT_XbowInit(ULONG port, UCHAR scamFlg);
  1016. static void FPT_BusMasterInit(ULONG p_port);
  1017. static void FPT_DiagEEPROM(ULONG p_port);
  1018. void busMstrAbort(ULONG port);
  1019. static void FPT_dataXferProcessor(ULONG port, PSCCBcard pCurrCard);
  1020. static void FPT_busMstrSGDataXferStart(ULONG port, PSCCB pCurrSCCB);
  1021. static void FPT_busMstrDataXferStart(ULONG port, PSCCB pCurrSCCB);
  1022. static void FPT_hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB);
  1023. static void FPT_hostDataXferRestart(PSCCB currSCCB);
  1024. static UCHAR FPT_SccbMgr_bad_isr(ULONG p_port, UCHAR p_card,
  1025. PSCCBcard pCurrCard, USHORT p_int);
  1026. static void FPT_SccbMgrTableInitAll(void);
  1027. static void FPT_SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card);
  1028. static void FPT_SccbMgrTableInitTarget(UCHAR p_card, UCHAR target);
  1029. static void FPT_scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up);
  1030. static int FPT_scarb(ULONG p_port, UCHAR p_sel_type);
  1031. static void FPT_scbusf(ULONG p_port);
  1032. static void FPT_scsel(ULONG p_port);
  1033. static void FPT_scasid(UCHAR p_card, ULONG p_port);
  1034. static UCHAR FPT_scxferc(ULONG p_port, UCHAR p_data);
  1035. static UCHAR FPT_scsendi(ULONG p_port, UCHAR p_id_string[]);
  1036. static UCHAR FPT_sciso(ULONG p_port, UCHAR p_id_string[]);
  1037. static void FPT_scwirod(ULONG p_port, UCHAR p_data_bit);
  1038. static void FPT_scwiros(ULONG p_port, UCHAR p_data_bit);
  1039. static UCHAR FPT_scvalq(UCHAR p_quintet);
  1040. static UCHAR FPT_scsell(ULONG p_port, UCHAR targ_id);
  1041. static void FPT_scwtsel(ULONG p_port);
  1042. static void FPT_inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id);
  1043. static void FPT_scsavdi(UCHAR p_card, ULONG p_port);
  1044. static UCHAR FPT_scmachid(UCHAR p_card, UCHAR p_id_string[]);
  1045. static void FPT_autoCmdCmplt(ULONG p_port, UCHAR p_card);
  1046. static void FPT_autoLoadDefaultMap(ULONG p_port);
  1047. void OS_start_timer(unsigned long ioport, unsigned long timeout);
  1048. void OS_stop_timer(unsigned long ioport, unsigned long timeout);
  1049. void OS_disable_int(unsigned char intvec);
  1050. void OS_enable_int(unsigned char intvec);
  1051. void OS_delay(unsigned long count);
  1052. int OS_VirtToPhys(u32bits CardHandle, u32bits *physaddr, u32bits *virtaddr);
  1053. static SCCBMGR_TAR_INFO FPT_sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] = { { { 0 } } };
  1054. static SCCBCARD FPT_BL_Card[MAX_CARDS] = { { 0 } };
  1055. static SCCBSCAM_INFO FPT_scamInfo[MAX_SCSI_TAR] = { { { 0 } } };
  1056. static NVRAMINFO FPT_nvRamInfo[MAX_MB_CARDS] = { { 0 } };
  1057. static UCHAR FPT_mbCards = 0;
  1058. static UCHAR FPT_scamHAString[] = {0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C', \
  1059. ' ', 'B', 'T', '-', '9', '3', '0', \
  1060. 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \
  1061. 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
  1062. static USHORT FPT_default_intena = 0;
  1063. static void (*FPT_s_PhaseTbl[8]) (ULONG, UCHAR)= { 0 };
  1064. /*---------------------------------------------------------------------
  1065. *
  1066. * Function: SccbMgr_sense_adapter
  1067. *
  1068. * Description: Setup and/or Search for cards and return info to caller.
  1069. *
  1070. *---------------------------------------------------------------------*/
  1071. static int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
  1072. {
  1073. static UCHAR first_time = 1;
  1074. UCHAR i,j,id,ScamFlg;
  1075. USHORT temp,temp2,temp3,temp4,temp5,temp6;
  1076. ULONG ioport;
  1077. PNVRamInfo pCurrNvRam;
  1078. ioport = pCardInfo->si_baseaddr;
  1079. if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0)
  1080. return((int)FAILURE);
  1081. if ((RD_HARPOON(ioport+hp_vendor_id_1) != ORION_VEND_1))
  1082. return((int)FAILURE);
  1083. if ((RD_HARPOON(ioport+hp_device_id_0) != ORION_DEV_0))
  1084. return((int)FAILURE);
  1085. if ((RD_HARPOON(ioport+hp_device_id_1) != ORION_DEV_1))
  1086. return((int)FAILURE);
  1087. if (RD_HARPOON(ioport+hp_rev_num) != 0x0f){
  1088. /* For new Harpoon then check for sub_device ID LSB
  1089. the bits(0-3) must be all ZERO for compatible with
  1090. current version of SCCBMgr, else skip this Harpoon
  1091. device. */
  1092. if (RD_HARPOON(ioport+hp_sub_device_id_0) & 0x0f)
  1093. return((int)FAILURE);
  1094. }
  1095. if (first_time)
  1096. {
  1097. FPT_SccbMgrTableInitAll();
  1098. first_time = 0;
  1099. FPT_mbCards = 0;
  1100. }
  1101. if(FPT_RdStack(ioport, 0) != 0x00) {
  1102. if(FPT_ChkIfChipInitialized(ioport) == 0)
  1103. {
  1104. pCurrNvRam = NULL;
  1105. WR_HARPOON(ioport+hp_semaphore, 0x00);
  1106. FPT_XbowInit(ioport, 0); /*Must Init the SCSI before attempting */
  1107. FPT_DiagEEPROM(ioport);
  1108. }
  1109. else
  1110. {
  1111. if(FPT_mbCards < MAX_MB_CARDS) {
  1112. pCurrNvRam = &FPT_nvRamInfo[FPT_mbCards];
  1113. FPT_mbCards++;
  1114. pCurrNvRam->niBaseAddr = ioport;
  1115. FPT_RNVRamData(pCurrNvRam);
  1116. }else
  1117. return((int) FAILURE);
  1118. }
  1119. }else
  1120. pCurrNvRam = NULL;
  1121. WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
  1122. WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
  1123. if(pCurrNvRam)
  1124. pCardInfo->si_id = pCurrNvRam->niAdapId;
  1125. else
  1126. pCardInfo->si_id = (UCHAR)(FPT_utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
  1127. (UCHAR)0x0FF);
  1128. pCardInfo->si_lun = 0x00;
  1129. pCardInfo->si_fw_revision = ORION_FW_REV;
  1130. temp2 = 0x0000;
  1131. temp3 = 0x0000;
  1132. temp4 = 0x0000;
  1133. temp5 = 0x0000;
  1134. temp6 = 0x0000;
  1135. for (id = 0; id < (16/2); id++) {
  1136. if(pCurrNvRam){
  1137. temp = (USHORT) pCurrNvRam->niSyncTbl[id];
  1138. temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
  1139. (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
  1140. }else
  1141. temp = FPT_utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
  1142. for (i = 0; i < 2; temp >>=8,i++) {
  1143. temp2 >>= 1;
  1144. temp3 >>= 1;
  1145. temp4 >>= 1;
  1146. temp5 >>= 1;
  1147. temp6 >>= 1;
  1148. switch (temp & 0x3)
  1149. {
  1150. case AUTO_RATE_20: /* Synchronous, 20 mega-transfers/second */
  1151. temp6 |= 0x8000; /* Fall through */
  1152. case AUTO_RATE_10: /* Synchronous, 10 mega-transfers/second */
  1153. temp5 |= 0x8000; /* Fall through */
  1154. case AUTO_RATE_05: /* Synchronous, 5 mega-transfers/second */
  1155. temp2 |= 0x8000; /* Fall through */
  1156. case AUTO_RATE_00: /* Asynchronous */
  1157. break;
  1158. }
  1159. if (temp & DISC_ENABLE_BIT)
  1160. temp3 |= 0x8000;
  1161. if (temp & WIDE_NEGO_BIT)
  1162. temp4 |= 0x8000;
  1163. }
  1164. }
  1165. pCardInfo->si_per_targ_init_sync = temp2;
  1166. pCardInfo->si_per_targ_no_disc = temp3;
  1167. pCardInfo->si_per_targ_wide_nego = temp4;
  1168. pCardInfo->si_per_targ_fast_nego = temp5;
  1169. pCardInfo->si_per_targ_ultra_nego = temp6;
  1170. if(pCurrNvRam)
  1171. i = pCurrNvRam->niSysConf;
  1172. else
  1173. i = (UCHAR)(FPT_utilEERead(ioport, (SYSTEM_CONFIG/2)));
  1174. if(pCurrNvRam)
  1175. ScamFlg = pCurrNvRam->niScamConf;
  1176. else
  1177. ScamFlg = (UCHAR) FPT_utilEERead(ioport, SCAM_CONFIG/2);
  1178. pCardInfo->si_flags = 0x0000;
  1179. if (i & 0x01)
  1180. pCardInfo->si_flags |= SCSI_PARITY_ENA;
  1181. if (!(i & 0x02))
  1182. pCardInfo->si_flags |= SOFT_RESET;
  1183. if (i & 0x10)
  1184. pCardInfo->si_flags |= EXTENDED_TRANSLATION;
  1185. if (ScamFlg & SCAM_ENABLED)
  1186. pCardInfo->si_flags |= FLAG_SCAM_ENABLED;
  1187. if (ScamFlg & SCAM_LEVEL2)
  1188. pCardInfo->si_flags |= FLAG_SCAM_LEVEL2;
  1189. j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
  1190. if (i & 0x04) {
  1191. j |= SCSI_TERM_ENA_L;
  1192. }
  1193. WR_HARPOON(ioport+hp_bm_ctrl, j );
  1194. j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
  1195. if (i & 0x08) {
  1196. j |= SCSI_TERM_ENA_H;
  1197. }
  1198. WR_HARPOON(ioport+hp_ee_ctrl, j );
  1199. if (!(RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD))
  1200. pCardInfo->si_flags |= SUPPORT_16TAR_32LUN;
  1201. pCardInfo->si_card_family = HARPOON_FAMILY;
  1202. pCardInfo->si_bustype = BUSTYPE_PCI;
  1203. if(pCurrNvRam){
  1204. pCardInfo->si_card_model[0] = '9';
  1205. switch(pCurrNvRam->niModel & 0x0f){
  1206. case MODEL_LT:
  1207. pCardInfo->si_card_model[1] = '3';
  1208. pCardInfo->si_card_model[2] = '0';
  1209. break;
  1210. case MODEL_LW:
  1211. pCardInfo->si_card_model[1] = '5';
  1212. pCardInfo->si_card_model[2] = '0';
  1213. break;
  1214. case MODEL_DL:
  1215. pCardInfo->si_card_model[1] = '3';
  1216. pCardInfo->si_card_model[2] = '2';
  1217. break;
  1218. case MODEL_DW:
  1219. pCardInfo->si_card_model[1] = '5';
  1220. pCardInfo->si_card_model[2] = '2';
  1221. break;
  1222. }
  1223. }else{
  1224. temp = FPT_utilEERead(ioport, (MODEL_NUMB_0/2));
  1225. pCardInfo->si_card_model[0] = (UCHAR)(temp >> 8);
  1226. temp = FPT_utilEERead(ioport, (MODEL_NUMB_2/2));
  1227. pCardInfo->si_card_model[1] = (UCHAR)(temp & 0x00FF);
  1228. pCardInfo->si_card_model[2] = (UCHAR)(temp >> 8);
  1229. }
  1230. if (pCardInfo->si_card_model[1] == '3')
  1231. {
  1232. if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
  1233. pCardInfo->si_flags |= LOW_BYTE_TERM;
  1234. }
  1235. else if (pCardInfo->si_card_model[2] == '0')
  1236. {
  1237. temp = RD_HARPOON(ioport+hp_xfer_pad);
  1238. WR_HARPOON(ioport+hp_xfer_pad, (temp & ~BIT(4)));
  1239. if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
  1240. pCardInfo->si_flags |= LOW_BYTE_TERM;
  1241. WR_HARPOON(ioport+hp_xfer_pad, (temp | BIT(4)));
  1242. if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
  1243. pCardInfo->si_flags |= HIGH_BYTE_TERM;
  1244. WR_HARPOON(ioport+hp_xfer_pad, temp);
  1245. }
  1246. else
  1247. {
  1248. temp = RD_HARPOON(ioport+hp_ee_ctrl);
  1249. temp2 = RD_HARPOON(ioport+hp_xfer_pad);
  1250. WR_HARPOON(ioport+hp_ee_ctrl, (temp | SEE_CS));
  1251. WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4)));
  1252. temp3 = 0;
  1253. for (i = 0; i < 8; i++)
  1254. {
  1255. temp3 <<= 1;
  1256. if (!(RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7)))
  1257. temp3 |= 1;
  1258. WR_HARPOON(ioport+hp_xfer_pad, (temp2 & ~BIT(4)));
  1259. WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4)));
  1260. }
  1261. WR_HARPOON(ioport+hp_ee_ctrl, temp);
  1262. WR_HARPOON(ioport+hp_xfer_pad, temp2);
  1263. if (!(temp3 & BIT(7)))
  1264. pCardInfo->si_flags |= LOW_BYTE_TERM;
  1265. if (!(temp3 & BIT(6)))
  1266. pCardInfo->si_flags |= HIGH_BYTE_TERM;
  1267. }
  1268. ARAM_ACCESS(ioport);
  1269. for ( i = 0; i < 4; i++ ) {
  1270. pCardInfo->si_XlatInfo[i] =
  1271. RD_HARPOON(ioport+hp_aramBase+BIOS_DATA_OFFSET+i);
  1272. }
  1273. /* return with -1 if no sort, else return with
  1274. logical card number sorted by BIOS (zero-based) */
  1275. pCardInfo->si_relative_cardnum =
  1276. (UCHAR)(RD_HARPOON(ioport+hp_aramBase+BIOS_RELATIVE_CARD)-1);
  1277. SGRAM_ACCESS(ioport);
  1278. FPT_s_PhaseTbl[0] = FPT_phaseDataOut;
  1279. FPT_s_PhaseTbl[1] = FPT_phaseDataIn;
  1280. FPT_s_PhaseTbl[2] = FPT_phaseIllegal;
  1281. FPT_s_PhaseTbl[3] = FPT_phaseIllegal;
  1282. FPT_s_PhaseTbl[4] = FPT_phaseCommand;
  1283. FPT_s_PhaseTbl[5] = FPT_phaseStatus;
  1284. FPT_s_PhaseTbl[6] = FPT_phaseMsgOut;
  1285. FPT_s_PhaseTbl[7] = FPT_phaseMsgIn;
  1286. pCardInfo->si_present = 0x01;
  1287. return(0);
  1288. }
  1289. /*---------------------------------------------------------------------
  1290. *
  1291. * Function: SccbMgr_config_adapter
  1292. *
  1293. * Description: Setup adapter for normal operation (hard reset).
  1294. *
  1295. *---------------------------------------------------------------------*/
  1296. static ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
  1297. {
  1298. PSCCBcard CurrCard = NULL;
  1299. PNVRamInfo pCurrNvRam;
  1300. UCHAR i,j,thisCard, ScamFlg;
  1301. USHORT temp,sync_bit_map,id;
  1302. ULONG ioport;
  1303. ioport = pCardInfo->si_baseaddr;
  1304. for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) {
  1305. if (thisCard == MAX_CARDS) {
  1306. return(FAILURE);
  1307. }
  1308. if (FPT_BL_Card[thisCard].ioPort == ioport) {
  1309. CurrCard = &FPT_BL_Card[thisCard];
  1310. FPT_SccbMgrTableInitCard(CurrCard,thisCard);
  1311. break;
  1312. }
  1313. else if (FPT_BL_Card[thisCard].ioPort == 0x00) {
  1314. FPT_BL_Card[thisCard].ioPort = ioport;
  1315. CurrCard = &FPT_BL_Card[thisCard];
  1316. if(FPT_mbCards)
  1317. for(i = 0; i < FPT_mbCards; i++){
  1318. if(CurrCard->ioPort == FPT_nvRamInfo[i].niBaseAddr)
  1319. CurrCard->pNvRamInfo = &FPT_nvRamInfo[i];
  1320. }
  1321. FPT_SccbMgrTableInitCard(CurrCard,thisCard);
  1322. CurrCard->cardIndex = thisCard;
  1323. CurrCard->cardInfo = pCardInfo;
  1324. break;
  1325. }
  1326. }
  1327. pCurrNvRam = CurrCard->pNvRamInfo;
  1328. if(pCurrNvRam){
  1329. ScamFlg = pCurrNvRam->niScamConf;
  1330. }
  1331. else{
  1332. ScamFlg = (UCHAR) FPT_utilEERead(ioport, SCAM_CONFIG/2);
  1333. }
  1334. FPT_BusMasterInit(ioport);
  1335. FPT_XbowInit(ioport, ScamFlg);
  1336. FPT_autoLoadDefaultMap(ioport);
  1337. for (i = 0,id = 0x01; i != pCardInfo->si_id; i++,id <<= 1){}
  1338. WR_HARPOON(ioport+hp_selfid_0, id);
  1339. WR_HARPOON(ioport+hp_selfid_1, 0x00);
  1340. WR_HARPOON(ioport+hp_arb_id, pCardInfo->si_id);
  1341. CurrCard->ourId = pCardInfo->si_id;
  1342. i = (UCHAR) pCardInfo->si_flags;
  1343. if (i & SCSI_PARITY_ENA)
  1344. WR_HARPOON(ioport+hp_portctrl_1,(HOST_MODE8 | CHK_SCSI_P));
  1345. j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
  1346. if (i & LOW_BYTE_TERM)
  1347. j |= SCSI_TERM_ENA_L;
  1348. WR_HARPOON(ioport+hp_bm_ctrl, j);
  1349. j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
  1350. if (i & HIGH_BYTE_TERM)
  1351. j |= SCSI_TERM_ENA_H;
  1352. WR_HARPOON(ioport+hp_ee_ctrl, j );
  1353. if (!(pCardInfo->si_flags & SOFT_RESET)) {
  1354. FPT_sresb(ioport,thisCard);
  1355. FPT_scini(thisCard, pCardInfo->si_id, 0);
  1356. }
  1357. if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS)
  1358. CurrCard->globalFlags |= F_NO_FILTER;
  1359. if(pCurrNvRam){
  1360. if(pCurrNvRam->niSysConf & 0x10)
  1361. CurrCard->globalFlags |= F_GREEN_PC;
  1362. }
  1363. else{
  1364. if (FPT_utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
  1365. CurrCard->globalFlags |= F_GREEN_PC;
  1366. }
  1367. /* Set global flag to indicate Re-Negotiation to be done on all
  1368. ckeck condition */
  1369. if(pCurrNvRam){
  1370. if(pCurrNvRam->niScsiConf & 0x04)
  1371. CurrCard->globalFlags |= F_DO_RENEGO;
  1372. }
  1373. else{
  1374. if (FPT_utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
  1375. CurrCard->globalFlags |= F_DO_RENEGO;
  1376. }
  1377. if(pCurrNvRam){
  1378. if(pCurrNvRam->niScsiConf & 0x08)
  1379. CurrCard->globalFlags |= F_CONLUN_IO;
  1380. }
  1381. else{
  1382. if (FPT_utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
  1383. CurrCard->globalFlags |= F_CONLUN_IO;
  1384. }
  1385. temp = pCardInfo->si_per_targ_no_disc;
  1386. for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
  1387. if (temp & id)
  1388. FPT_sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
  1389. }
  1390. sync_bit_map = 0x0001;
  1391. for (id = 0; id < (MAX_SCSI_TAR/2); id++) {
  1392. if(pCurrNvRam){
  1393. temp = (USHORT) pCurrNvRam->niSyncTbl[id];
  1394. temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
  1395. (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
  1396. }else
  1397. temp = FPT_utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
  1398. for (i = 0; i < 2; temp >>=8,i++) {
  1399. if (pCardInfo->si_per_targ_init_sync & sync_bit_map) {
  1400. FPT_sccbMgrTbl[thisCard][id*2+i].TarEEValue = (UCHAR)temp;
  1401. }
  1402. else {
  1403. FPT_sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
  1404. FPT_sccbMgrTbl[thisCard][id*2+i].TarEEValue =
  1405. (UCHAR)(temp & ~EE_SYNC_MASK);
  1406. }
  1407. /* if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) ||
  1408. (id*2+i >= 8)){
  1409. */
  1410. if (pCardInfo->si_per_targ_wide_nego & sync_bit_map){
  1411. FPT_sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
  1412. }
  1413. else { /* NARROW SCSI */
  1414. FPT_sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
  1415. }
  1416. sync_bit_map <<= 1;
  1417. }
  1418. }
  1419. WR_HARPOON((ioport+hp_semaphore),
  1420. (UCHAR)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
  1421. return((ULONG)CurrCard);
  1422. }
  1423. static void SccbMgr_unload_card(ULONG pCurrCard)
  1424. {
  1425. UCHAR i;
  1426. ULONG portBase;
  1427. ULONG regOffset;
  1428. ULONG scamData;
  1429. ULONG *pScamTbl;
  1430. PNVRamInfo pCurrNvRam;
  1431. pCurrNvRam = ((PSCCBcard)pCurrCard)->pNvRamInfo;
  1432. if(pCurrNvRam){
  1433. FPT_WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel);
  1434. FPT_WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf);
  1435. FPT_WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf);
  1436. FPT_WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf);
  1437. FPT_WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId);
  1438. for(i = 0; i < MAX_SCSI_TAR / 2; i++)
  1439. FPT_WrStack(pCurrNvRam->niBaseAddr, (UCHAR)(i+5), pCurrNvRam->niSyncTbl[i]);
  1440. portBase = pCurrNvRam->niBaseAddr;
  1441. for(i = 0; i < MAX_SCSI_TAR; i++){
  1442. regOffset = hp_aramBase + 64 + i*4;
  1443. pScamTbl = (ULONG *) &pCurrNvRam->niScamTbl[i];
  1444. scamData = *pScamTbl;
  1445. WR_HARP32(portBase, regOffset, scamData);
  1446. }
  1447. }else{
  1448. FPT_WrStack(((PSCCBcard)pCurrCard)->ioPort, 0, 0);
  1449. }
  1450. }
  1451. static void FPT_RNVRamData(PNVRamInfo pNvRamInfo)
  1452. {
  1453. UCHAR i;
  1454. ULONG portBase;
  1455. ULONG regOffset;
  1456. ULONG scamData;
  1457. ULONG *pScamTbl;
  1458. pNvRamInfo->niModel = FPT_RdStack(pNvRamInfo->niBaseAddr, 0);
  1459. pNvRamInfo->niSysConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 1);
  1460. pNvRamInfo->niScsiConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 2);
  1461. pNvRamInfo->niScamConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 3);
  1462. pNvRamInfo->niAdapId = FPT_RdStack(pNvRamInfo->niBaseAddr, 4);
  1463. for(i = 0; i < MAX_SCSI_TAR / 2; i++)
  1464. pNvRamInfo->niSyncTbl[i] = FPT_RdStack(pNvRamInfo->niBaseAddr, (UCHAR)(i+5));
  1465. portBase = pNvRamInfo->niBaseAddr;
  1466. for(i = 0; i < MAX_SCSI_TAR; i++){
  1467. regOffset = hp_aramBase + 64 + i*4;
  1468. RD_HARP32(portBase, regOffset, scamData);
  1469. pScamTbl = (ULONG *) &pNvRamInfo->niScamTbl[i];
  1470. *pScamTbl = scamData;
  1471. }
  1472. }
  1473. static UCHAR FPT_RdStack(ULONG portBase, UCHAR index)
  1474. {
  1475. WR_HARPOON(portBase + hp_stack_addr, index);
  1476. return(RD_HARPOON(portBase + hp_stack_data));
  1477. }
  1478. static void FPT_WrStack(ULONG portBase, UCHAR index, UCHAR data)
  1479. {
  1480. WR_HARPOON(portBase + hp_stack_addr, index);
  1481. WR_HARPOON(portBase + hp_stack_data, data);
  1482. }
  1483. static UCHAR FPT_ChkIfChipInitialized(ULONG ioPort)
  1484. {
  1485. if((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != FPT_RdStack(ioPort, 4))
  1486. return(0);
  1487. if((RD_HARPOON(ioPort + hp_clkctrl_0) & CLKCTRL_DEFAULT)
  1488. != CLKCTRL_DEFAULT)
  1489. return(0);
  1490. if((RD_HARPOON(ioPort + hp_seltimeout) == TO_250ms) ||
  1491. (RD_HARPOON(ioPort + hp_seltimeout) == TO_290ms))
  1492. return(1);
  1493. return(0);
  1494. }
  1495. /*---------------------------------------------------------------------
  1496. *
  1497. * Function: SccbMgr_start_sccb
  1498. *
  1499. * Description: Start a command pointed to by p_Sccb. When the
  1500. * command is completed it will be returned via the
  1501. * callback function.
  1502. *
  1503. *---------------------------------------------------------------------*/
  1504. static void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
  1505. {
  1506. ULONG ioport;
  1507. UCHAR thisCard, lun;
  1508. PSCCB pSaveSccb;
  1509. CALL_BK_FN callback;
  1510. thisCard = ((PSCCBcard) pCurrCard)->cardIndex;
  1511. ioport = ((PSCCBcard) pCurrCard)->ioPort;
  1512. if((p_Sccb->TargID > MAX_SCSI_TAR) || (p_Sccb->Lun > MAX_LUN))
  1513. {
  1514. p_Sccb->HostStatus = SCCB_COMPLETE;
  1515. p_Sccb->SccbStatus = SCCB_ERROR;
  1516. callback = (CALL_BK_FN)p_Sccb->SccbCallback;
  1517. if (callback)
  1518. callback(p_Sccb);
  1519. return;
  1520. }
  1521. FPT_sinits(p_Sccb,thisCard);
  1522. if (!((PSCCBcard) pCurrCard)->cmdCounter)
  1523. {
  1524. WR_HARPOON(ioport+hp_semaphore, (RD_HARPOON(ioport+hp_semaphore)
  1525. | SCCB_MGR_ACTIVE));
  1526. if (((PSCCBcard) pCurrCard)->globalFlags & F_GREEN_PC)
  1527. {
  1528. WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
  1529. WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
  1530. }
  1531. }
  1532. ((PSCCBcard)pCurrCard)->cmdCounter++;
  1533. if (RD_HARPOON(ioport+hp_semaphore) & BIOS_IN_USE) {
  1534. WR_HARPOON(ioport+hp_semaphore, (RD_HARPOON(ioport+hp_semaphore)
  1535. | TICKLE_ME));
  1536. if(p_Sccb->OperationCode == RESET_COMMAND)
  1537. {
  1538. pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
  1539. ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
  1540. FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
  1541. ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
  1542. }
  1543. else
  1544. {
  1545. FPT_queueAddSccb(p_Sccb,thisCard);
  1546. }
  1547. }
  1548. else if ((RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE)) {
  1549. if(p_Sccb->OperationCode == RESET_COMMAND)
  1550. {
  1551. pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
  1552. ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
  1553. FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
  1554. ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
  1555. }
  1556. else
  1557. {
  1558. FPT_queueAddSccb(p_Sccb,thisCard);
  1559. }
  1560. }
  1561. else {
  1562. MDISABLE_INT(ioport);
  1563. if((((PSCCBcard) pCurrCard)->globalFlags & F_CONLUN_IO) &&
  1564. ((FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  1565. lun = p_Sccb->Lun;
  1566. else
  1567. lun = 0;
  1568. if ((((PSCCBcard) pCurrCard)->currentSCCB == NULL) &&
  1569. (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0) &&
  1570. (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun]
  1571. == 0)) {
  1572. ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
  1573. FPT_ssel(p_Sccb->SccbIOPort,thisCard);
  1574. }
  1575. else {
  1576. if(p_Sccb->OperationCode == RESET_COMMAND)
  1577. {
  1578. pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
  1579. ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
  1580. FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
  1581. ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
  1582. }
  1583. else
  1584. {
  1585. FPT_queueAddSccb(p_Sccb,thisCard);
  1586. }
  1587. }
  1588. MENABLE_INT(ioport);
  1589. }
  1590. }
  1591. /*---------------------------------------------------------------------
  1592. *
  1593. * Function: SccbMgr_abort_sccb
  1594. *
  1595. * Description: Abort the command pointed to by p_Sccb. When the
  1596. * command is completed it will be returned via the
  1597. * callback function.
  1598. *
  1599. *---------------------------------------------------------------------*/
  1600. static int SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_Sccb)
  1601. {
  1602. ULONG ioport;
  1603. UCHAR thisCard;
  1604. CALL_BK_FN callback;
  1605. UCHAR TID;
  1606. PSCCB pSaveSCCB;
  1607. PSCCBMgr_tar_info currTar_Info;
  1608. ioport = ((PSCCBcard) pCurrCard)->ioPort;
  1609. thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
  1610. if (!(RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE))
  1611. {
  1612. if (FPT_queueFindSccb(p_Sccb,thisCard))
  1613. {
  1614. ((PSCCBcard)pCurrCard)->cmdCounter--;
  1615. if (!((PSCCBcard)pCurrCard)->cmdCounter)
  1616. WR_HARPOON(ioport+hp_semaphore,(RD_HARPOON(ioport+hp_semaphore)
  1617. & (UCHAR)(~(SCCB_MGR_ACTIVE | TICKLE_ME)) ));
  1618. p_Sccb->SccbStatus = SCCB_ABORT;
  1619. callback = p_Sccb->SccbCallback;
  1620. callback(p_Sccb);
  1621. return(0);
  1622. }
  1623. else
  1624. {
  1625. if (((PSCCBcard)pCurrCard)->currentSCCB == p_Sccb)
  1626. {
  1627. p_Sccb->SccbStatus = SCCB_ABORT;
  1628. return(0);
  1629. }
  1630. else
  1631. {
  1632. TID = p_Sccb->TargID;
  1633. if(p_Sccb->Sccb_tag)
  1634. {
  1635. MDISABLE_INT(ioport);
  1636. if (((PSCCBcard) pCurrCard)->discQ_Tbl[p_Sccb->Sccb_tag]==p_Sccb)
  1637. {
  1638. p_Sccb->SccbStatus = SCCB_ABORT;
  1639. p_Sccb->Sccb_scsistat = ABORT_ST;
  1640. p_Sccb->Sccb_scsimsg = SMABORT_TAG;
  1641. if(((PSCCBcard) pCurrCard)->currentSCCB == NULL)
  1642. {
  1643. ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
  1644. FPT_ssel(ioport, thisCard);
  1645. }
  1646. else
  1647. {
  1648. pSaveSCCB = ((PSCCBcard) pCurrCard)->currentSCCB;
  1649. ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
  1650. FPT_queueSelectFail((PSCCBcard) pCurrCard, thisCard);
  1651. ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSCCB;
  1652. }
  1653. }
  1654. MENABLE_INT(ioport);
  1655. return(0);
  1656. }
  1657. else
  1658. {
  1659. currTar_Info = &FPT_sccbMgrTbl[thisCard][p_Sccb->TargID];
  1660. if(FPT_BL_Card[thisCard].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_Sccb->Lun]]
  1661. == p_Sccb)
  1662. {
  1663. p_Sccb->SccbStatus = SCCB_ABORT;
  1664. return(0);
  1665. }
  1666. }
  1667. }
  1668. }
  1669. }
  1670. return(-1);
  1671. }
  1672. /*---------------------------------------------------------------------
  1673. *
  1674. * Function: SccbMgr_my_int
  1675. *
  1676. * Description: Do a quick check to determine if there is a pending
  1677. * interrupt for this card and disable the IRQ Pin if so.
  1678. *
  1679. *---------------------------------------------------------------------*/
  1680. static UCHAR SccbMgr_my_int(ULONG pCurrCard)
  1681. {
  1682. ULONG ioport;
  1683. ioport = ((PSCCBcard)pCurrCard)->ioPort;
  1684. if (RD_HARPOON(ioport+hp_int_status) & INT_ASSERTED)
  1685. {
  1686. return(1);
  1687. }
  1688. else
  1689. return(0);
  1690. }
  1691. /*---------------------------------------------------------------------
  1692. *
  1693. * Function: SccbMgr_isr
  1694. *
  1695. * Description: This is our entry point when an interrupt is generated
  1696. * by the card and the upper level driver passes it on to
  1697. * us.
  1698. *
  1699. *---------------------------------------------------------------------*/
  1700. static int SccbMgr_isr(ULONG pCurrCard)
  1701. {
  1702. PSCCB currSCCB;
  1703. UCHAR thisCard,result,bm_status, bm_int_st;
  1704. USHORT hp_int;
  1705. UCHAR i, target;
  1706. ULONG ioport;
  1707. thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
  1708. ioport = ((PSCCBcard)pCurrCard)->ioPort;
  1709. MDISABLE_INT(ioport);
  1710. if ((bm_int_st=RD_HARPOON(ioport+hp_int_status)) & EXT_STATUS_ON)
  1711. bm_status = RD_HARPOON(ioport+hp_ext_status) & (UCHAR)BAD_EXT_STATUS;
  1712. else
  1713. bm_status = 0;
  1714. WR_HARPOON(ioport+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
  1715. while ((hp_int = RDW_HARPOON((ioport+hp_intstat)) & FPT_default_intena) |
  1716. bm_status)
  1717. {
  1718. currSCCB = ((PSCCBcard)pCurrCard)->currentSCCB;
  1719. if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) {
  1720. result = FPT_SccbMgr_bad_isr(ioport,thisCard,((PSCCBcard)pCurrCard),hp_int);
  1721. WRW_HARPOON((ioport+hp_intstat), (FIFO | TIMEOUT | RESET | SCAM_SEL));
  1722. bm_status = 0;
  1723. if (result) {
  1724. MENABLE_INT(ioport);
  1725. return(result);
  1726. }
  1727. }
  1728. else if (hp_int & ICMD_COMP) {
  1729. if ( !(hp_int & BUS_FREE) ) {
  1730. /* Wait for the BusFree before starting a new command. We
  1731. must also check for being reselected since the BusFree
  1732. may not show up if another device reselects us in 1.5us or
  1733. less. SRR Wednesday, 3/8/1995.
  1734. */
  1735. while (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL))) ;
  1736. }
  1737. if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT)
  1738. FPT_phaseChkFifo(ioport, thisCard);
  1739. /* WRW_HARPOON((ioport+hp_intstat),
  1740. (BUS_FREE | ICMD_COMP | ITAR_DISC | XFER_CNT_0));
  1741. */
  1742. WRW_HARPOON((ioport+hp_intstat), CLR_ALL_INT_1);
  1743. FPT_autoCmdCmplt(ioport,thisCard);
  1744. }
  1745. else if (hp_int & ITAR_DISC)
  1746. {
  1747. if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) {
  1748. FPT_phaseChkFifo(ioport, thisCard);
  1749. }
  1750. if (RD_HARPOON(ioport+hp_gp_reg_1) == SMSAVE_DATA_PTR) {
  1751. WR_HARPOON(ioport+hp_gp_reg_1, 0x00);
  1752. currSCCB->Sccb_XferState |= F_NO_DATA_YET;
  1753. currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
  1754. }
  1755. currSCCB->Sccb_scsistat = DISCONNECT_ST;
  1756. FPT_queueDisconnect(currSCCB,thisCard);
  1757. /* Wait for the BusFree before starting a new command. We
  1758. must also check for being reselected since the BusFree
  1759. may not show up if another device reselects us in 1.5us or
  1760. less. SRR Wednesday, 3/8/1995.
  1761. */
  1762. while (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL)) &&
  1763. !((RDW_HARPOON((ioport+hp_intstat)) & PHASE) &&
  1764. RD_HARPOON((ioport+hp_scsisig)) ==
  1765. (SCSI_BSY | SCSI_REQ | SCSI_CD | SCSI_MSG | SCSI_IOBIT))) ;
  1766. /*
  1767. The additional loop exit condition above detects a timing problem
  1768. with the revision D/E harpoon chips. The caller should reset the
  1769. host adapter to recover when 0xFE is returned.
  1770. */
  1771. if (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL)))
  1772. {
  1773. MENABLE_INT(ioport);
  1774. return 0xFE;
  1775. }
  1776. WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ITAR_DISC));
  1777. ((PSCCBcard)pCurrCard)->globalFlags |= F_NEW_SCCB_CMD;
  1778. }
  1779. else if (hp_int & RSEL) {
  1780. WRW_HARPOON((ioport+hp_intstat), (PROG_HLT | RSEL | PHASE | BUS_FREE));
  1781. if (RDW_HARPOON((ioport+hp_intstat)) & ITAR_DISC)
  1782. {
  1783. if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT)
  1784. {
  1785. FPT_phaseChkFifo(ioport, thisCard);
  1786. }
  1787. if (RD_HARPOON(ioport+hp_gp_reg_1) == SMSAVE_DATA_PTR)
  1788. {
  1789. WR_HARPOON(ioport+hp_gp_reg_1, 0x00);
  1790. currSCCB->Sccb_XferState |= F_NO_DATA_YET;
  1791. currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
  1792. }
  1793. WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ITAR_DISC));
  1794. currSCCB->Sccb_scsistat = DISCONNECT_ST;
  1795. FPT_queueDisconnect(currSCCB,thisCard);
  1796. }
  1797. FPT_sres(ioport,thisCard,((PSCCBcard)pCurrCard));
  1798. FPT_phaseDecode(ioport,thisCard);
  1799. }
  1800. else if ((hp_int & IDO_STRT) && (!(hp_int & BUS_FREE)))
  1801. {
  1802. WRW_HARPOON((ioport+hp_intstat), (IDO_STRT | XFER_CNT_0));
  1803. FPT_phaseDecode(ioport,thisCard);
  1804. }
  1805. else if ( (hp_int & IUNKWN) || (hp_int & PROG_HLT) )
  1806. {
  1807. WRW_HARPOON((ioport+hp_intstat), (PHASE | IUNKWN | PROG_HLT));
  1808. if ((RD_HARPOON(ioport+hp_prgmcnt_0) & (UCHAR)0x3f)< (UCHAR)SELCHK)
  1809. {
  1810. FPT_phaseDecode(ioport,thisCard);
  1811. }
  1812. else
  1813. {
  1814. /* Harpoon problem some SCSI target device respond to selection
  1815. with short BUSY pulse (<400ns) this will make the Harpoon is not able
  1816. to latch the correct Target ID into reg. x53.
  1817. The work around require to correct this reg. But when write to this
  1818. reg. (0x53) also increment the FIFO write addr reg (0x6f), thus we
  1819. need to read this reg first then restore it later. After update to 0x53 */
  1820. i = (UCHAR)(RD_HARPOON(ioport+hp_fifowrite));
  1821. target = (UCHAR)(RD_HARPOON(ioport+hp_gp_reg_3));
  1822. WR_HARPOON(ioport+hp_xfer_pad, (UCHAR) ID_UNLOCK);
  1823. WR_HARPOON(ioport+hp_select_id, (UCHAR)(target | target<<4));
  1824. WR_HARPOON(ioport+hp_xfer_pad, (UCHAR) 0x00);
  1825. WR_HARPOON(ioport+hp_fifowrite, i);
  1826. WR_HARPOON(ioport+hp_autostart_3, (AUTO_IMMED+TAG_STRT));
  1827. }
  1828. }
  1829. else if (hp_int & XFER_CNT_0) {
  1830. WRW_HARPOON((ioport+hp_intstat), XFER_CNT_0);
  1831. FPT_schkdd(ioport,thisCard);
  1832. }
  1833. else if (hp_int & BUS_FREE) {
  1834. WRW_HARPOON((ioport+hp_intstat), BUS_FREE);
  1835. if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) {
  1836. FPT_hostDataXferAbort(ioport,thisCard,currSCCB);
  1837. }
  1838. FPT_phaseBusFree(ioport,thisCard);
  1839. }
  1840. else if (hp_int & ITICKLE) {
  1841. WRW_HARPOON((ioport+hp_intstat), ITICKLE);
  1842. ((PSCCBcard)pCurrCard)->globalFlags |= F_NEW_SCCB_CMD;
  1843. }
  1844. if (((PSCCBcard)pCurrCard)->globalFlags & F_NEW_SCCB_CMD) {
  1845. ((PSCCBcard)pCurrCard)->globalFlags &= ~F_NEW_SCCB_CMD;
  1846. if (((PSCCBcard)pCurrCard)->currentSCCB == NULL) {
  1847. FPT_queueSearchSelect(((PSCCBcard)pCurrCard),thisCard);
  1848. }
  1849. if (((PSCCBcard)pCurrCard)->currentSCCB != NULL) {
  1850. ((PSCCBcard)pCurrCard)->globalFlags &= ~F_NEW_SCCB_CMD;
  1851. FPT_ssel(ioport,thisCard);
  1852. }
  1853. break;
  1854. }
  1855. } /*end while */
  1856. MENABLE_INT(ioport);
  1857. return(0);
  1858. }
  1859. /*---------------------------------------------------------------------
  1860. *
  1861. * Function: Sccb_bad_isr
  1862. *
  1863. * Description: Some type of interrupt has occurred which is slightly
  1864. * out of the ordinary. We will now decode it fully, in
  1865. * this routine. This is broken up in an attempt to save
  1866. * processing time.
  1867. *
  1868. *---------------------------------------------------------------------*/
  1869. static UCHAR FPT_SccbMgr_bad_isr(ULONG p_port, UCHAR p_card,
  1870. PSCCBcard pCurrCard, USHORT p_int)
  1871. {
  1872. UCHAR temp, ScamFlg;
  1873. PSCCBMgr_tar_info currTar_Info;
  1874. PNVRamInfo pCurrNvRam;
  1875. if (RD_HARPOON(p_port+hp_ext_status) &
  1876. (BM_FORCE_OFF | PCI_DEV_TMOUT | BM_PARITY_ERR | PIO_OVERRUN) )
  1877. {
  1878. if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
  1879. {
  1880. FPT_hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
  1881. }
  1882. if (RD_HARPOON(p_port+hp_pci_stat_cfg) & REC_MASTER_ABORT)
  1883. {
  1884. WR_HARPOON(p_port+hp_pci_stat_cfg,
  1885. (RD_HARPOON(p_port+hp_pci_stat_cfg) & ~REC_MASTER_ABORT));
  1886. WR_HARPOON(p_port+hp_host_blk_cnt, 0x00);
  1887. }
  1888. if (pCurrCard->currentSCCB != NULL)
  1889. {
  1890. if (!pCurrCard->currentSCCB->HostStatus)
  1891. pCurrCard->currentSCCB->HostStatus = SCCB_BM_ERR;
  1892. FPT_sxfrp(p_port,p_card);
  1893. temp = (UCHAR)(RD_HARPOON(p_port+hp_ee_ctrl) &
  1894. (EXT_ARB_ACK | SCSI_TERM_ENA_H));
  1895. WR_HARPOON(p_port+hp_ee_ctrl, ((UCHAR)temp | SEE_MS | SEE_CS));
  1896. WR_HARPOON(p_port+hp_ee_ctrl, temp);
  1897. if (!(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
  1898. {
  1899. FPT_phaseDecode(p_port,p_card);
  1900. }
  1901. }
  1902. }
  1903. else if (p_int & RESET)
  1904. {
  1905. WR_HARPOON(p_port+hp_clkctrl_0, CLKCTRL_DEFAULT);
  1906. WR_HARPOON(p_port+hp_sys_ctrl, 0x00);
  1907. if (pCurrCard->currentSCCB != NULL) {
  1908. if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
  1909. FPT_hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
  1910. }
  1911. DISABLE_AUTO(p_port);
  1912. FPT_sresb(p_port,p_card);
  1913. while(RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST) {}
  1914. pCurrNvRam = pCurrCard->pNvRamInfo;
  1915. if(pCurrNvRam){
  1916. ScamFlg = pCurrNvRam->niScamConf;
  1917. }
  1918. else{
  1919. ScamFlg = (UCHAR) FPT_utilEERead(p_port, SCAM_CONFIG/2);
  1920. }
  1921. FPT_XbowInit(p_port, ScamFlg);
  1922. FPT_scini(p_card, pCurrCard->ourId, 0);
  1923. return(0xFF);
  1924. }
  1925. else if (p_int & FIFO) {
  1926. WRW_HARPOON((p_port+hp_intstat), FIFO);
  1927. if (pCurrCard->currentSCCB != NULL)
  1928. FPT_sxfrp(p_port,p_card);
  1929. }
  1930. else if (p_int & TIMEOUT)
  1931. {
  1932. DISABLE_AUTO(p_port);
  1933. WRW_HARPOON((p_port+hp_intstat),
  1934. (PROG_HLT | TIMEOUT | SEL |BUS_FREE | PHASE | IUNKWN));
  1935. pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT;
  1936. currTar_Info = &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
  1937. if((pCurrCard->globalFlags & F_CONLUN_IO) &&
  1938. ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  1939. currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] = 0;
  1940. else
  1941. currTar_Info->TarLUNBusy[0] = 0;
  1942. if (currTar_Info->TarEEValue & EE_SYNC_MASK)
  1943. {
  1944. currTar_Info->TarSyncCtrl = 0;
  1945. currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
  1946. }
  1947. if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
  1948. {
  1949. currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
  1950. }
  1951. FPT_sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI,currTar_Info);
  1952. FPT_queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card);
  1953. }
  1954. else if (p_int & SCAM_SEL)
  1955. {
  1956. FPT_scarb(p_port,LEVEL2_TAR);
  1957. FPT_scsel(p_port);
  1958. FPT_scasid(p_card, p_port);
  1959. FPT_scbusf(p_port);
  1960. WRW_HARPOON((p_port+hp_intstat), SCAM_SEL);
  1961. }
  1962. return(0x00);
  1963. }
  1964. /*---------------------------------------------------------------------
  1965. *
  1966. * Function: SccbMgrTableInit
  1967. *
  1968. * Description: Initialize all Sccb manager data structures.
  1969. *
  1970. *---------------------------------------------------------------------*/
  1971. static void FPT_SccbMgrTableInitAll()
  1972. {
  1973. UCHAR thisCard;
  1974. for (thisCard = 0; thisCard < MAX_CARDS; thisCard++)
  1975. {
  1976. FPT_SccbMgrTableInitCard(&FPT_BL_Card[thisCard],thisCard);
  1977. FPT_BL_Card[thisCard].ioPort = 0x00;
  1978. FPT_BL_Card[thisCard].cardInfo = NULL;
  1979. FPT_BL_Card[thisCard].cardIndex = 0xFF;
  1980. FPT_BL_Card[thisCard].ourId = 0x00;
  1981. FPT_BL_Card[thisCard].pNvRamInfo = NULL;
  1982. }
  1983. }
  1984. /*---------------------------------------------------------------------
  1985. *
  1986. * Function: SccbMgrTableInit
  1987. *
  1988. * Description: Initialize all Sccb manager data structures.
  1989. *
  1990. *---------------------------------------------------------------------*/
  1991. static void FPT_SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card)
  1992. {
  1993. UCHAR scsiID, qtag;
  1994. for (qtag = 0; qtag < QUEUE_DEPTH; qtag++)
  1995. {
  1996. FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  1997. }
  1998. for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++)
  1999. {
  2000. FPT_sccbMgrTbl[p_card][scsiID].TarStatus = 0;
  2001. FPT_sccbMgrTbl[p_card][scsiID].TarEEValue = 0;
  2002. FPT_SccbMgrTableInitTarget(p_card, scsiID);
  2003. }
  2004. pCurrCard->scanIndex = 0x00;
  2005. pCurrCard->currentSCCB = NULL;
  2006. pCurrCard->globalFlags = 0x00;
  2007. pCurrCard->cmdCounter = 0x00;
  2008. pCurrCard->tagQ_Lst = 0x01;
  2009. pCurrCard->discQCount = 0;
  2010. }
  2011. /*---------------------------------------------------------------------
  2012. *
  2013. * Function: SccbMgrTableInit
  2014. *
  2015. * Description: Initialize all Sccb manager data structures.
  2016. *
  2017. *---------------------------------------------------------------------*/
  2018. static void FPT_SccbMgrTableInitTarget(UCHAR p_card, UCHAR target)
  2019. {
  2020. UCHAR lun, qtag;
  2021. PSCCBMgr_tar_info currTar_Info;
  2022. currTar_Info = &FPT_sccbMgrTbl[p_card][target];
  2023. currTar_Info->TarSelQ_Cnt = 0;
  2024. currTar_Info->TarSyncCtrl = 0;
  2025. currTar_Info->TarSelQ_Head = NULL;
  2026. currTar_Info->TarSelQ_Tail = NULL;
  2027. currTar_Info->TarTagQ_Cnt = 0;
  2028. currTar_Info->TarLUN_CA = 0;
  2029. for (lun = 0; lun < MAX_LUN; lun++)
  2030. {
  2031. currTar_Info->TarLUNBusy[lun] = 0;
  2032. currTar_Info->LunDiscQ_Idx[lun] = 0;
  2033. }
  2034. for (qtag = 0; qtag < QUEUE_DEPTH; qtag++)
  2035. {
  2036. if(FPT_BL_Card[p_card].discQ_Tbl[qtag] != NULL)
  2037. {
  2038. if(FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == target)
  2039. {
  2040. FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  2041. FPT_BL_Card[p_card].discQCount--;
  2042. }
  2043. }
  2044. }
  2045. }
  2046. /*---------------------------------------------------------------------
  2047. *
  2048. * Function: sfetm
  2049. *
  2050. * Description: Read in a message byte from the SCSI bus, and check
  2051. * for a parity error.
  2052. *
  2053. *---------------------------------------------------------------------*/
  2054. static UCHAR FPT_sfm(ULONG port, PSCCB pCurrSCCB)
  2055. {
  2056. UCHAR message;
  2057. USHORT TimeOutLoop;
  2058. TimeOutLoop = 0;
  2059. while( (!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
  2060. (TimeOutLoop++ < 20000) ){}
  2061. WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
  2062. message = RD_HARPOON(port+hp_scsidata_0);
  2063. WR_HARPOON(port+hp_scsisig, SCSI_ACK + S_MSGI_PH);
  2064. if (TimeOutLoop > 20000)
  2065. message = 0x00; /* force message byte = 0 if Time Out on Req */
  2066. if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
  2067. (RD_HARPOON(port+hp_addstat) & SCSI_PAR_ERR))
  2068. {
  2069. WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
  2070. WR_HARPOON(port+hp_xferstat, 0);
  2071. WR_HARPOON(port+hp_fiforead, 0);
  2072. WR_HARPOON(port+hp_fifowrite, 0);
  2073. if (pCurrSCCB != NULL)
  2074. {
  2075. pCurrSCCB->Sccb_scsimsg = SMPARITY;
  2076. }
  2077. message = 0x00;
  2078. do
  2079. {
  2080. ACCEPT_MSG_ATN(port);
  2081. TimeOutLoop = 0;
  2082. while( (!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
  2083. (TimeOutLoop++ < 20000) ){}
  2084. if (TimeOutLoop > 20000)
  2085. {
  2086. WRW_HARPOON((port+hp_intstat), PARITY);
  2087. return(message);
  2088. }
  2089. if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) != S_MSGI_PH)
  2090. {
  2091. WRW_HARPOON((port+hp_intstat), PARITY);
  2092. return(message);
  2093. }
  2094. WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
  2095. RD_HARPOON(port+hp_scsidata_0);
  2096. WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
  2097. }while(1);
  2098. }
  2099. WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
  2100. WR_HARPOON(port+hp_xferstat, 0);
  2101. WR_HARPOON(port+hp_fiforead, 0);
  2102. WR_HARPOON(port+hp_fifowrite, 0);
  2103. return(message);
  2104. }
  2105. /*---------------------------------------------------------------------
  2106. *
  2107. * Function: FPT_ssel
  2108. *
  2109. * Description: Load up automation and select target device.
  2110. *
  2111. *---------------------------------------------------------------------*/
  2112. static void FPT_ssel(ULONG port, UCHAR p_card)
  2113. {
  2114. UCHAR auto_loaded, i, target, *theCCB;
  2115. ULONG cdb_reg;
  2116. PSCCBcard CurrCard;
  2117. PSCCB currSCCB;
  2118. PSCCBMgr_tar_info currTar_Info;
  2119. UCHAR lastTag, lun;
  2120. CurrCard = &FPT_BL_Card[p_card];
  2121. currSCCB = CurrCard->currentSCCB;
  2122. target = currSCCB->TargID;
  2123. currTar_Info = &FPT_sccbMgrTbl[p_card][target];
  2124. lastTag = CurrCard->tagQ_Lst;
  2125. ARAM_ACCESS(port);
  2126. if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
  2127. currSCCB->ControlByte &= ~F_USE_CMD_Q;
  2128. if(((CurrCard->globalFlags & F_CONLUN_IO) &&
  2129. ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
  2130. lun = currSCCB->Lun;
  2131. else
  2132. lun = 0;
  2133. if (CurrCard->globalFlags & F_TAG_STARTED)
  2134. {
  2135. if (!(currSCCB->ControlByte & F_USE_CMD_Q))
  2136. {
  2137. if ((currTar_Info->TarLUN_CA == 0)
  2138. && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
  2139. == TAG_Q_TRYING))
  2140. {
  2141. if (currTar_Info->TarTagQ_Cnt !=0)
  2142. {
  2143. currTar_Info->TarLUNBusy[lun] = 1;
  2144. FPT_queueSelectFail(CurrCard,p_card);
  2145. SGRAM_ACCESS(port);
  2146. return;
  2147. }
  2148. else {
  2149. currTar_Info->TarLUNBusy[lun] = 1;
  2150. }
  2151. } /*End non-tagged */
  2152. else {
  2153. currTar_Info->TarLUNBusy[lun] = 1;
  2154. }
  2155. } /*!Use cmd Q Tagged */
  2156. else {
  2157. if (currTar_Info->TarLUN_CA == 1)
  2158. {
  2159. FPT_queueSelectFail(CurrCard,p_card);
  2160. SGRAM_ACCESS(port);
  2161. return;
  2162. }
  2163. currTar_Info->TarLUNBusy[lun] = 1;
  2164. } /*else use cmd Q tagged */
  2165. } /*if glob tagged started */
  2166. else {
  2167. currTar_Info->TarLUNBusy[lun] = 1;
  2168. }
  2169. if((((CurrCard->globalFlags & F_CONLUN_IO) &&
  2170. ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  2171. || (!(currSCCB->ControlByte & F_USE_CMD_Q))))
  2172. {
  2173. if(CurrCard->discQCount >= QUEUE_DEPTH)
  2174. {
  2175. currTar_Info->TarLUNBusy[lun] = 1;
  2176. FPT_queueSelectFail(CurrCard,p_card);
  2177. SGRAM_ACCESS(port);
  2178. return;
  2179. }
  2180. for (i = 1; i < QUEUE_DEPTH; i++)
  2181. {
  2182. if (++lastTag >= QUEUE_DEPTH) lastTag = 1;
  2183. if (CurrCard->discQ_Tbl[lastTag] == NULL)
  2184. {
  2185. CurrCard->tagQ_Lst = lastTag;
  2186. currTar_Info->LunDiscQ_Idx[lun] = lastTag;
  2187. CurrCard->discQ_Tbl[lastTag] = currSCCB;
  2188. CurrCard->discQCount++;
  2189. break;
  2190. }
  2191. }
  2192. if(i == QUEUE_DEPTH)
  2193. {
  2194. currTar_Info->TarLUNBusy[lun] = 1;
  2195. FPT_queueSelectFail(CurrCard,p_card);
  2196. SGRAM_ACCESS(port);
  2197. return;
  2198. }
  2199. }
  2200. auto_loaded = 0;
  2201. WR_HARPOON(port+hp_select_id, target);
  2202. WR_HARPOON(port+hp_gp_reg_3, target); /* Use by new automation logic */
  2203. if (currSCCB->OperationCode == RESET_COMMAND) {
  2204. WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+
  2205. (currSCCB->Sccb_idmsg & ~DISC_PRIV)));
  2206. WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+NP);
  2207. currSCCB->Sccb_scsimsg = SMDEV_RESET;
  2208. WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
  2209. auto_loaded = 1;
  2210. currSCCB->Sccb_scsistat = SELECT_BDR_ST;
  2211. if (currTar_Info->TarEEValue & EE_SYNC_MASK)
  2212. {
  2213. currTar_Info->TarSyncCtrl = 0;
  2214. currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
  2215. }
  2216. if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
  2217. {
  2218. currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
  2219. }
  2220. FPT_sssyncv(port, target, NARROW_SCSI,currTar_Info);
  2221. FPT_SccbMgrTableInitTarget(p_card, target);
  2222. }
  2223. else if(currSCCB->Sccb_scsistat == ABORT_ST)
  2224. {
  2225. WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+
  2226. (currSCCB->Sccb_idmsg & ~DISC_PRIV)));
  2227. WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
  2228. WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+
  2229. (((UCHAR)(currSCCB->ControlByte & TAG_TYPE_MASK)
  2230. >> 6) | (UCHAR)0x20)));
  2231. WRW_HARPOON((port+SYNC_MSGS+2),
  2232. (MPM_OP+AMSG_OUT+currSCCB->Sccb_tag));
  2233. WRW_HARPOON((port+SYNC_MSGS+4), (BRH_OP+ALWAYS+NP ));
  2234. WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
  2235. auto_loaded = 1;
  2236. }
  2237. else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED)) {
  2238. auto_loaded = FPT_siwidn(port,p_card);
  2239. currSCCB->Sccb_scsistat = SELECT_WN_ST;
  2240. }
  2241. else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK)
  2242. == SYNC_SUPPORTED)) {
  2243. auto_loaded = FPT_sisyncn(port,p_card, 0);
  2244. currSCCB->Sccb_scsistat = SELECT_SN_ST;
  2245. }
  2246. if (!auto_loaded)
  2247. {
  2248. if (currSCCB->ControlByte & F_USE_CMD_Q)
  2249. {
  2250. CurrCard->globalFlags |= F_TAG_STARTED;
  2251. if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
  2252. == TAG_Q_REJECT)
  2253. {
  2254. currSCCB->ControlByte &= ~F_USE_CMD_Q;
  2255. /* Fix up the start instruction with a jump to
  2256. Non-Tag-CMD handling */
  2257. WRW_HARPOON((port+ID_MSG_STRT),BRH_OP+ALWAYS+NTCMD);
  2258. WRW_HARPOON((port+NON_TAG_ID_MSG),
  2259. (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
  2260. WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
  2261. /* Setup our STATE so we know what happend when
  2262. the wheels fall off. */
  2263. currSCCB->Sccb_scsistat = SELECT_ST;
  2264. currTar_Info->TarLUNBusy[lun] = 1;
  2265. }
  2266. else
  2267. {
  2268. WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
  2269. WRW_HARPOON((port+ID_MSG_STRT+2), (MPM_OP+AMSG_OUT+
  2270. (((UCHAR)(currSCCB->ControlByte & TAG_TYPE_MASK)
  2271. >> 6) | (UCHAR)0x20)));
  2272. for (i = 1; i < QUEUE_DEPTH; i++)
  2273. {
  2274. if (++lastTag >= QUEUE_DEPTH) lastTag = 1;
  2275. if (CurrCard->discQ_Tbl[lastTag] == NULL)
  2276. {
  2277. WRW_HARPOON((port+ID_MSG_STRT+6),
  2278. (MPM_OP+AMSG_OUT+lastTag));
  2279. CurrCard->tagQ_Lst = lastTag;
  2280. currSCCB->Sccb_tag = lastTag;
  2281. CurrCard->discQ_Tbl[lastTag] = currSCCB;
  2282. CurrCard->discQCount++;
  2283. break;
  2284. }
  2285. }
  2286. if ( i == QUEUE_DEPTH )
  2287. {
  2288. currTar_Info->TarLUNBusy[lun] = 1;
  2289. FPT_queueSelectFail(CurrCard,p_card);
  2290. SGRAM_ACCESS(port);
  2291. return;
  2292. }
  2293. currSCCB->Sccb_scsistat = SELECT_Q_ST;
  2294. WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
  2295. }
  2296. }
  2297. else
  2298. {
  2299. WRW_HARPOON((port+ID_MSG_STRT),BRH_OP+ALWAYS+NTCMD);
  2300. WRW_HARPOON((port+NON_TAG_ID_MSG),
  2301. (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
  2302. currSCCB->Sccb_scsistat = SELECT_ST;
  2303. WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
  2304. }
  2305. theCCB = (UCHAR *)&currSCCB->Cdb[0];
  2306. cdb_reg = port + CMD_STRT;
  2307. for (i=0; i < currSCCB->CdbLength; i++)
  2308. {
  2309. WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + *theCCB));
  2310. cdb_reg +=2;
  2311. theCCB++;
  2312. }
  2313. if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
  2314. WRW_HARPOON(cdb_reg, (BRH_OP+ALWAYS+ NP));
  2315. } /* auto_loaded */
  2316. WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
  2317. WR_HARPOON(port+hp_xferstat, 0x00);
  2318. WRW_HARPOON((port+hp_intstat), (PROG_HLT | TIMEOUT | SEL | BUS_FREE));
  2319. WR_HARPOON(port+hp_portctrl_0,(SCSI_PORT));
  2320. if (!(currSCCB->Sccb_MGRFlags & F_DEV_SELECTED))
  2321. {
  2322. WR_HARPOON(port+hp_scsictrl_0, (SEL_TAR | ENA_ATN | ENA_RESEL | ENA_SCAM_SEL));
  2323. }
  2324. else
  2325. {
  2326. /* auto_loaded = (RD_HARPOON(port+hp_autostart_3) & (UCHAR)0x1F);
  2327. auto_loaded |= AUTO_IMMED; */
  2328. auto_loaded = AUTO_IMMED;
  2329. DISABLE_AUTO(port);
  2330. WR_HARPOON(port+hp_autostart_3, auto_loaded);
  2331. }
  2332. SGRAM_ACCESS(port);
  2333. }
  2334. /*---------------------------------------------------------------------
  2335. *
  2336. * Function: FPT_sres
  2337. *
  2338. * Description: Hookup the correct CCB and handle the incoming messages.
  2339. *
  2340. *---------------------------------------------------------------------*/
  2341. static void FPT_sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
  2342. {
  2343. UCHAR our_target, message, lun = 0, tag, msgRetryCount;
  2344. PSCCBMgr_tar_info currTar_Info;
  2345. PSCCB currSCCB;
  2346. if(pCurrCard->currentSCCB != NULL)
  2347. {
  2348. currTar_Info = &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
  2349. DISABLE_AUTO(port);
  2350. WR_HARPOON((port+hp_scsictrl_0),(ENA_RESEL | ENA_SCAM_SEL));
  2351. currSCCB = pCurrCard->currentSCCB;
  2352. if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
  2353. {
  2354. currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
  2355. currSCCB->Sccb_scsistat = BUS_FREE_ST;
  2356. }
  2357. if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
  2358. {
  2359. currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
  2360. currSCCB->Sccb_scsistat = BUS_FREE_ST;
  2361. }
  2362. if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
  2363. ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
  2364. {
  2365. currTar_Info->TarLUNBusy[currSCCB->Lun] = 0;
  2366. if(currSCCB->Sccb_scsistat != ABORT_ST)
  2367. {
  2368. pCurrCard->discQCount--;
  2369. pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[currSCCB->Lun]]
  2370. = NULL;
  2371. }
  2372. }
  2373. else
  2374. {
  2375. currTar_Info->TarLUNBusy[0] = 0;
  2376. if(currSCCB->Sccb_tag)
  2377. {
  2378. if(currSCCB->Sccb_scsistat != ABORT_ST)
  2379. {
  2380. pCurrCard->discQCount--;
  2381. pCurrCard->discQ_Tbl[currSCCB->Sccb_tag] = NULL;
  2382. }
  2383. }else
  2384. {
  2385. if(currSCCB->Sccb_scsistat != ABORT_ST)
  2386. {
  2387. pCurrCard->discQCount--;
  2388. pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
  2389. }
  2390. }
  2391. }
  2392. FPT_queueSelectFail(&FPT_BL_Card[p_card],p_card);
  2393. }
  2394. WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
  2395. our_target = (UCHAR)(RD_HARPOON(port+hp_select_id) >> 4);
  2396. currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
  2397. msgRetryCount = 0;
  2398. do
  2399. {
  2400. currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
  2401. tag = 0;
  2402. while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
  2403. {
  2404. if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
  2405. {
  2406. WRW_HARPOON((port+hp_intstat), PHASE);
  2407. return;
  2408. }
  2409. }
  2410. WRW_HARPOON((port+hp_intstat), PHASE);
  2411. if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH)
  2412. {
  2413. message = FPT_sfm(port,pCurrCard->currentSCCB);
  2414. if (message)
  2415. {
  2416. if (message <= (0x80 | LUN_MASK))
  2417. {
  2418. lun = message & (UCHAR)LUN_MASK;
  2419. if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING)
  2420. {
  2421. if (currTar_Info->TarTagQ_Cnt != 0)
  2422. {
  2423. if (!(currTar_Info->TarLUN_CA))
  2424. {
  2425. ACCEPT_MSG(port); /*Release the ACK for ID msg. */
  2426. message = FPT_sfm(port,pCurrCard->currentSCCB);
  2427. if (message)
  2428. {
  2429. ACCEPT_MSG(port);
  2430. }
  2431. else
  2432. message = 0;
  2433. if(message != 0)
  2434. {
  2435. tag = FPT_sfm(port,pCurrCard->currentSCCB);
  2436. if (!(tag))
  2437. message = 0;
  2438. }
  2439. } /*C.A. exists! */
  2440. } /*End Q cnt != 0 */
  2441. } /*End Tag cmds supported! */
  2442. } /*End valid ID message. */
  2443. else
  2444. {
  2445. ACCEPT_MSG_ATN(port);
  2446. }
  2447. } /* End good id message. */
  2448. else
  2449. {
  2450. message = 0;
  2451. }
  2452. }
  2453. else
  2454. {
  2455. ACCEPT_MSG_ATN(port);
  2456. while (!(RDW_HARPOON((port+hp_intstat)) & (PHASE | RESET)) &&
  2457. !(RD_HARPOON(port+hp_scsisig) & SCSI_REQ) &&
  2458. (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ;
  2459. return;
  2460. }
  2461. if(message == 0)
  2462. {
  2463. msgRetryCount++;
  2464. if(msgRetryCount == 1)
  2465. {
  2466. FPT_SendMsg(port, SMPARITY);
  2467. }
  2468. else
  2469. {
  2470. FPT_SendMsg(port, SMDEV_RESET);
  2471. FPT_sssyncv(port, our_target, NARROW_SCSI,currTar_Info);
  2472. if (FPT_sccbMgrTbl[p_card][our_target].TarEEValue & EE_SYNC_MASK)
  2473. {
  2474. FPT_sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_SYNC_MASK;
  2475. }
  2476. if (FPT_sccbMgrTbl[p_card][our_target].TarEEValue & EE_WIDE_SCSI)
  2477. {
  2478. FPT_sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_WIDE_MASK;
  2479. }
  2480. FPT_queueFlushTargSccb(p_card, our_target, SCCB_COMPLETE);
  2481. FPT_SccbMgrTableInitTarget(p_card,our_target);
  2482. return;
  2483. }
  2484. }
  2485. }while(message == 0);
  2486. if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
  2487. ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
  2488. {
  2489. currTar_Info->TarLUNBusy[lun] = 1;
  2490. pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]];
  2491. if(pCurrCard->currentSCCB != NULL)
  2492. {
  2493. ACCEPT_MSG(port);
  2494. }
  2495. else
  2496. {
  2497. ACCEPT_MSG_ATN(port);
  2498. }
  2499. }
  2500. else
  2501. {
  2502. currTar_Info->TarLUNBusy[0] = 1;
  2503. if (tag)
  2504. {
  2505. if (pCurrCard->discQ_Tbl[tag] != NULL)
  2506. {
  2507. pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[tag];
  2508. currTar_Info->TarTagQ_Cnt--;
  2509. ACCEPT_MSG(port);
  2510. }
  2511. else
  2512. {
  2513. ACCEPT_MSG_ATN(port);
  2514. }
  2515. }else
  2516. {
  2517. pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]];
  2518. if(pCurrCard->currentSCCB != NULL)
  2519. {
  2520. ACCEPT_MSG(port);
  2521. }
  2522. else
  2523. {
  2524. ACCEPT_MSG_ATN(port);
  2525. }
  2526. }
  2527. }
  2528. if(pCurrCard->currentSCCB != NULL)
  2529. {
  2530. if(pCurrCard->currentSCCB->Sccb_scsistat == ABORT_ST)
  2531. {
  2532. /* During Abort Tag command, the target could have got re-selected
  2533. and completed the command. Check the select Q and remove the CCB
  2534. if it is in the Select Q */
  2535. FPT_queueFindSccb(pCurrCard->currentSCCB, p_card);
  2536. }
  2537. }
  2538. while (!(RDW_HARPOON((port+hp_intstat)) & (PHASE | RESET)) &&
  2539. !(RD_HARPOON(port+hp_scsisig) & SCSI_REQ) &&
  2540. (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ;
  2541. }
  2542. static void FPT_SendMsg(ULONG port, UCHAR message)
  2543. {
  2544. while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
  2545. {
  2546. if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
  2547. {
  2548. WRW_HARPOON((port+hp_intstat), PHASE);
  2549. return;
  2550. }
  2551. }
  2552. WRW_HARPOON((port+hp_intstat), PHASE);
  2553. if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGO_PH)
  2554. {
  2555. WRW_HARPOON((port+hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
  2556. WR_HARPOON(port+hp_portctrl_0, SCSI_BUS_EN);
  2557. WR_HARPOON(port+hp_scsidata_0,message);
  2558. WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
  2559. ACCEPT_MSG(port);
  2560. WR_HARPOON(port+hp_portctrl_0, 0x00);
  2561. if ((message == SMABORT) || (message == SMDEV_RESET) ||
  2562. (message == SMABORT_TAG) )
  2563. {
  2564. while(!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | PHASE))) {}
  2565. if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE)
  2566. {
  2567. WRW_HARPOON((port+hp_intstat), BUS_FREE);
  2568. }
  2569. }
  2570. }
  2571. }
  2572. /*---------------------------------------------------------------------
  2573. *
  2574. * Function: FPT_sdecm
  2575. *
  2576. * Description: Determine the proper responce to the message from the
  2577. * target device.
  2578. *
  2579. *---------------------------------------------------------------------*/
  2580. static void FPT_sdecm(UCHAR message, ULONG port, UCHAR p_card)
  2581. {
  2582. PSCCB currSCCB;
  2583. PSCCBcard CurrCard;
  2584. PSCCBMgr_tar_info currTar_Info;
  2585. CurrCard = &FPT_BL_Card[p_card];
  2586. currSCCB = CurrCard->currentSCCB;
  2587. currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
  2588. if (message == SMREST_DATA_PTR)
  2589. {
  2590. if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET))
  2591. {
  2592. currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC;
  2593. FPT_hostDataXferRestart(currSCCB);
  2594. }
  2595. ACCEPT_MSG(port);
  2596. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2597. }
  2598. else if (message == SMCMD_COMP)
  2599. {
  2600. if (currSCCB->Sccb_scsistat == SELECT_Q_ST)
  2601. {
  2602. currTar_Info->TarStatus &= ~(UCHAR)TAR_TAG_Q_MASK;
  2603. currTar_Info->TarStatus |= (UCHAR)TAG_Q_REJECT;
  2604. }
  2605. ACCEPT_MSG(port);
  2606. }
  2607. else if ((message == SMNO_OP) || (message >= SMIDENT)
  2608. || (message == SMINIT_RECOVERY) || (message == SMREL_RECOVERY))
  2609. {
  2610. ACCEPT_MSG(port);
  2611. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2612. }
  2613. else if (message == SMREJECT)
  2614. {
  2615. if ((currSCCB->Sccb_scsistat == SELECT_SN_ST) ||
  2616. (currSCCB->Sccb_scsistat == SELECT_WN_ST) ||
  2617. ((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING ) ||
  2618. ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING ) )
  2619. {
  2620. WRW_HARPOON((port+hp_intstat), BUS_FREE);
  2621. ACCEPT_MSG(port);
  2622. while ((!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
  2623. (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))) {}
  2624. if(currSCCB->Lun == 0x00)
  2625. {
  2626. if ((currSCCB->Sccb_scsistat == SELECT_SN_ST))
  2627. {
  2628. currTar_Info->TarStatus |= (UCHAR)SYNC_SUPPORTED;
  2629. currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
  2630. }
  2631. else if ((currSCCB->Sccb_scsistat == SELECT_WN_ST))
  2632. {
  2633. currTar_Info->TarStatus = (currTar_Info->TarStatus &
  2634. ~WIDE_ENABLED) | WIDE_NEGOCIATED;
  2635. currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
  2636. }
  2637. else if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING )
  2638. {
  2639. currTar_Info->TarStatus = (currTar_Info->TarStatus &
  2640. ~(UCHAR)TAR_TAG_Q_MASK) | TAG_Q_REJECT;
  2641. currSCCB->ControlByte &= ~F_USE_CMD_Q;
  2642. CurrCard->discQCount--;
  2643. CurrCard->discQ_Tbl[currSCCB->Sccb_tag] = NULL;
  2644. currSCCB->Sccb_tag = 0x00;
  2645. }
  2646. }
  2647. if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE)
  2648. {
  2649. if(currSCCB->Lun == 0x00)
  2650. {
  2651. WRW_HARPOON((port+hp_intstat), BUS_FREE);
  2652. CurrCard->globalFlags |= F_NEW_SCCB_CMD;
  2653. }
  2654. }
  2655. else
  2656. {
  2657. if((CurrCard->globalFlags & F_CONLUN_IO) &&
  2658. ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  2659. currTar_Info->TarLUNBusy[currSCCB->Lun] = 1;
  2660. else
  2661. currTar_Info->TarLUNBusy[0] = 1;
  2662. currSCCB->ControlByte &= ~(UCHAR)F_USE_CMD_Q;
  2663. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2664. }
  2665. }
  2666. else
  2667. {
  2668. ACCEPT_MSG(port);
  2669. while ((!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
  2670. (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))) {}
  2671. if (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))
  2672. {
  2673. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2674. }
  2675. }
  2676. }
  2677. else if (message == SMEXT)
  2678. {
  2679. ACCEPT_MSG(port);
  2680. FPT_shandem(port,p_card,currSCCB);
  2681. }
  2682. else if (message == SMIGNORWR)
  2683. {
  2684. ACCEPT_MSG(port); /* ACK the RESIDUE MSG */
  2685. message = FPT_sfm(port,currSCCB);
  2686. if(currSCCB->Sccb_scsimsg != SMPARITY)
  2687. ACCEPT_MSG(port);
  2688. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2689. }
  2690. else
  2691. {
  2692. currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  2693. currSCCB->Sccb_scsimsg = SMREJECT;
  2694. ACCEPT_MSG_ATN(port);
  2695. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2696. }
  2697. }
  2698. /*---------------------------------------------------------------------
  2699. *
  2700. * Function: FPT_shandem
  2701. *
  2702. * Description: Decide what to do with the extended message.
  2703. *
  2704. *---------------------------------------------------------------------*/
  2705. static void FPT_shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
  2706. {
  2707. UCHAR length,message;
  2708. length = FPT_sfm(port,pCurrSCCB);
  2709. if (length)
  2710. {
  2711. ACCEPT_MSG(port);
  2712. message = FPT_sfm(port,pCurrSCCB);
  2713. if (message)
  2714. {
  2715. if (message == SMSYNC)
  2716. {
  2717. if (length == 0x03)
  2718. {
  2719. ACCEPT_MSG(port);
  2720. FPT_stsyncn(port,p_card);
  2721. }
  2722. else
  2723. {
  2724. pCurrSCCB->Sccb_scsimsg = SMREJECT;
  2725. ACCEPT_MSG_ATN(port);
  2726. }
  2727. }
  2728. else if (message == SMWDTR)
  2729. {
  2730. if (length == 0x02)
  2731. {
  2732. ACCEPT_MSG(port);
  2733. FPT_stwidn(port,p_card);
  2734. }
  2735. else
  2736. {
  2737. pCurrSCCB->Sccb_scsimsg = SMREJECT;
  2738. ACCEPT_MSG_ATN(port);
  2739. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2740. }
  2741. }
  2742. else
  2743. {
  2744. pCurrSCCB->Sccb_scsimsg = SMREJECT;
  2745. ACCEPT_MSG_ATN(port);
  2746. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2747. }
  2748. }
  2749. else
  2750. {
  2751. if(pCurrSCCB->Sccb_scsimsg != SMPARITY)
  2752. ACCEPT_MSG(port);
  2753. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2754. }
  2755. }else
  2756. {
  2757. if(pCurrSCCB->Sccb_scsimsg == SMPARITY)
  2758. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2759. }
  2760. }
  2761. /*---------------------------------------------------------------------
  2762. *
  2763. * Function: FPT_sisyncn
  2764. *
  2765. * Description: Read in a message byte from the SCSI bus, and check
  2766. * for a parity error.
  2767. *
  2768. *---------------------------------------------------------------------*/
  2769. static UCHAR FPT_sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag)
  2770. {
  2771. PSCCB currSCCB;
  2772. PSCCBMgr_tar_info currTar_Info;
  2773. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  2774. currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
  2775. if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) {
  2776. WRW_HARPOON((port+ID_MSG_STRT),
  2777. (MPM_OP+AMSG_OUT+(currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV)));
  2778. WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
  2779. WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
  2780. WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x03 ));
  2781. WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMSYNC));
  2782. if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
  2783. WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 12));
  2784. else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
  2785. WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 25));
  2786. else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
  2787. WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 50));
  2788. else
  2789. WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 00));
  2790. WRW_HARPOON((port+SYNC_MSGS+8), (RAT_OP ));
  2791. WRW_HARPOON((port+SYNC_MSGS+10),(MPM_OP+AMSG_OUT+DEFAULT_OFFSET));
  2792. WRW_HARPOON((port+SYNC_MSGS+12),(BRH_OP+ALWAYS+NP ));
  2793. if(syncFlag == 0)
  2794. {
  2795. WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
  2796. currTar_Info->TarStatus = ((currTar_Info->TarStatus &
  2797. ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_TRYING);
  2798. }
  2799. else
  2800. {
  2801. WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
  2802. }
  2803. return(1);
  2804. }
  2805. else {
  2806. currTar_Info->TarStatus |= (UCHAR)SYNC_SUPPORTED;
  2807. currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
  2808. return(0);
  2809. }
  2810. }
  2811. /*---------------------------------------------------------------------
  2812. *
  2813. * Function: FPT_stsyncn
  2814. *
  2815. * Description: The has sent us a Sync Nego message so handle it as
  2816. * necessary.
  2817. *
  2818. *---------------------------------------------------------------------*/
  2819. static void FPT_stsyncn(ULONG port, UCHAR p_card)
  2820. {
  2821. UCHAR sync_msg,offset,sync_reg,our_sync_msg;
  2822. PSCCB currSCCB;
  2823. PSCCBMgr_tar_info currTar_Info;
  2824. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  2825. currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
  2826. sync_msg = FPT_sfm(port,currSCCB);
  2827. if((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
  2828. {
  2829. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2830. return;
  2831. }
  2832. ACCEPT_MSG(port);
  2833. offset = FPT_sfm(port,currSCCB);
  2834. if((offset == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
  2835. {
  2836. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2837. return;
  2838. }
  2839. if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
  2840. our_sync_msg = 12; /* Setup our Message to 20mb/s */
  2841. else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
  2842. our_sync_msg = 25; /* Setup our Message to 10mb/s */
  2843. else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
  2844. our_sync_msg = 50; /* Setup our Message to 5mb/s */
  2845. else
  2846. our_sync_msg = 0; /* Message = Async */
  2847. if (sync_msg < our_sync_msg) {
  2848. sync_msg = our_sync_msg; /*if faster, then set to max. */
  2849. }
  2850. if (offset == ASYNC)
  2851. sync_msg = ASYNC;
  2852. if (offset > MAX_OFFSET)
  2853. offset = MAX_OFFSET;
  2854. sync_reg = 0x00;
  2855. if (sync_msg > 12)
  2856. sync_reg = 0x20; /* Use 10MB/s */
  2857. if (sync_msg > 25)
  2858. sync_reg = 0x40; /* Use 6.6MB/s */
  2859. if (sync_msg > 38)
  2860. sync_reg = 0x60; /* Use 5MB/s */
  2861. if (sync_msg > 50)
  2862. sync_reg = 0x80; /* Use 4MB/s */
  2863. if (sync_msg > 62)
  2864. sync_reg = 0xA0; /* Use 3.33MB/s */
  2865. if (sync_msg > 75)
  2866. sync_reg = 0xC0; /* Use 2.85MB/s */
  2867. if (sync_msg > 87)
  2868. sync_reg = 0xE0; /* Use 2.5MB/s */
  2869. if (sync_msg > 100) {
  2870. sync_reg = 0x00; /* Use ASYNC */
  2871. offset = 0x00;
  2872. }
  2873. if (currTar_Info->TarStatus & WIDE_ENABLED)
  2874. sync_reg |= offset;
  2875. else
  2876. sync_reg |= (offset | NARROW_SCSI);
  2877. FPT_sssyncv(port,currSCCB->TargID,sync_reg,currTar_Info);
  2878. if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
  2879. ACCEPT_MSG(port);
  2880. currTar_Info->TarStatus = ((currTar_Info->TarStatus &
  2881. ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_SUPPORTED);
  2882. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2883. }
  2884. else {
  2885. ACCEPT_MSG_ATN(port);
  2886. FPT_sisyncr(port,sync_msg,offset);
  2887. currTar_Info->TarStatus = ((currTar_Info->TarStatus &
  2888. ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_SUPPORTED);
  2889. }
  2890. }
  2891. /*---------------------------------------------------------------------
  2892. *
  2893. * Function: FPT_sisyncr
  2894. *
  2895. * Description: Answer the targets sync message.
  2896. *
  2897. *---------------------------------------------------------------------*/
  2898. static void FPT_sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset)
  2899. {
  2900. ARAM_ACCESS(port);
  2901. WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
  2902. WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x03 ));
  2903. WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMSYNC));
  2904. WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+sync_pulse));
  2905. WRW_HARPOON((port+SYNC_MSGS+8), (RAT_OP ));
  2906. WRW_HARPOON((port+SYNC_MSGS+10),(MPM_OP+AMSG_OUT+offset));
  2907. WRW_HARPOON((port+SYNC_MSGS+12),(BRH_OP+ALWAYS+NP ));
  2908. SGRAM_ACCESS(port);
  2909. WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
  2910. WRW_HARPOON((port+hp_intstat), CLR_ALL_INT_1);
  2911. WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED+CMD_ONLY_STRT));
  2912. while (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | AUTO_INT))) {}
  2913. }
  2914. /*---------------------------------------------------------------------
  2915. *
  2916. * Function: FPT_siwidn
  2917. *
  2918. * Description: Read in a message byte from the SCSI bus, and check
  2919. * for a parity error.
  2920. *
  2921. *---------------------------------------------------------------------*/
  2922. static UCHAR FPT_siwidn(ULONG port, UCHAR p_card)
  2923. {
  2924. PSCCB currSCCB;
  2925. PSCCBMgr_tar_info currTar_Info;
  2926. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  2927. currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
  2928. if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) {
  2929. WRW_HARPOON((port+ID_MSG_STRT),
  2930. (MPM_OP+AMSG_OUT+(currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV)));
  2931. WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
  2932. WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
  2933. WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x02 ));
  2934. WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMWDTR));
  2935. WRW_HARPOON((port+SYNC_MSGS+6), (RAT_OP ));
  2936. WRW_HARPOON((port+SYNC_MSGS+8), (MPM_OP+AMSG_OUT+ SM16BIT));
  2937. WRW_HARPOON((port+SYNC_MSGS+10),(BRH_OP+ALWAYS+NP ));
  2938. WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
  2939. currTar_Info->TarStatus = ((currTar_Info->TarStatus &
  2940. ~(UCHAR)TAR_WIDE_MASK) | (UCHAR)WIDE_ENABLED);
  2941. return(1);
  2942. }
  2943. else {
  2944. currTar_Info->TarStatus = ((currTar_Info->TarStatus &
  2945. ~(UCHAR)TAR_WIDE_MASK) | WIDE_NEGOCIATED);
  2946. currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
  2947. return(0);
  2948. }
  2949. }
  2950. /*---------------------------------------------------------------------
  2951. *
  2952. * Function: FPT_stwidn
  2953. *
  2954. * Description: The has sent us a Wide Nego message so handle it as
  2955. * necessary.
  2956. *
  2957. *---------------------------------------------------------------------*/
  2958. static void FPT_stwidn(ULONG port, UCHAR p_card)
  2959. {
  2960. UCHAR width;
  2961. PSCCB currSCCB;
  2962. PSCCBMgr_tar_info currTar_Info;
  2963. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  2964. currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
  2965. width = FPT_sfm(port,currSCCB);
  2966. if((width == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
  2967. {
  2968. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2969. return;
  2970. }
  2971. if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI))
  2972. width = 0;
  2973. if (width) {
  2974. currTar_Info->TarStatus |= WIDE_ENABLED;
  2975. width = 0;
  2976. }
  2977. else {
  2978. width = NARROW_SCSI;
  2979. currTar_Info->TarStatus &= ~WIDE_ENABLED;
  2980. }
  2981. FPT_sssyncv(port,currSCCB->TargID,width,currTar_Info);
  2982. if (currSCCB->Sccb_scsistat == SELECT_WN_ST)
  2983. {
  2984. currTar_Info->TarStatus |= WIDE_NEGOCIATED;
  2985. if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_SUPPORTED))
  2986. {
  2987. ACCEPT_MSG_ATN(port);
  2988. ARAM_ACCESS(port);
  2989. FPT_sisyncn(port,p_card, 1);
  2990. currSCCB->Sccb_scsistat = SELECT_SN_ST;
  2991. SGRAM_ACCESS(port);
  2992. }
  2993. else
  2994. {
  2995. ACCEPT_MSG(port);
  2996. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  2997. }
  2998. }
  2999. else {
  3000. ACCEPT_MSG_ATN(port);
  3001. if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
  3002. width = SM16BIT;
  3003. else
  3004. width = SM8BIT;
  3005. FPT_siwidr(port,width);
  3006. currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED);
  3007. }
  3008. }
  3009. /*---------------------------------------------------------------------
  3010. *
  3011. * Function: FPT_siwidr
  3012. *
  3013. * Description: Answer the targets Wide nego message.
  3014. *
  3015. *---------------------------------------------------------------------*/
  3016. static void FPT_siwidr(ULONG port, UCHAR width)
  3017. {
  3018. ARAM_ACCESS(port);
  3019. WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
  3020. WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x02 ));
  3021. WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMWDTR));
  3022. WRW_HARPOON((port+SYNC_MSGS+6), (RAT_OP ));
  3023. WRW_HARPOON((port+SYNC_MSGS+8),(MPM_OP+AMSG_OUT+width));
  3024. WRW_HARPOON((port+SYNC_MSGS+10),(BRH_OP+ALWAYS+NP ));
  3025. SGRAM_ACCESS(port);
  3026. WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
  3027. WRW_HARPOON((port+hp_intstat), CLR_ALL_INT_1);
  3028. WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED+CMD_ONLY_STRT));
  3029. while (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | AUTO_INT))) {}
  3030. }
  3031. /*---------------------------------------------------------------------
  3032. *
  3033. * Function: FPT_sssyncv
  3034. *
  3035. * Description: Write the desired value to the Sync Register for the
  3036. * ID specified.
  3037. *
  3038. *---------------------------------------------------------------------*/
  3039. static void FPT_sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value,
  3040. PSCCBMgr_tar_info currTar_Info)
  3041. {
  3042. UCHAR index;
  3043. index = p_id;
  3044. switch (index) {
  3045. case 0:
  3046. index = 12; /* hp_synctarg_0 */
  3047. break;
  3048. case 1:
  3049. index = 13; /* hp_synctarg_1 */
  3050. break;
  3051. case 2:
  3052. index = 14; /* hp_synctarg_2 */
  3053. break;
  3054. case 3:
  3055. index = 15; /* hp_synctarg_3 */
  3056. break;
  3057. case 4:
  3058. index = 8; /* hp_synctarg_4 */
  3059. break;
  3060. case 5:
  3061. index = 9; /* hp_synctarg_5 */
  3062. break;
  3063. case 6:
  3064. index = 10; /* hp_synctarg_6 */
  3065. break;
  3066. case 7:
  3067. index = 11; /* hp_synctarg_7 */
  3068. break;
  3069. case 8:
  3070. index = 4; /* hp_synctarg_8 */
  3071. break;
  3072. case 9:
  3073. index = 5; /* hp_synctarg_9 */
  3074. break;
  3075. case 10:
  3076. index = 6; /* hp_synctarg_10 */
  3077. break;
  3078. case 11:
  3079. index = 7; /* hp_synctarg_11 */
  3080. break;
  3081. case 12:
  3082. index = 0; /* hp_synctarg_12 */
  3083. break;
  3084. case 13:
  3085. index = 1; /* hp_synctarg_13 */
  3086. break;
  3087. case 14:
  3088. index = 2; /* hp_synctarg_14 */
  3089. break;
  3090. case 15:
  3091. index = 3; /* hp_synctarg_15 */
  3092. }
  3093. WR_HARPOON(p_port+hp_synctarg_base+index, p_sync_value);
  3094. currTar_Info->TarSyncCtrl = p_sync_value;
  3095. }
  3096. /*---------------------------------------------------------------------
  3097. *
  3098. * Function: FPT_sresb
  3099. *
  3100. * Description: Reset the desired card's SCSI bus.
  3101. *
  3102. *---------------------------------------------------------------------*/
  3103. static void FPT_sresb(ULONG port, UCHAR p_card)
  3104. {
  3105. UCHAR scsiID, i;
  3106. PSCCBMgr_tar_info currTar_Info;
  3107. WR_HARPOON(port+hp_page_ctrl,
  3108. (RD_HARPOON(port+hp_page_ctrl) | G_INT_DISABLE));
  3109. WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
  3110. WR_HARPOON(port+hp_scsictrl_0, SCSI_RST);
  3111. scsiID = RD_HARPOON(port+hp_seltimeout);
  3112. WR_HARPOON(port+hp_seltimeout,TO_5ms);
  3113. WRW_HARPOON((port+hp_intstat), TIMEOUT);
  3114. WR_HARPOON(port+hp_portctrl_0,(SCSI_PORT | START_TO));
  3115. while (!(RDW_HARPOON((port+hp_intstat)) & TIMEOUT)) {}
  3116. WR_HARPOON(port+hp_seltimeout,scsiID);
  3117. WR_HARPOON(port+hp_scsictrl_0, ENA_SCAM_SEL);
  3118. FPT_Wait(port, TO_5ms);
  3119. WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
  3120. WR_HARPOON(port+hp_int_mask, (RD_HARPOON(port+hp_int_mask) | 0x00));
  3121. for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++)
  3122. {
  3123. currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
  3124. if (currTar_Info->TarEEValue & EE_SYNC_MASK)
  3125. {
  3126. currTar_Info->TarSyncCtrl = 0;
  3127. currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
  3128. }
  3129. if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
  3130. {
  3131. currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
  3132. }
  3133. FPT_sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
  3134. FPT_SccbMgrTableInitTarget(p_card, scsiID);
  3135. }
  3136. FPT_BL_Card[p_card].scanIndex = 0x00;
  3137. FPT_BL_Card[p_card].currentSCCB = NULL;
  3138. FPT_BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT
  3139. | F_NEW_SCCB_CMD);
  3140. FPT_BL_Card[p_card].cmdCounter = 0x00;
  3141. FPT_BL_Card[p_card].discQCount = 0x00;
  3142. FPT_BL_Card[p_card].tagQ_Lst = 0x01;
  3143. for(i = 0; i < QUEUE_DEPTH; i++)
  3144. FPT_BL_Card[p_card].discQ_Tbl[i] = NULL;
  3145. WR_HARPOON(port+hp_page_ctrl,
  3146. (RD_HARPOON(port+hp_page_ctrl) & ~G_INT_DISABLE));
  3147. }
  3148. /*---------------------------------------------------------------------
  3149. *
  3150. * Function: FPT_ssenss
  3151. *
  3152. * Description: Setup for the Auto Sense command.
  3153. *
  3154. *---------------------------------------------------------------------*/
  3155. static void FPT_ssenss(PSCCBcard pCurrCard)
  3156. {
  3157. UCHAR i;
  3158. PSCCB currSCCB;
  3159. currSCCB = pCurrCard->currentSCCB;
  3160. currSCCB->Save_CdbLen = currSCCB->CdbLength;
  3161. for (i = 0; i < 6; i++) {
  3162. currSCCB->Save_Cdb[i] = currSCCB->Cdb[i];
  3163. }
  3164. currSCCB->CdbLength = SIX_BYTE_CMD;
  3165. currSCCB->Cdb[0] = SCSI_REQUEST_SENSE;
  3166. currSCCB->Cdb[1] = currSCCB->Cdb[1] & (UCHAR)0xE0; /*Keep LUN. */
  3167. currSCCB->Cdb[2] = 0x00;
  3168. currSCCB->Cdb[3] = 0x00;
  3169. currSCCB->Cdb[4] = currSCCB->RequestSenseLength;
  3170. currSCCB->Cdb[5] = 0x00;
  3171. currSCCB->Sccb_XferCnt = (unsigned long)currSCCB->RequestSenseLength;
  3172. currSCCB->Sccb_ATC = 0x00;
  3173. currSCCB->Sccb_XferState |= F_AUTO_SENSE;
  3174. currSCCB->Sccb_XferState &= ~F_SG_XFER;
  3175. currSCCB->Sccb_idmsg = currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV;
  3176. currSCCB->ControlByte = 0x00;
  3177. currSCCB->Sccb_MGRFlags &= F_STATUSLOADED;
  3178. }
  3179. /*---------------------------------------------------------------------
  3180. *
  3181. * Function: FPT_sxfrp
  3182. *
  3183. * Description: Transfer data into the bit bucket until the device
  3184. * decides to switch phase.
  3185. *
  3186. *---------------------------------------------------------------------*/
  3187. static void FPT_sxfrp(ULONG p_port, UCHAR p_card)
  3188. {
  3189. UCHAR curr_phz;
  3190. DISABLE_AUTO(p_port);
  3191. if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
  3192. FPT_hostDataXferAbort(p_port,p_card,FPT_BL_Card[p_card].currentSCCB);
  3193. }
  3194. /* If the Automation handled the end of the transfer then do not
  3195. match the phase or we will get out of sync with the ISR. */
  3196. if (RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | XFER_CNT_0 | AUTO_INT))
  3197. return;
  3198. WR_HARPOON(p_port+hp_xfercnt_0, 0x00);
  3199. curr_phz = RD_HARPOON(p_port+hp_scsisig) & (UCHAR)S_SCSI_PHZ;
  3200. WRW_HARPOON((p_port+hp_intstat), XFER_CNT_0);
  3201. WR_HARPOON(p_port+hp_scsisig, curr_phz);
  3202. while ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)) &&
  3203. (curr_phz == (RD_HARPOON(p_port+hp_scsisig) & (UCHAR)S_SCSI_PHZ)) )
  3204. {
  3205. if (curr_phz & (UCHAR)SCSI_IOBIT)
  3206. {
  3207. WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | SCSI_INBIT));
  3208. if (!(RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY))
  3209. {
  3210. RD_HARPOON(p_port+hp_fifodata_0);
  3211. }
  3212. }
  3213. else
  3214. {
  3215. WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | HOST_WRT));
  3216. if (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY)
  3217. {
  3218. WR_HARPOON(p_port+hp_fifodata_0,0xFA);
  3219. }
  3220. }
  3221. } /* End of While loop for padding data I/O phase */
  3222. while ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
  3223. {
  3224. if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
  3225. break;
  3226. }
  3227. WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | SCSI_INBIT));
  3228. while (!(RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY))
  3229. {
  3230. RD_HARPOON(p_port+hp_fifodata_0);
  3231. }
  3232. if ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
  3233. {
  3234. WR_HARPOON(p_port+hp_autostart_0, (AUTO_IMMED+DISCONNECT_START));
  3235. while (!(RDW_HARPOON((p_port+hp_intstat)) & AUTO_INT)) {}
  3236. if (RDW_HARPOON((p_port+hp_intstat)) & (ICMD_COMP | ITAR_DISC))
  3237. while (!(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RSEL))) ;
  3238. }
  3239. }
  3240. /*---------------------------------------------------------------------
  3241. *
  3242. * Function: FPT_schkdd
  3243. *
  3244. * Description: Make sure data has been flushed from both FIFOs and abort
  3245. * the operations if necessary.
  3246. *
  3247. *---------------------------------------------------------------------*/
  3248. static void FPT_schkdd(ULONG port, UCHAR p_card)
  3249. {
  3250. USHORT TimeOutLoop;
  3251. UCHAR sPhase;
  3252. PSCCB currSCCB;
  3253. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  3254. if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) &&
  3255. (currSCCB->Sccb_scsistat != DATA_IN_ST)) {
  3256. return;
  3257. }
  3258. if (currSCCB->Sccb_XferState & F_ODD_BALL_CNT)
  3259. {
  3260. currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt-1);
  3261. currSCCB->Sccb_XferCnt = 1;
  3262. currSCCB->Sccb_XferState &= ~F_ODD_BALL_CNT;
  3263. WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
  3264. WR_HARPOON(port+hp_xferstat, 0x00);
  3265. }
  3266. else
  3267. {
  3268. currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
  3269. currSCCB->Sccb_XferCnt = 0;
  3270. }
  3271. if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
  3272. (currSCCB->HostStatus == SCCB_COMPLETE)) {
  3273. currSCCB->HostStatus = SCCB_PARITY_ERR;
  3274. WRW_HARPOON((port+hp_intstat), PARITY);
  3275. }
  3276. FPT_hostDataXferAbort(port,p_card,currSCCB);
  3277. while (RD_HARPOON(port+hp_scsisig) & SCSI_ACK) {}
  3278. TimeOutLoop = 0;
  3279. while(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)
  3280. {
  3281. if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE) {
  3282. return;
  3283. }
  3284. if (RD_HARPOON(port+hp_offsetctr) & (UCHAR)0x1F) {
  3285. break;
  3286. }
  3287. if (RDW_HARPOON((port+hp_intstat)) & RESET) {
  3288. return;
  3289. }
  3290. if ((RD_HARPOON(port+hp_scsisig) & SCSI_REQ) || (TimeOutLoop++>0x3000) )
  3291. break;
  3292. }
  3293. sPhase = RD_HARPOON(port+hp_scsisig) & (SCSI_BSY | S_SCSI_PHZ);
  3294. if ((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) ||
  3295. (RD_HARPOON(port+hp_offsetctr) & (UCHAR)0x1F) ||
  3296. (sPhase == (SCSI_BSY | S_DATAO_PH)) ||
  3297. (sPhase == (SCSI_BSY | S_DATAI_PH)))
  3298. {
  3299. WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
  3300. if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED))
  3301. {
  3302. if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
  3303. FPT_phaseDataIn(port,p_card);
  3304. }
  3305. else {
  3306. FPT_phaseDataOut(port,p_card);
  3307. }
  3308. }
  3309. else
  3310. {
  3311. FPT_sxfrp(port,p_card);
  3312. if (!(RDW_HARPOON((port+hp_intstat)) &
  3313. (BUS_FREE | ICMD_COMP | ITAR_DISC | RESET)))
  3314. {
  3315. WRW_HARPOON((port+hp_intstat), AUTO_INT);
  3316. FPT_phaseDecode(port,p_card);
  3317. }
  3318. }
  3319. }
  3320. else {
  3321. WR_HARPOON(port+hp_portctrl_0, 0x00);
  3322. }
  3323. }
  3324. /*---------------------------------------------------------------------
  3325. *
  3326. * Function: FPT_sinits
  3327. *
  3328. * Description: Setup SCCB manager fields in this SCCB.
  3329. *
  3330. *---------------------------------------------------------------------*/
  3331. static void FPT_sinits(PSCCB p_sccb, UCHAR p_card)
  3332. {
  3333. PSCCBMgr_tar_info currTar_Info;
  3334. if((p_sccb->TargID > MAX_SCSI_TAR) || (p_sccb->Lun > MAX_LUN))
  3335. {
  3336. return;
  3337. }
  3338. currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
  3339. p_sccb->Sccb_XferState = 0x00;
  3340. p_sccb->Sccb_XferCnt = p_sccb->DataLength;
  3341. if ((p_sccb->OperationCode == SCATTER_GATHER_COMMAND) ||
  3342. (p_sccb->OperationCode == RESIDUAL_SG_COMMAND)) {
  3343. p_sccb->Sccb_SGoffset = 0;
  3344. p_sccb->Sccb_XferState = F_SG_XFER;
  3345. p_sccb->Sccb_XferCnt = 0x00;
  3346. }
  3347. if (p_sccb->DataLength == 0x00)
  3348. p_sccb->Sccb_XferState |= F_ALL_XFERRED;
  3349. if (p_sccb->ControlByte & F_USE_CMD_Q)
  3350. {
  3351. if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
  3352. p_sccb->ControlByte &= ~F_USE_CMD_Q;
  3353. else
  3354. currTar_Info->TarStatus |= TAG_Q_TRYING;
  3355. }
  3356. /* For !single SCSI device in system & device allow Disconnect
  3357. or command is tag_q type then send Cmd with Disconnect Enable
  3358. else send Cmd with Disconnect Disable */
  3359. /*
  3360. if (((!(FPT_BL_Card[p_card].globalFlags & F_SINGLE_DEVICE)) &&
  3361. (currTar_Info->TarStatus & TAR_ALLOW_DISC)) ||
  3362. (currTar_Info->TarStatus & TAG_Q_TRYING)) {
  3363. */
  3364. if ((currTar_Info->TarStatus & TAR_ALLOW_DISC) ||
  3365. (currTar_Info->TarStatus & TAG_Q_TRYING)) {
  3366. p_sccb->Sccb_idmsg = (UCHAR)(SMIDENT | DISC_PRIV) | p_sccb->Lun;
  3367. }
  3368. else {
  3369. p_sccb->Sccb_idmsg = (UCHAR)SMIDENT | p_sccb->Lun;
  3370. }
  3371. p_sccb->HostStatus = 0x00;
  3372. p_sccb->TargetStatus = 0x00;
  3373. p_sccb->Sccb_tag = 0x00;
  3374. p_sccb->Sccb_MGRFlags = 0x00;
  3375. p_sccb->Sccb_sgseg = 0x00;
  3376. p_sccb->Sccb_ATC = 0x00;
  3377. p_sccb->Sccb_savedATC = 0x00;
  3378. /*
  3379. p_sccb->SccbVirtDataPtr = 0x00;
  3380. p_sccb->Sccb_forwardlink = NULL;
  3381. p_sccb->Sccb_backlink = NULL;
  3382. */
  3383. p_sccb->Sccb_scsistat = BUS_FREE_ST;
  3384. p_sccb->SccbStatus = SCCB_IN_PROCESS;
  3385. p_sccb->Sccb_scsimsg = SMNO_OP;
  3386. }
  3387. /*---------------------------------------------------------------------
  3388. *
  3389. * Function: Phase Decode
  3390. *
  3391. * Description: Determine the phase and call the appropriate function.
  3392. *
  3393. *---------------------------------------------------------------------*/
  3394. static void FPT_phaseDecode(ULONG p_port, UCHAR p_card)
  3395. {
  3396. unsigned char phase_ref;
  3397. void (*phase) (ULONG, UCHAR);
  3398. DISABLE_AUTO(p_port);
  3399. phase_ref = (UCHAR) (RD_HARPOON(p_port+hp_scsisig) & S_SCSI_PHZ);
  3400. phase = FPT_s_PhaseTbl[phase_ref];
  3401. (*phase)(p_port, p_card); /* Call the correct phase func */
  3402. }
  3403. /*---------------------------------------------------------------------
  3404. *
  3405. * Function: Data Out Phase
  3406. *
  3407. * Description: Start up both the BusMaster and Xbow.
  3408. *
  3409. *---------------------------------------------------------------------*/
  3410. static void FPT_phaseDataOut(ULONG port, UCHAR p_card)
  3411. {
  3412. PSCCB currSCCB;
  3413. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  3414. if (currSCCB == NULL)
  3415. {
  3416. return; /* Exit if No SCCB record */
  3417. }
  3418. currSCCB->Sccb_scsistat = DATA_OUT_ST;
  3419. currSCCB->Sccb_XferState &= ~(F_HOST_XFER_DIR | F_NO_DATA_YET);
  3420. WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
  3421. WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
  3422. WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START));
  3423. FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
  3424. if (currSCCB->Sccb_XferCnt == 0) {
  3425. if ((currSCCB->ControlByte & SCCB_DATA_XFER_OUT) &&
  3426. (currSCCB->HostStatus == SCCB_COMPLETE))
  3427. currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
  3428. FPT_sxfrp(port,p_card);
  3429. if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET)))
  3430. FPT_phaseDecode(port,p_card);
  3431. }
  3432. }
  3433. /*---------------------------------------------------------------------
  3434. *
  3435. * Function: Data In Phase
  3436. *
  3437. * Description: Startup the BusMaster and the XBOW.
  3438. *
  3439. *---------------------------------------------------------------------*/
  3440. static void FPT_phaseDataIn(ULONG port, UCHAR p_card)
  3441. {
  3442. PSCCB currSCCB;
  3443. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  3444. if (currSCCB == NULL)
  3445. {
  3446. return; /* Exit if No SCCB record */
  3447. }
  3448. currSCCB->Sccb_scsistat = DATA_IN_ST;
  3449. currSCCB->Sccb_XferState |= F_HOST_XFER_DIR;
  3450. currSCCB->Sccb_XferState &= ~F_NO_DATA_YET;
  3451. WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
  3452. WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
  3453. WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START));
  3454. FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
  3455. if (currSCCB->Sccb_XferCnt == 0) {
  3456. if ((currSCCB->ControlByte & SCCB_DATA_XFER_IN) &&
  3457. (currSCCB->HostStatus == SCCB_COMPLETE))
  3458. currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
  3459. FPT_sxfrp(port,p_card);
  3460. if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET)))
  3461. FPT_phaseDecode(port,p_card);
  3462. }
  3463. }
  3464. /*---------------------------------------------------------------------
  3465. *
  3466. * Function: Command Phase
  3467. *
  3468. * Description: Load the CDB into the automation and start it up.
  3469. *
  3470. *---------------------------------------------------------------------*/
  3471. static void FPT_phaseCommand(ULONG p_port, UCHAR p_card)
  3472. {
  3473. PSCCB currSCCB;
  3474. ULONG cdb_reg;
  3475. UCHAR i;
  3476. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  3477. if (currSCCB->OperationCode == RESET_COMMAND) {
  3478. currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  3479. currSCCB->CdbLength = SIX_BYTE_CMD;
  3480. }
  3481. WR_HARPOON(p_port+hp_scsisig, 0x00);
  3482. ARAM_ACCESS(p_port);
  3483. cdb_reg = p_port + CMD_STRT;
  3484. for (i=0; i < currSCCB->CdbLength; i++) {
  3485. if (currSCCB->OperationCode == RESET_COMMAND)
  3486. WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + 0x00));
  3487. else
  3488. WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + currSCCB->Cdb[i]));
  3489. cdb_reg +=2;
  3490. }
  3491. if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
  3492. WRW_HARPOON(cdb_reg, (BRH_OP+ALWAYS+ NP));
  3493. WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT));
  3494. currSCCB->Sccb_scsistat = COMMAND_ST;
  3495. WR_HARPOON(p_port+hp_autostart_3, (AUTO_IMMED | CMD_ONLY_STRT));
  3496. SGRAM_ACCESS(p_port);
  3497. }
  3498. /*---------------------------------------------------------------------
  3499. *
  3500. * Function: Status phase
  3501. *
  3502. * Description: Bring in the status and command complete message bytes
  3503. *
  3504. *---------------------------------------------------------------------*/
  3505. static void FPT_phaseStatus(ULONG port, UCHAR p_card)
  3506. {
  3507. /* Start-up the automation to finish off this command and let the
  3508. isr handle the interrupt for command complete when it comes in.
  3509. We could wait here for the interrupt to be generated?
  3510. */
  3511. WR_HARPOON(port+hp_scsisig, 0x00);
  3512. WR_HARPOON(port+hp_autostart_0, (AUTO_IMMED+END_DATA_START));
  3513. }
  3514. /*---------------------------------------------------------------------
  3515. *
  3516. * Function: Phase Message Out
  3517. *
  3518. * Description: Send out our message (if we have one) and handle whatever
  3519. * else is involed.
  3520. *
  3521. *---------------------------------------------------------------------*/
  3522. static void FPT_phaseMsgOut(ULONG port, UCHAR p_card)
  3523. {
  3524. UCHAR message,scsiID;
  3525. PSCCB currSCCB;
  3526. PSCCBMgr_tar_info currTar_Info;
  3527. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  3528. if (currSCCB != NULL) {
  3529. message = currSCCB->Sccb_scsimsg;
  3530. scsiID = currSCCB->TargID;
  3531. if (message == SMDEV_RESET)
  3532. {
  3533. currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
  3534. currTar_Info->TarSyncCtrl = 0;
  3535. FPT_sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
  3536. if (FPT_sccbMgrTbl[p_card][scsiID].TarEEValue & EE_SYNC_MASK)
  3537. {
  3538. FPT_sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_SYNC_MASK;
  3539. }
  3540. if (FPT_sccbMgrTbl[p_card][scsiID].TarEEValue & EE_WIDE_SCSI)
  3541. {
  3542. FPT_sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_WIDE_MASK;
  3543. }
  3544. FPT_queueFlushSccb(p_card,SCCB_COMPLETE);
  3545. FPT_SccbMgrTableInitTarget(p_card,scsiID);
  3546. }
  3547. else if (currSCCB->Sccb_scsistat == ABORT_ST)
  3548. {
  3549. currSCCB->HostStatus = SCCB_COMPLETE;
  3550. if(FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] != NULL)
  3551. {
  3552. FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
  3553. FPT_sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--;
  3554. }
  3555. }
  3556. else if (currSCCB->Sccb_scsistat < COMMAND_ST)
  3557. {
  3558. if(message == SMNO_OP)
  3559. {
  3560. currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED;
  3561. FPT_ssel(port,p_card);
  3562. return;
  3563. }
  3564. }
  3565. else
  3566. {
  3567. if (message == SMABORT)
  3568. FPT_queueFlushSccb(p_card,SCCB_COMPLETE);
  3569. }
  3570. }
  3571. else
  3572. {
  3573. message = SMABORT;
  3574. }
  3575. WRW_HARPOON((port+hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
  3576. WR_HARPOON(port+hp_portctrl_0, SCSI_BUS_EN);
  3577. WR_HARPOON(port+hp_scsidata_0,message);
  3578. WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
  3579. ACCEPT_MSG(port);
  3580. WR_HARPOON(port+hp_portctrl_0, 0x00);
  3581. if ((message == SMABORT) || (message == SMDEV_RESET) ||
  3582. (message == SMABORT_TAG) )
  3583. {
  3584. while(!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | PHASE))) {}
  3585. if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE)
  3586. {
  3587. WRW_HARPOON((port+hp_intstat), BUS_FREE);
  3588. if (currSCCB != NULL)
  3589. {
  3590. if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  3591. ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  3592. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0;
  3593. else
  3594. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
  3595. FPT_queueCmdComplete(&FPT_BL_Card[p_card],currSCCB, p_card);
  3596. }
  3597. else
  3598. {
  3599. FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
  3600. }
  3601. }
  3602. else
  3603. {
  3604. FPT_sxfrp(port,p_card);
  3605. }
  3606. }
  3607. else
  3608. {
  3609. if(message == SMPARITY)
  3610. {
  3611. currSCCB->Sccb_scsimsg = SMNO_OP;
  3612. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  3613. }
  3614. else
  3615. {
  3616. FPT_sxfrp(port,p_card);
  3617. }
  3618. }
  3619. }
  3620. /*---------------------------------------------------------------------
  3621. *
  3622. * Function: Message In phase
  3623. *
  3624. * Description: Bring in the message and determine what to do with it.
  3625. *
  3626. *---------------------------------------------------------------------*/
  3627. static void FPT_phaseMsgIn(ULONG port, UCHAR p_card)
  3628. {
  3629. UCHAR message;
  3630. PSCCB currSCCB;
  3631. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  3632. if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT)
  3633. {
  3634. FPT_phaseChkFifo(port, p_card);
  3635. }
  3636. message = RD_HARPOON(port+hp_scsidata_0);
  3637. if ((message == SMDISC) || (message == SMSAVE_DATA_PTR))
  3638. {
  3639. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+END_DATA_START));
  3640. }
  3641. else
  3642. {
  3643. message = FPT_sfm(port,currSCCB);
  3644. if (message)
  3645. {
  3646. FPT_sdecm(message,port,p_card);
  3647. }
  3648. else
  3649. {
  3650. if(currSCCB->Sccb_scsimsg != SMPARITY)
  3651. ACCEPT_MSG(port);
  3652. WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
  3653. }
  3654. }
  3655. }
  3656. /*---------------------------------------------------------------------
  3657. *
  3658. * Function: Illegal phase
  3659. *
  3660. * Description: Target switched to some illegal phase, so all we can do
  3661. * is report an error back to the host (if that is possible)
  3662. * and send an ABORT message to the misbehaving target.
  3663. *
  3664. *---------------------------------------------------------------------*/
  3665. static void FPT_phaseIllegal(ULONG port, UCHAR p_card)
  3666. {
  3667. PSCCB currSCCB;
  3668. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  3669. WR_HARPOON(port+hp_scsisig, RD_HARPOON(port+hp_scsisig));
  3670. if (currSCCB != NULL) {
  3671. currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  3672. currSCCB->Sccb_scsistat = ABORT_ST;
  3673. currSCCB->Sccb_scsimsg = SMABORT;
  3674. }
  3675. ACCEPT_MSG_ATN(port);
  3676. }
  3677. /*---------------------------------------------------------------------
  3678. *
  3679. * Function: Phase Check FIFO
  3680. *
  3681. * Description: Make sure data has been flushed from both FIFOs and abort
  3682. * the operations if necessary.
  3683. *
  3684. *---------------------------------------------------------------------*/
  3685. static void FPT_phaseChkFifo(ULONG port, UCHAR p_card)
  3686. {
  3687. ULONG xfercnt;
  3688. PSCCB currSCCB;
  3689. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  3690. if (currSCCB->Sccb_scsistat == DATA_IN_ST)
  3691. {
  3692. while((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) &&
  3693. (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY)) {}
  3694. if (!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY))
  3695. {
  3696. currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
  3697. currSCCB->Sccb_XferCnt = 0;
  3698. if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
  3699. (currSCCB->HostStatus == SCCB_COMPLETE))
  3700. {
  3701. currSCCB->HostStatus = SCCB_PARITY_ERR;
  3702. WRW_HARPOON((port+hp_intstat), PARITY);
  3703. }
  3704. FPT_hostDataXferAbort(port,p_card,currSCCB);
  3705. FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
  3706. while((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) &&
  3707. (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY)) {}
  3708. }
  3709. } /*End Data In specific code. */
  3710. GET_XFER_CNT(port,xfercnt);
  3711. WR_HARPOON(port+hp_xfercnt_0, 0x00);
  3712. WR_HARPOON(port+hp_portctrl_0, 0x00);
  3713. currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - xfercnt);
  3714. currSCCB->Sccb_XferCnt = xfercnt;
  3715. if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
  3716. (currSCCB->HostStatus == SCCB_COMPLETE)) {
  3717. currSCCB->HostStatus = SCCB_PARITY_ERR;
  3718. WRW_HARPOON((port+hp_intstat), PARITY);
  3719. }
  3720. FPT_hostDataXferAbort(port,p_card,currSCCB);
  3721. WR_HARPOON(port+hp_fifowrite, 0x00);
  3722. WR_HARPOON(port+hp_fiforead, 0x00);
  3723. WR_HARPOON(port+hp_xferstat, 0x00);
  3724. WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
  3725. }
  3726. /*---------------------------------------------------------------------
  3727. *
  3728. * Function: Phase Bus Free
  3729. *
  3730. * Description: We just went bus free so figure out if it was
  3731. * because of command complete or from a disconnect.
  3732. *
  3733. *---------------------------------------------------------------------*/
  3734. static void FPT_phaseBusFree(ULONG port, UCHAR p_card)
  3735. {
  3736. PSCCB currSCCB;
  3737. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  3738. if (currSCCB != NULL)
  3739. {
  3740. DISABLE_AUTO(port);
  3741. if (currSCCB->OperationCode == RESET_COMMAND)
  3742. {
  3743. if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  3744. ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  3745. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0;
  3746. else
  3747. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
  3748. FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card);
  3749. FPT_queueSearchSelect(&FPT_BL_Card[p_card],p_card);
  3750. }
  3751. else if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
  3752. {
  3753. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
  3754. (UCHAR)SYNC_SUPPORTED;
  3755. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
  3756. }
  3757. else if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
  3758. {
  3759. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
  3760. (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  3761. TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
  3762. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
  3763. }
  3764. else if(currSCCB->Sccb_scsistat == SELECT_Q_ST)
  3765. {
  3766. /* Make sure this is not a phony BUS_FREE. If we were
  3767. reselected or if BUSY is NOT on then this is a
  3768. valid BUS FREE. SRR Wednesday, 5/10/1995. */
  3769. if ((!(RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ||
  3770. (RDW_HARPOON((port+hp_intstat)) & RSEL))
  3771. {
  3772. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_TAG_Q_MASK;
  3773. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= TAG_Q_REJECT;
  3774. }
  3775. else
  3776. {
  3777. return;
  3778. }
  3779. }
  3780. else
  3781. {
  3782. currSCCB->Sccb_scsistat = BUS_FREE_ST;
  3783. if (!currSCCB->HostStatus)
  3784. {
  3785. currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  3786. }
  3787. if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  3788. ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  3789. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0;
  3790. else
  3791. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
  3792. FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card);
  3793. return;
  3794. }
  3795. FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
  3796. } /*end if !=null */
  3797. }
  3798. /*---------------------------------------------------------------------
  3799. *
  3800. * Function: Auto Load Default Map
  3801. *
  3802. * Description: Load the Automation RAM with the defualt map values.
  3803. *
  3804. *---------------------------------------------------------------------*/
  3805. static void FPT_autoLoadDefaultMap(ULONG p_port)
  3806. {
  3807. ULONG map_addr;
  3808. ARAM_ACCESS(p_port);
  3809. map_addr = p_port + hp_aramBase;
  3810. WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0xC0)); /*ID MESSAGE */
  3811. map_addr +=2;
  3812. WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0x20)); /*SIMPLE TAG QUEUEING MSG */
  3813. map_addr +=2;
  3814. WRW_HARPOON(map_addr, RAT_OP); /*RESET ATTENTION */
  3815. map_addr +=2;
  3816. WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0x00)); /*TAG ID MSG */
  3817. map_addr +=2;
  3818. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 0 */
  3819. map_addr +=2;
  3820. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 1 */
  3821. map_addr +=2;
  3822. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 2 */
  3823. map_addr +=2;
  3824. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 3 */
  3825. map_addr +=2;
  3826. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 4 */
  3827. map_addr +=2;
  3828. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 5 */
  3829. map_addr +=2;
  3830. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 6 */
  3831. map_addr +=2;
  3832. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 7 */
  3833. map_addr +=2;
  3834. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 8 */
  3835. map_addr +=2;
  3836. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 9 */
  3837. map_addr +=2;
  3838. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 10 */
  3839. map_addr +=2;
  3840. WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00)); /*CDB BYTE 11 */
  3841. map_addr +=2;
  3842. WRW_HARPOON(map_addr, (CPE_OP+ADATA_OUT+ DINT)); /*JUMP IF DATA OUT */
  3843. map_addr +=2;
  3844. WRW_HARPOON(map_addr, (TCB_OP+FIFO_0+ DI)); /*JUMP IF NO DATA IN FIFO */
  3845. map_addr +=2; /*This means AYNC DATA IN */
  3846. WRW_HARPOON(map_addr, (SSI_OP+ SSI_IDO_STRT)); /*STOP AND INTERRUPT */
  3847. map_addr +=2;
  3848. WRW_HARPOON(map_addr, (CPE_OP+ADATA_IN+DINT)); /*JUMP IF NOT DATA IN PHZ */
  3849. map_addr +=2;
  3850. WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+ ST)); /*IF NOT MSG IN CHECK 4 DATA IN */
  3851. map_addr +=2;
  3852. WRW_HARPOON(map_addr, (CRD_OP+SDATA+ 0x02)); /*SAVE DATA PTR MSG? */
  3853. map_addr +=2;
  3854. WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+ DC)); /*GO CHECK FOR DISCONNECT MSG */
  3855. map_addr +=2;
  3856. WRW_HARPOON(map_addr, (MRR_OP+SDATA+ D_AR1)); /*SAVE DATA PTRS MSG */
  3857. map_addr +=2;
  3858. WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+ ST)); /*IF NOT MSG IN CHECK DATA IN */
  3859. map_addr +=2;
  3860. WRW_HARPOON(map_addr, (CRD_OP+SDATA+ 0x04)); /*DISCONNECT MSG? */
  3861. map_addr +=2;
  3862. WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+ UNKNWN));/*UKNKNOWN MSG */
  3863. map_addr +=2;
  3864. WRW_HARPOON(map_addr, (MRR_OP+SDATA+ D_BUCKET));/*XFER DISCONNECT MSG */
  3865. map_addr +=2;
  3866. WRW_HARPOON(map_addr, (SSI_OP+ SSI_ITAR_DISC));/*STOP AND INTERRUPT */
  3867. map_addr +=2;
  3868. WRW_HARPOON(map_addr, (CPN_OP+ASTATUS+ UNKNWN));/*JUMP IF NOT STATUS PHZ. */
  3869. map_addr +=2;
  3870. WRW_HARPOON(map_addr, (MRR_OP+SDATA+ D_AR0)); /*GET STATUS BYTE */
  3871. map_addr +=2;
  3872. WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+ CC)); /*ERROR IF NOT MSG IN PHZ */
  3873. map_addr +=2;
  3874. WRW_HARPOON(map_addr, (CRD_OP+SDATA+ 0x00)); /*CHECK FOR CMD COMPLETE MSG. */
  3875. map_addr +=2;
  3876. WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+ CC)); /*ERROR IF NOT CMD COMPLETE MSG. */
  3877. map_addr +=2;
  3878. WRW_HARPOON(map_addr, (MRR_OP+SDATA+ D_BUCKET));/*GET CMD COMPLETE MSG */
  3879. map_addr +=2;
  3880. WRW_HARPOON(map_addr, (SSI_OP+ SSI_ICMD_COMP));/*END OF COMMAND */
  3881. map_addr +=2;
  3882. WRW_HARPOON(map_addr, (SSI_OP+ SSI_IUNKWN)); /*RECEIVED UNKNOWN MSG BYTE */
  3883. map_addr +=2;
  3884. WRW_HARPOON(map_addr, (SSI_OP+ SSI_INO_CC)); /*NO COMMAND COMPLETE AFTER STATUS */
  3885. map_addr +=2;
  3886. WRW_HARPOON(map_addr, (SSI_OP+ SSI_ITICKLE)); /*BIOS Tickled the Mgr */
  3887. map_addr +=2;
  3888. WRW_HARPOON(map_addr, (SSI_OP+ SSI_IRFAIL)); /*EXPECTED ID/TAG MESSAGES AND */
  3889. map_addr +=2; /* DIDN'T GET ONE */
  3890. WRW_HARPOON(map_addr, (CRR_OP+AR3+ S_IDREG)); /* comp SCSI SEL ID & AR3*/
  3891. map_addr +=2;
  3892. WRW_HARPOON(map_addr, (BRH_OP+EQUAL+ 0x00)); /*SEL ID OK then Conti. */
  3893. map_addr +=2;
  3894. WRW_HARPOON(map_addr, (SSI_OP+ SSI_INO_CC)); /*NO COMMAND COMPLETE AFTER STATUS */
  3895. SGRAM_ACCESS(p_port);
  3896. }
  3897. /*---------------------------------------------------------------------
  3898. *
  3899. * Function: Auto Command Complete
  3900. *
  3901. * Description: Post command back to host and find another command
  3902. * to execute.
  3903. *
  3904. *---------------------------------------------------------------------*/
  3905. static void FPT_autoCmdCmplt(ULONG p_port, UCHAR p_card)
  3906. {
  3907. PSCCB currSCCB;
  3908. UCHAR status_byte;
  3909. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  3910. status_byte = RD_HARPOON(p_port+hp_gp_reg_0);
  3911. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = 0;
  3912. if (status_byte != SSGOOD) {
  3913. if (status_byte == SSQ_FULL) {
  3914. if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  3915. ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
  3916. {
  3917. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1;
  3918. if(FPT_BL_Card[p_card].discQCount != 0)
  3919. FPT_BL_Card[p_card].discQCount--;
  3920. FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
  3921. }
  3922. else
  3923. {
  3924. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1;
  3925. if(currSCCB->Sccb_tag)
  3926. {
  3927. if(FPT_BL_Card[p_card].discQCount != 0)
  3928. FPT_BL_Card[p_card].discQCount--;
  3929. FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
  3930. }else
  3931. {
  3932. if(FPT_BL_Card[p_card].discQCount != 0)
  3933. FPT_BL_Card[p_card].discQCount--;
  3934. FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
  3935. }
  3936. }
  3937. currSCCB->Sccb_MGRFlags |= F_STATUSLOADED;
  3938. FPT_queueSelectFail(&FPT_BL_Card[p_card],p_card);
  3939. return;
  3940. }
  3941. if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
  3942. {
  3943. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
  3944. (UCHAR)SYNC_SUPPORTED;
  3945. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
  3946. FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
  3947. if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  3948. ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
  3949. {
  3950. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1;
  3951. if(FPT_BL_Card[p_card].discQCount != 0)
  3952. FPT_BL_Card[p_card].discQCount--;
  3953. FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
  3954. }
  3955. else
  3956. {
  3957. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1;
  3958. if(currSCCB->Sccb_tag)
  3959. {
  3960. if(FPT_BL_Card[p_card].discQCount != 0)
  3961. FPT_BL_Card[p_card].discQCount--;
  3962. FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
  3963. }else
  3964. {
  3965. if(FPT_BL_Card[p_card].discQCount != 0)
  3966. FPT_BL_Card[p_card].discQCount--;
  3967. FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
  3968. }
  3969. }
  3970. return;
  3971. }
  3972. if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
  3973. {
  3974. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
  3975. (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  3976. TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
  3977. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
  3978. FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
  3979. if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  3980. ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
  3981. {
  3982. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1;
  3983. if(FPT_BL_Card[p_card].discQCount != 0)
  3984. FPT_BL_Card[p_card].discQCount--;
  3985. FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
  3986. }
  3987. else
  3988. {
  3989. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1;
  3990. if(currSCCB->Sccb_tag)
  3991. {
  3992. if(FPT_BL_Card[p_card].discQCount != 0)
  3993. FPT_BL_Card[p_card].discQCount--;
  3994. FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
  3995. }else
  3996. {
  3997. if(FPT_BL_Card[p_card].discQCount != 0)
  3998. FPT_BL_Card[p_card].discQCount--;
  3999. FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
  4000. }
  4001. }
  4002. return;
  4003. }
  4004. if (status_byte == SSCHECK)
  4005. {
  4006. if(FPT_BL_Card[p_card].globalFlags & F_DO_RENEGO)
  4007. {
  4008. if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_SYNC_MASK)
  4009. {
  4010. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_SYNC_MASK;
  4011. }
  4012. if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_WIDE_SCSI)
  4013. {
  4014. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_WIDE_MASK;
  4015. }
  4016. }
  4017. }
  4018. if (!(currSCCB->Sccb_XferState & F_AUTO_SENSE)) {
  4019. currSCCB->SccbStatus = SCCB_ERROR;
  4020. currSCCB->TargetStatus = status_byte;
  4021. if (status_byte == SSCHECK) {
  4022. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA
  4023. = 1;
  4024. if (currSCCB->RequestSenseLength != NO_AUTO_REQUEST_SENSE) {
  4025. if (currSCCB->RequestSenseLength == 0)
  4026. currSCCB->RequestSenseLength = 14;
  4027. FPT_ssenss(&FPT_BL_Card[p_card]);
  4028. FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
  4029. if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  4030. ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
  4031. {
  4032. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 1;
  4033. if(FPT_BL_Card[p_card].discQCount != 0)
  4034. FPT_BL_Card[p_card].discQCount--;
  4035. FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
  4036. }
  4037. else
  4038. {
  4039. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 1;
  4040. if(currSCCB->Sccb_tag)
  4041. {
  4042. if(FPT_BL_Card[p_card].discQCount != 0)
  4043. FPT_BL_Card[p_card].discQCount--;
  4044. FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
  4045. }else
  4046. {
  4047. if(FPT_BL_Card[p_card].discQCount != 0)
  4048. FPT_BL_Card[p_card].discQCount--;
  4049. FPT_BL_Card[p_card].discQ_Tbl[FPT_sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
  4050. }
  4051. }
  4052. return;
  4053. }
  4054. }
  4055. }
  4056. }
  4057. if((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  4058. ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  4059. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = 0;
  4060. else
  4061. FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
  4062. FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card);
  4063. }
  4064. #define SHORT_WAIT 0x0000000F
  4065. #define LONG_WAIT 0x0000FFFFL
  4066. /*---------------------------------------------------------------------
  4067. *
  4068. * Function: Data Transfer Processor
  4069. *
  4070. * Description: This routine performs two tasks.
  4071. * (1) Start data transfer by calling HOST_DATA_XFER_START
  4072. * function. Once data transfer is started, (2) Depends
  4073. * on the type of data transfer mode Scatter/Gather mode
  4074. * or NON Scatter/Gather mode. In NON Scatter/Gather mode,
  4075. * this routine checks Sccb_MGRFlag (F_HOST_XFER_ACT bit) for
  4076. * data transfer done. In Scatter/Gather mode, this routine
  4077. * checks bus master command complete and dual rank busy
  4078. * bit to keep chaining SC transfer command. Similarly,
  4079. * in Scatter/Gather mode, it checks Sccb_MGRFlag
  4080. * (F_HOST_XFER_ACT bit) for data transfer done.
  4081. *
  4082. *---------------------------------------------------------------------*/
  4083. static void FPT_dataXferProcessor(ULONG port, PSCCBcard pCurrCard)
  4084. {
  4085. PSCCB currSCCB;
  4086. currSCCB = pCurrCard->currentSCCB;
  4087. if (currSCCB->Sccb_XferState & F_SG_XFER)
  4088. {
  4089. if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
  4090. {
  4091. currSCCB->Sccb_sgseg += (UCHAR)SG_BUF_CNT;
  4092. currSCCB->Sccb_SGoffset = 0x00;
  4093. }
  4094. pCurrCard->globalFlags |= F_HOST_XFER_ACT;
  4095. FPT_busMstrSGDataXferStart(port, currSCCB);
  4096. }
  4097. else
  4098. {
  4099. if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT))
  4100. {
  4101. pCurrCard->globalFlags |= F_HOST_XFER_ACT;
  4102. FPT_busMstrDataXferStart(port, currSCCB);
  4103. }
  4104. }
  4105. }
  4106. /*---------------------------------------------------------------------
  4107. *
  4108. * Function: BusMaster Scatter Gather Data Transfer Start
  4109. *
  4110. * Description:
  4111. *
  4112. *---------------------------------------------------------------------*/
  4113. static void FPT_busMstrSGDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
  4114. {
  4115. ULONG count,addr,tmpSGCnt;
  4116. UINT sg_index;
  4117. UCHAR sg_count, i;
  4118. ULONG reg_offset;
  4119. if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
  4120. count = ((ULONG) HOST_RD_CMD)<<24;
  4121. }
  4122. else {
  4123. count = ((ULONG) HOST_WRT_CMD)<<24;
  4124. }
  4125. sg_count = 0;
  4126. tmpSGCnt = 0;
  4127. sg_index = pcurrSCCB->Sccb_sgseg;
  4128. reg_offset = hp_aramBase;
  4129. i = (UCHAR) (RD_HARPOON(p_port+hp_page_ctrl) & ~(SGRAM_ARAM|SCATTER_EN));
  4130. WR_HARPOON(p_port+hp_page_ctrl, i);
  4131. while ((sg_count < (UCHAR)SG_BUF_CNT) &&
  4132. ((ULONG)(sg_index * (UINT)SG_ELEMENT_SIZE) < pcurrSCCB->DataLength) ) {
  4133. tmpSGCnt += *(((ULONG *)pcurrSCCB->DataPointer)+
  4134. (sg_index * 2));
  4135. count |= *(((ULONG *)pcurrSCCB->DataPointer)+
  4136. (sg_index * 2));
  4137. addr = *(((ULONG *)pcurrSCCB->DataPointer)+
  4138. ((sg_index * 2) + 1));
  4139. if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) {
  4140. addr += ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset);
  4141. count = (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset;
  4142. tmpSGCnt = count & 0x00FFFFFFL;
  4143. }
  4144. WR_HARP32(p_port,reg_offset,addr);
  4145. reg_offset +=4;
  4146. WR_HARP32(p_port,reg_offset,count);
  4147. reg_offset +=4;
  4148. count &= 0xFF000000L;
  4149. sg_index++;
  4150. sg_count++;
  4151. } /*End While */
  4152. pcurrSCCB->Sccb_XferCnt = tmpSGCnt;
  4153. WR_HARPOON(p_port+hp_sg_addr,(sg_count<<4));
  4154. if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
  4155. WR_HARP32(p_port,hp_xfercnt_0,tmpSGCnt);
  4156. WR_HARPOON(p_port+hp_portctrl_0,(DMA_PORT | SCSI_PORT | SCSI_INBIT));
  4157. WR_HARPOON(p_port+hp_scsisig, S_DATAI_PH);
  4158. }
  4159. else {
  4160. if ((!(RD_HARPOON(p_port+hp_synctarg_0) & NARROW_SCSI)) &&
  4161. (tmpSGCnt & 0x000000001))
  4162. {
  4163. pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT;
  4164. tmpSGCnt--;
  4165. }
  4166. WR_HARP32(p_port,hp_xfercnt_0,tmpSGCnt);
  4167. WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT | DMA_PORT | DMA_RD));
  4168. WR_HARPOON(p_port+hp_scsisig, S_DATAO_PH);
  4169. }
  4170. WR_HARPOON(p_port+hp_page_ctrl, (UCHAR) (i | SCATTER_EN));
  4171. }
  4172. /*---------------------------------------------------------------------
  4173. *
  4174. * Function: BusMaster Data Transfer Start
  4175. *
  4176. * Description:
  4177. *
  4178. *---------------------------------------------------------------------*/
  4179. static void FPT_busMstrDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
  4180. {
  4181. ULONG addr,count;
  4182. if (!(pcurrSCCB->Sccb_XferState & F_AUTO_SENSE)) {
  4183. count = pcurrSCCB->Sccb_XferCnt;
  4184. addr = (ULONG) pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC;
  4185. }
  4186. else {
  4187. addr = pcurrSCCB->SensePointer;
  4188. count = pcurrSCCB->RequestSenseLength;
  4189. }
  4190. HP_SETUP_ADDR_CNT(p_port,addr,count);
  4191. if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
  4192. WR_HARPOON(p_port+hp_portctrl_0,(DMA_PORT | SCSI_PORT | SCSI_INBIT));
  4193. WR_HARPOON(p_port+hp_scsisig, S_DATAI_PH);
  4194. WR_HARPOON(p_port+hp_xfer_cmd,
  4195. (XFER_DMA_HOST | XFER_HOST_AUTO | XFER_DMA_8BIT));
  4196. }
  4197. else {
  4198. WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT | DMA_PORT | DMA_RD));
  4199. WR_HARPOON(p_port+hp_scsisig, S_DATAO_PH);
  4200. WR_HARPOON(p_port+hp_xfer_cmd,
  4201. (XFER_HOST_DMA | XFER_HOST_AUTO | XFER_DMA_8BIT));
  4202. }
  4203. }
  4204. /*---------------------------------------------------------------------
  4205. *
  4206. * Function: BusMaster Timeout Handler
  4207. *
  4208. * Description: This function is called after a bus master command busy time
  4209. * out is detected. This routines issue halt state machine
  4210. * with a software time out for command busy. If command busy
  4211. * is still asserted at the end of the time out, it issues
  4212. * hard abort with another software time out. It hard abort
  4213. * command busy is also time out, it'll just give up.
  4214. *
  4215. *---------------------------------------------------------------------*/
  4216. static UCHAR FPT_busMstrTimeOut(ULONG p_port)
  4217. {
  4218. ULONG timeout;
  4219. timeout = LONG_WAIT;
  4220. WR_HARPOON(p_port+hp_sys_ctrl, HALT_MACH);
  4221. while ((!(RD_HARPOON(p_port+hp_ext_status) & CMD_ABORTED)) && timeout--) {}
  4222. if (RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) {
  4223. WR_HARPOON(p_port+hp_sys_ctrl, HARD_ABORT);
  4224. timeout = LONG_WAIT;
  4225. while ((RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
  4226. }
  4227. RD_HARPOON(p_port+hp_int_status); /*Clear command complete */
  4228. if (RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) {
  4229. return(1);
  4230. }
  4231. else {
  4232. return(0);
  4233. }
  4234. }
  4235. /*---------------------------------------------------------------------
  4236. *
  4237. * Function: Host Data Transfer Abort
  4238. *
  4239. * Description: Abort any in progress transfer.
  4240. *
  4241. *---------------------------------------------------------------------*/
  4242. static void FPT_hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
  4243. {
  4244. ULONG timeout;
  4245. ULONG remain_cnt;
  4246. UINT sg_ptr;
  4247. FPT_BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT;
  4248. if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) {
  4249. if (!(RD_HARPOON(port+hp_int_status) & INT_CMD_COMPL)) {
  4250. WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) | FLUSH_XFER_CNTR));
  4251. timeout = LONG_WAIT;
  4252. while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
  4253. WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) & ~FLUSH_XFER_CNTR));
  4254. if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
  4255. if (FPT_busMstrTimeOut(port)) {
  4256. if (pCurrSCCB->HostStatus == 0x00)
  4257. pCurrSCCB->HostStatus = SCCB_BM_ERR;
  4258. }
  4259. if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS)
  4260. if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS)
  4261. if (pCurrSCCB->HostStatus == 0x00)
  4262. {
  4263. pCurrSCCB->HostStatus = SCCB_BM_ERR;
  4264. }
  4265. }
  4266. }
  4267. }
  4268. else if (pCurrSCCB->Sccb_XferCnt) {
  4269. if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
  4270. WR_HARPOON(port+hp_page_ctrl, (RD_HARPOON(port+hp_page_ctrl) &
  4271. ~SCATTER_EN));
  4272. WR_HARPOON(port+hp_sg_addr,0x00);
  4273. sg_ptr = pCurrSCCB->Sccb_sgseg + SG_BUF_CNT;
  4274. if (sg_ptr > (UINT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE)) {
  4275. sg_ptr = (UINT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE);
  4276. }
  4277. remain_cnt = pCurrSCCB->Sccb_XferCnt;
  4278. while (remain_cnt < 0x01000000L) {
  4279. sg_ptr--;
  4280. if (remain_cnt > (ULONG)(*(((ULONG *)pCurrSCCB->
  4281. DataPointer) + (sg_ptr * 2)))) {
  4282. remain_cnt -= (ULONG)(*(((ULONG *)pCurrSCCB->
  4283. DataPointer) + (sg_ptr * 2)));
  4284. }
  4285. else {
  4286. break;
  4287. }
  4288. }
  4289. if (remain_cnt < 0x01000000L) {
  4290. pCurrSCCB->Sccb_SGoffset = remain_cnt;
  4291. pCurrSCCB->Sccb_sgseg = (USHORT)sg_ptr;
  4292. if ((ULONG)(sg_ptr * SG_ELEMENT_SIZE) == pCurrSCCB->DataLength
  4293. && (remain_cnt == 0))
  4294. pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
  4295. }
  4296. else {
  4297. if (pCurrSCCB->HostStatus == 0x00) {
  4298. pCurrSCCB->HostStatus = SCCB_GROSS_FW_ERR;
  4299. }
  4300. }
  4301. }
  4302. if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) {
  4303. if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
  4304. FPT_busMstrTimeOut(port);
  4305. }
  4306. else {
  4307. if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
  4308. if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
  4309. if (pCurrSCCB->HostStatus == 0x00) {
  4310. pCurrSCCB->HostStatus = SCCB_BM_ERR;
  4311. }
  4312. }
  4313. }
  4314. }
  4315. }
  4316. else {
  4317. if ((RD_HARPOON(port+hp_fifo_cnt)) >= BM_THRESHOLD) {
  4318. timeout = SHORT_WAIT;
  4319. while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) &&
  4320. ((RD_HARPOON(port+hp_fifo_cnt)) >= BM_THRESHOLD) &&
  4321. timeout--) {}
  4322. }
  4323. if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
  4324. WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) |
  4325. FLUSH_XFER_CNTR));
  4326. timeout = LONG_WAIT;
  4327. while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) &&
  4328. timeout--) {}
  4329. WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) &
  4330. ~FLUSH_XFER_CNTR));
  4331. if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
  4332. if (pCurrSCCB->HostStatus == 0x00) {
  4333. pCurrSCCB->HostStatus = SCCB_BM_ERR;
  4334. }
  4335. FPT_busMstrTimeOut(port);
  4336. }
  4337. }
  4338. if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
  4339. if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
  4340. if (pCurrSCCB->HostStatus == 0x00) {
  4341. pCurrSCCB->HostStatus = SCCB_BM_ERR;
  4342. }
  4343. }
  4344. }
  4345. }
  4346. }
  4347. else {
  4348. if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
  4349. timeout = LONG_WAIT;
  4350. while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
  4351. if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
  4352. if (pCurrSCCB->HostStatus == 0x00) {
  4353. pCurrSCCB->HostStatus = SCCB_BM_ERR;
  4354. }
  4355. FPT_busMstrTimeOut(port);
  4356. }
  4357. }
  4358. if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
  4359. if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
  4360. if (pCurrSCCB->HostStatus == 0x00) {
  4361. pCurrSCCB->HostStatus = SCCB_BM_ERR;
  4362. }
  4363. }
  4364. }
  4365. if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
  4366. WR_HARPOON(port+hp_page_ctrl, (RD_HARPOON(port+hp_page_ctrl) &
  4367. ~SCATTER_EN));
  4368. WR_HARPOON(port+hp_sg_addr,0x00);
  4369. pCurrSCCB->Sccb_sgseg += SG_BUF_CNT;
  4370. pCurrSCCB->Sccb_SGoffset = 0x00;
  4371. if ((ULONG)(pCurrSCCB->Sccb_sgseg * SG_ELEMENT_SIZE) >=
  4372. pCurrSCCB->DataLength) {
  4373. pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
  4374. pCurrSCCB->Sccb_sgseg = (USHORT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE);
  4375. }
  4376. }
  4377. else {
  4378. if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE))
  4379. pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
  4380. }
  4381. }
  4382. WR_HARPOON(port+hp_int_mask,(INT_CMD_COMPL | SCSI_INTERRUPT));
  4383. }
  4384. /*---------------------------------------------------------------------
  4385. *
  4386. * Function: Host Data Transfer Restart
  4387. *
  4388. * Description: Reset the available count due to a restore data
  4389. * pointers message.
  4390. *
  4391. *---------------------------------------------------------------------*/
  4392. static void FPT_hostDataXferRestart(PSCCB currSCCB)
  4393. {
  4394. ULONG data_count;
  4395. UINT sg_index;
  4396. ULONG *sg_ptr;
  4397. if (currSCCB->Sccb_XferState & F_SG_XFER) {
  4398. currSCCB->Sccb_XferCnt = 0;
  4399. sg_index = 0xffff; /*Index by long words into sg list. */
  4400. data_count = 0; /*Running count of SG xfer counts. */
  4401. sg_ptr = (ULONG *)currSCCB->DataPointer;
  4402. while (data_count < currSCCB->Sccb_ATC) {
  4403. sg_index++;
  4404. data_count += *(sg_ptr+(sg_index * 2));
  4405. }
  4406. if (data_count == currSCCB->Sccb_ATC) {
  4407. currSCCB->Sccb_SGoffset = 0;
  4408. sg_index++;
  4409. }
  4410. else {
  4411. currSCCB->Sccb_SGoffset = data_count - currSCCB->Sccb_ATC;
  4412. }
  4413. currSCCB->Sccb_sgseg = (USHORT)sg_index;
  4414. }
  4415. else {
  4416. currSCCB->Sccb_XferCnt = currSCCB->DataLength - currSCCB->Sccb_ATC;
  4417. }
  4418. }
  4419. /*---------------------------------------------------------------------
  4420. *
  4421. * Function: FPT_scini
  4422. *
  4423. * Description: Setup all data structures necessary for SCAM selection.
  4424. *
  4425. *---------------------------------------------------------------------*/
  4426. static void FPT_scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up)
  4427. {
  4428. UCHAR loser,assigned_id;
  4429. ULONG p_port;
  4430. UCHAR i,k,ScamFlg ;
  4431. PSCCBcard currCard;
  4432. PNVRamInfo pCurrNvRam;
  4433. currCard = &FPT_BL_Card[p_card];
  4434. p_port = currCard->ioPort;
  4435. pCurrNvRam = currCard->pNvRamInfo;
  4436. if(pCurrNvRam){
  4437. ScamFlg = pCurrNvRam->niScamConf;
  4438. i = pCurrNvRam->niSysConf;
  4439. }
  4440. else{
  4441. ScamFlg = (UCHAR) FPT_utilEERead(p_port, SCAM_CONFIG/2);
  4442. i = (UCHAR)(FPT_utilEERead(p_port, (SYSTEM_CONFIG/2)));
  4443. }
  4444. if(!(i & 0x02)) /* check if reset bus in AutoSCSI parameter set */
  4445. return;
  4446. FPT_inisci(p_card,p_port, p_our_id);
  4447. /* Force to wait 1 sec after SCSI bus reset. Some SCAM device FW
  4448. too slow to return to SCAM selection */
  4449. /* if (p_power_up)
  4450. FPT_Wait1Second(p_port);
  4451. else
  4452. FPT_Wait(p_port, TO_250ms); */
  4453. FPT_Wait1Second(p_port);
  4454. if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
  4455. {
  4456. while (!(FPT_scarb(p_port,INIT_SELTD))) {}
  4457. FPT_scsel(p_port);
  4458. do {
  4459. FPT_scxferc(p_port,SYNC_PTRN);
  4460. FPT_scxferc(p_port,DOM_MSTR);
  4461. loser = FPT_scsendi(p_port,&FPT_scamInfo[p_our_id].id_string[0]);
  4462. } while ( loser == 0xFF );
  4463. FPT_scbusf(p_port);
  4464. if ((p_power_up) && (!loser))
  4465. {
  4466. FPT_sresb(p_port,p_card);
  4467. FPT_Wait(p_port, TO_250ms);
  4468. while (!(FPT_scarb(p_port,INIT_SELTD))) {}
  4469. FPT_scsel(p_port);
  4470. do {
  4471. FPT_scxferc(p_port, SYNC_PTRN);
  4472. FPT_scxferc(p_port, DOM_MSTR);
  4473. loser = FPT_scsendi(p_port,&FPT_scamInfo[p_our_id].
  4474. id_string[0]);
  4475. } while ( loser == 0xFF );
  4476. FPT_scbusf(p_port);
  4477. }
  4478. }
  4479. else
  4480. {
  4481. loser = 0;
  4482. }
  4483. if (!loser)
  4484. {
  4485. FPT_scamInfo[p_our_id].state = ID_ASSIGNED;
  4486. if (ScamFlg & SCAM_ENABLED)
  4487. {
  4488. for (i=0; i < MAX_SCSI_TAR; i++)
  4489. {
  4490. if ((FPT_scamInfo[i].state == ID_UNASSIGNED) ||
  4491. (FPT_scamInfo[i].state == ID_UNUSED))
  4492. {
  4493. if (FPT_scsell(p_port,i))
  4494. {
  4495. FPT_scamInfo[i].state = LEGACY;
  4496. if ((FPT_scamInfo[i].id_string[0] != 0xFF) ||
  4497. (FPT_scamInfo[i].id_string[1] != 0xFA))
  4498. {
  4499. FPT_scamInfo[i].id_string[0] = 0xFF;
  4500. FPT_scamInfo[i].id_string[1] = 0xFA;
  4501. if(pCurrNvRam == NULL)
  4502. currCard->globalFlags |= F_UPDATE_EEPROM;
  4503. }
  4504. }
  4505. }
  4506. }
  4507. FPT_sresb(p_port,p_card);
  4508. FPT_Wait1Second(p_port);
  4509. while (!(FPT_scarb(p_port,INIT_SELTD))) {}
  4510. FPT_scsel(p_port);
  4511. FPT_scasid(p_card, p_port);
  4512. }
  4513. }
  4514. else if ((loser) && (ScamFlg & SCAM_ENABLED))
  4515. {
  4516. FPT_scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0;
  4517. assigned_id = 0;
  4518. FPT_scwtsel(p_port);
  4519. do {
  4520. while (FPT_scxferc(p_port,0x00) != SYNC_PTRN) {}
  4521. i = FPT_scxferc(p_port,0x00);
  4522. if (i == ASSIGN_ID)
  4523. {
  4524. if (!(FPT_scsendi(p_port,&FPT_scamInfo[p_our_id].id_string[0])))
  4525. {
  4526. i = FPT_scxferc(p_port,0x00);
  4527. if (FPT_scvalq(i))
  4528. {
  4529. k = FPT_scxferc(p_port,0x00);
  4530. if (FPT_scvalq(k))
  4531. {
  4532. currCard->ourId =
  4533. ((UCHAR)(i<<3)+(k & (UCHAR)7)) & (UCHAR) 0x3F;
  4534. FPT_inisci(p_card, p_port, p_our_id);
  4535. FPT_scamInfo[currCard->ourId].state = ID_ASSIGNED;
  4536. FPT_scamInfo[currCard->ourId].id_string[0]
  4537. = SLV_TYPE_CODE0;
  4538. assigned_id = 1;
  4539. }
  4540. }
  4541. }
  4542. }
  4543. else if (i == SET_P_FLAG)
  4544. {
  4545. if (!(FPT_scsendi(p_port,
  4546. &FPT_scamInfo[p_our_id].id_string[0])))
  4547. FPT_scamInfo[p_our_id].id_string[0] |= 0x80;
  4548. }
  4549. }while (!assigned_id);
  4550. while (FPT_scxferc(p_port,0x00) != CFG_CMPLT) {}
  4551. }
  4552. if (ScamFlg & SCAM_ENABLED)
  4553. {
  4554. FPT_scbusf(p_port);
  4555. if (currCard->globalFlags & F_UPDATE_EEPROM)
  4556. {
  4557. FPT_scsavdi(p_card, p_port);
  4558. currCard->globalFlags &= ~F_UPDATE_EEPROM;
  4559. }
  4560. }
  4561. /*
  4562. for (i=0,k=0; i < MAX_SCSI_TAR; i++)
  4563. {
  4564. if ((FPT_scamInfo[i].state == ID_ASSIGNED) ||
  4565. (FPT_scamInfo[i].state == LEGACY))
  4566. k++;
  4567. }
  4568. if (k==2)
  4569. currCard->globalFlags |= F_SINGLE_DEVICE;
  4570. else
  4571. currCard->globalFlags &= ~F_SINGLE_DEVICE;
  4572. */
  4573. }
  4574. /*---------------------------------------------------------------------
  4575. *
  4576. * Function: FPT_scarb
  4577. *
  4578. * Description: Gain control of the bus and wait SCAM select time (250ms)
  4579. *
  4580. *---------------------------------------------------------------------*/
  4581. static int FPT_scarb(ULONG p_port, UCHAR p_sel_type)
  4582. {
  4583. if (p_sel_type == INIT_SELTD)
  4584. {
  4585. while (RD_HARPOON(p_port+hp_scsisig) & (SCSI_SEL | SCSI_BSY)) {}
  4586. if (RD_HARPOON(p_port+hp_scsisig) & SCSI_SEL)
  4587. return(0);
  4588. if (RD_HARPOON(p_port+hp_scsidata_0) != 00)
  4589. return(0);
  4590. WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_BSY));
  4591. if (RD_HARPOON(p_port+hp_scsisig) & SCSI_SEL) {
  4592. WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) &
  4593. ~SCSI_BSY));
  4594. return(0);
  4595. }
  4596. WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_SEL));
  4597. if (RD_HARPOON(p_port+hp_scsidata_0) != 00) {
  4598. WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) &
  4599. ~(SCSI_BSY | SCSI_SEL)));
  4600. return(0);
  4601. }
  4602. }
  4603. WR_HARPOON(p_port+hp_clkctrl_0, (RD_HARPOON(p_port+hp_clkctrl_0)
  4604. & ~ACTdeassert));
  4605. WR_HARPOON(p_port+hp_scsireset, SCAM_EN);
  4606. WR_HARPOON(p_port+hp_scsidata_0, 0x00);
  4607. WR_HARPOON(p_port+hp_scsidata_1, 0x00);
  4608. WR_HARPOON(p_port+hp_portctrl_0, SCSI_BUS_EN);
  4609. WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_MSG));
  4610. WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig)
  4611. & ~SCSI_BSY));
  4612. FPT_Wait(p_port,TO_250ms);
  4613. return(1);
  4614. }
  4615. /*---------------------------------------------------------------------
  4616. *
  4617. * Function: FPT_scbusf
  4618. *
  4619. * Description: Release the SCSI bus and disable SCAM selection.
  4620. *
  4621. *---------------------------------------------------------------------*/
  4622. static void FPT_scbusf(ULONG p_port)
  4623. {
  4624. WR_HARPOON(p_port+hp_page_ctrl,
  4625. (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
  4626. WR_HARPOON(p_port+hp_scsidata_0, 0x00);
  4627. WR_HARPOON(p_port+hp_portctrl_0, (RD_HARPOON(p_port+hp_portctrl_0)
  4628. & ~SCSI_BUS_EN));
  4629. WR_HARPOON(p_port+hp_scsisig, 0x00);
  4630. WR_HARPOON(p_port+hp_scsireset, (RD_HARPOON(p_port+hp_scsireset)
  4631. & ~SCAM_EN));
  4632. WR_HARPOON(p_port+hp_clkctrl_0, (RD_HARPOON(p_port+hp_clkctrl_0)
  4633. | ACTdeassert));
  4634. WRW_HARPOON((p_port+hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL));
  4635. WR_HARPOON(p_port+hp_page_ctrl,
  4636. (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
  4637. }
  4638. /*---------------------------------------------------------------------
  4639. *
  4640. * Function: FPT_scasid
  4641. *
  4642. * Description: Assign an ID to all the SCAM devices.
  4643. *
  4644. *---------------------------------------------------------------------*/
  4645. static void FPT_scasid(UCHAR p_card, ULONG p_port)
  4646. {
  4647. UCHAR temp_id_string[ID_STRING_LENGTH];
  4648. UCHAR i,k,scam_id;
  4649. UCHAR crcBytes[3];
  4650. PNVRamInfo pCurrNvRam;
  4651. ushort_ptr pCrcBytes;
  4652. pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
  4653. i=0;
  4654. while (!i)
  4655. {
  4656. for (k=0; k < ID_STRING_LENGTH; k++)
  4657. {
  4658. temp_id_string[k] = (UCHAR) 0x00;
  4659. }
  4660. FPT_scxferc(p_port,SYNC_PTRN);
  4661. FPT_scxferc(p_port,ASSIGN_ID);
  4662. if (!(FPT_sciso(p_port,&temp_id_string[0])))
  4663. {
  4664. if(pCurrNvRam){
  4665. pCrcBytes = (ushort_ptr)&crcBytes[0];
  4666. *pCrcBytes = FPT_CalcCrc16(&temp_id_string[0]);
  4667. crcBytes[2] = FPT_CalcLrc(&temp_id_string[0]);
  4668. temp_id_string[1] = crcBytes[2];
  4669. temp_id_string[2] = crcBytes[0];
  4670. temp_id_string[3] = crcBytes[1];
  4671. for(k = 4; k < ID_STRING_LENGTH; k++)
  4672. temp_id_string[k] = (UCHAR) 0x00;
  4673. }
  4674. i = FPT_scmachid(p_card,temp_id_string);
  4675. if (i == CLR_PRIORITY)
  4676. {
  4677. FPT_scxferc(p_port,MISC_CODE);
  4678. FPT_scxferc(p_port,CLR_P_FLAG);
  4679. i = 0; /*Not the last ID yet. */
  4680. }
  4681. else if (i != NO_ID_AVAIL)
  4682. {
  4683. if (i < 8 )
  4684. FPT_scxferc(p_port,ID_0_7);
  4685. else
  4686. FPT_scxferc(p_port,ID_8_F);
  4687. scam_id = (i & (UCHAR) 0x07);
  4688. for (k=1; k < 0x08; k <<= 1)
  4689. if (!( k & i ))
  4690. scam_id += 0x08; /*Count number of zeros in DB0-3. */
  4691. FPT_scxferc(p_port,scam_id);
  4692. i = 0; /*Not the last ID yet. */
  4693. }
  4694. }
  4695. else
  4696. {
  4697. i = 1;
  4698. }
  4699. } /*End while */
  4700. FPT_scxferc(p_port,SYNC_PTRN);
  4701. FPT_scxferc(p_port,CFG_CMPLT);
  4702. }
  4703. /*---------------------------------------------------------------------
  4704. *
  4705. * Function: FPT_scsel
  4706. *
  4707. * Description: Select all the SCAM devices.
  4708. *
  4709. *---------------------------------------------------------------------*/
  4710. static void FPT_scsel(ULONG p_port)
  4711. {
  4712. WR_HARPOON(p_port+hp_scsisig, SCSI_SEL);
  4713. FPT_scwiros(p_port, SCSI_MSG);
  4714. WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY));
  4715. WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
  4716. WR_HARPOON(p_port+hp_scsidata_0, (UCHAR)(RD_HARPOON(p_port+hp_scsidata_0) |
  4717. (UCHAR)(BIT(7)+BIT(6))));
  4718. WR_HARPOON(p_port+hp_scsisig, (SCSI_BSY | SCSI_IOBIT | SCSI_CD));
  4719. FPT_scwiros(p_port, SCSI_SEL);
  4720. WR_HARPOON(p_port+hp_scsidata_0, (UCHAR)(RD_HARPOON(p_port+hp_scsidata_0) &
  4721. ~(UCHAR)BIT(6)));
  4722. FPT_scwirod(p_port, BIT(6));
  4723. WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
  4724. }
  4725. /*---------------------------------------------------------------------
  4726. *
  4727. * Function: FPT_scxferc
  4728. *
  4729. * Description: Handshake the p_data (DB4-0) across the bus.
  4730. *
  4731. *---------------------------------------------------------------------*/
  4732. static UCHAR FPT_scxferc(ULONG p_port, UCHAR p_data)
  4733. {
  4734. UCHAR curr_data, ret_data;
  4735. curr_data = p_data | BIT(7) | BIT(5); /*Start with DB7 & DB5 asserted. */
  4736. WR_HARPOON(p_port+hp_scsidata_0, curr_data);
  4737. curr_data &= ~BIT(7);
  4738. WR_HARPOON(p_port+hp_scsidata_0, curr_data);
  4739. FPT_scwirod(p_port,BIT(7)); /*Wait for DB7 to be released. */
  4740. while (!(RD_HARPOON(p_port+hp_scsidata_0) & BIT(5)));
  4741. ret_data = (RD_HARPOON(p_port+hp_scsidata_0) & (UCHAR) 0x1F);
  4742. curr_data |= BIT(6);
  4743. WR_HARPOON(p_port+hp_scsidata_0, curr_data);
  4744. curr_data &= ~BIT(5);
  4745. WR_HARPOON(p_port+hp_scsidata_0, curr_data);
  4746. FPT_scwirod(p_port,BIT(5)); /*Wait for DB5 to be released. */
  4747. curr_data &= ~(BIT(4)|BIT(3)|BIT(2)|BIT(1)|BIT(0)); /*Release data bits */
  4748. curr_data |= BIT(7);
  4749. WR_HARPOON(p_port+hp_scsidata_0, curr_data);
  4750. curr_data &= ~BIT(6);
  4751. WR_HARPOON(p_port+hp_scsidata_0, curr_data);
  4752. FPT_scwirod(p_port,BIT(6)); /*Wait for DB6 to be released. */
  4753. return(ret_data);
  4754. }
  4755. /*---------------------------------------------------------------------
  4756. *
  4757. * Function: FPT_scsendi
  4758. *
  4759. * Description: Transfer our Identification string to determine if we
  4760. * will be the dominant master.
  4761. *
  4762. *---------------------------------------------------------------------*/
  4763. static UCHAR FPT_scsendi(ULONG p_port, UCHAR p_id_string[])
  4764. {
  4765. UCHAR ret_data,byte_cnt,bit_cnt,defer;
  4766. defer = 0;
  4767. for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
  4768. for (bit_cnt = 0x80; bit_cnt != 0 ; bit_cnt >>= 1) {
  4769. if (defer)
  4770. ret_data = FPT_scxferc(p_port,00);
  4771. else if (p_id_string[byte_cnt] & bit_cnt)
  4772. ret_data = FPT_scxferc(p_port,02);
  4773. else {
  4774. ret_data = FPT_scxferc(p_port,01);
  4775. if (ret_data & 02)
  4776. defer = 1;
  4777. }
  4778. if ((ret_data & 0x1C) == 0x10)
  4779. return(0x00); /*End of isolation stage, we won! */
  4780. if (ret_data & 0x1C)
  4781. return(0xFF);
  4782. if ((defer) && (!(ret_data & 0x1F)))
  4783. return(0x01); /*End of isolation stage, we lost. */
  4784. } /*bit loop */
  4785. } /*byte loop */
  4786. if (defer)
  4787. return(0x01); /*We lost */
  4788. else
  4789. return(0); /*We WON! Yeeessss! */
  4790. }
  4791. /*---------------------------------------------------------------------
  4792. *
  4793. * Function: FPT_sciso
  4794. *
  4795. * Description: Transfer the Identification string.
  4796. *
  4797. *---------------------------------------------------------------------*/
  4798. static UCHAR FPT_sciso(ULONG p_port, UCHAR p_id_string[])
  4799. {
  4800. UCHAR ret_data,the_data,byte_cnt,bit_cnt;
  4801. the_data = 0;
  4802. for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
  4803. for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) {
  4804. ret_data = FPT_scxferc(p_port,0);
  4805. if (ret_data & 0xFC)
  4806. return(0xFF);
  4807. else {
  4808. the_data <<= 1;
  4809. if (ret_data & BIT(1)) {
  4810. the_data |= 1;
  4811. }
  4812. }
  4813. if ((ret_data & 0x1F) == 0)
  4814. {
  4815. /*
  4816. if(bit_cnt != 0 || bit_cnt != 8)
  4817. {
  4818. byte_cnt = 0;
  4819. bit_cnt = 0;
  4820. FPT_scxferc(p_port, SYNC_PTRN);
  4821. FPT_scxferc(p_port, ASSIGN_ID);
  4822. continue;
  4823. }
  4824. */
  4825. if (byte_cnt)
  4826. return(0x00);
  4827. else
  4828. return(0xFF);
  4829. }
  4830. } /*bit loop */
  4831. p_id_string[byte_cnt] = the_data;
  4832. } /*byte loop */
  4833. return(0);
  4834. }
  4835. /*---------------------------------------------------------------------
  4836. *
  4837. * Function: FPT_scwirod
  4838. *
  4839. * Description: Sample the SCSI data bus making sure the signal has been
  4840. * deasserted for the correct number of consecutive samples.
  4841. *
  4842. *---------------------------------------------------------------------*/
  4843. static void FPT_scwirod(ULONG p_port, UCHAR p_data_bit)
  4844. {
  4845. UCHAR i;
  4846. i = 0;
  4847. while ( i < MAX_SCSI_TAR ) {
  4848. if (RD_HARPOON(p_port+hp_scsidata_0) & p_data_bit)
  4849. i = 0;
  4850. else
  4851. i++;
  4852. }
  4853. }
  4854. /*---------------------------------------------------------------------
  4855. *
  4856. * Function: FPT_scwiros
  4857. *
  4858. * Description: Sample the SCSI Signal lines making sure the signal has been
  4859. * deasserted for the correct number of consecutive samples.
  4860. *
  4861. *---------------------------------------------------------------------*/
  4862. static void FPT_scwiros(ULONG p_port, UCHAR p_data_bit)
  4863. {
  4864. UCHAR i;
  4865. i = 0;
  4866. while ( i < MAX_SCSI_TAR ) {
  4867. if (RD_HARPOON(p_port+hp_scsisig) & p_data_bit)
  4868. i = 0;
  4869. else
  4870. i++;
  4871. }
  4872. }
  4873. /*---------------------------------------------------------------------
  4874. *
  4875. * Function: FPT_scvalq
  4876. *
  4877. * Description: Make sure we received a valid data byte.
  4878. *
  4879. *---------------------------------------------------------------------*/
  4880. static UCHAR FPT_scvalq(UCHAR p_quintet)
  4881. {
  4882. UCHAR count;
  4883. for (count=1; count < 0x08; count<<=1) {
  4884. if (!(p_quintet & count))
  4885. p_quintet -= 0x80;
  4886. }
  4887. if (p_quintet & 0x18)
  4888. return(0);
  4889. else
  4890. return(1);
  4891. }
  4892. /*---------------------------------------------------------------------
  4893. *
  4894. * Function: FPT_scsell
  4895. *
  4896. * Description: Select the specified device ID using a selection timeout
  4897. * less than 4ms. If somebody responds then it is a legacy
  4898. * drive and this ID must be marked as such.
  4899. *
  4900. *---------------------------------------------------------------------*/
  4901. static UCHAR FPT_scsell(ULONG p_port, UCHAR targ_id)
  4902. {
  4903. ULONG i;
  4904. WR_HARPOON(p_port+hp_page_ctrl,
  4905. (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
  4906. ARAM_ACCESS(p_port);
  4907. WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) | SCAM_TIMER));
  4908. WR_HARPOON(p_port+hp_seltimeout,TO_4ms);
  4909. for (i = p_port+CMD_STRT; i < p_port+CMD_STRT+12; i+=2) {
  4910. WRW_HARPOON(i, (MPM_OP+ACOMMAND));
  4911. }
  4912. WRW_HARPOON(i, (BRH_OP+ALWAYS+ NP));
  4913. WRW_HARPOON((p_port+hp_intstat),
  4914. (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
  4915. WR_HARPOON(p_port+hp_select_id, targ_id);
  4916. WR_HARPOON(p_port+hp_portctrl_0, SCSI_PORT);
  4917. WR_HARPOON(p_port+hp_autostart_3, (SELECT | CMD_ONLY_STRT));
  4918. WR_HARPOON(p_port+hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
  4919. while (!(RDW_HARPOON((p_port+hp_intstat)) &
  4920. (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {}
  4921. if (RDW_HARPOON((p_port+hp_intstat)) & RESET)
  4922. FPT_Wait(p_port, TO_250ms);
  4923. DISABLE_AUTO(p_port);
  4924. WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) & ~SCAM_TIMER));
  4925. WR_HARPOON(p_port+hp_seltimeout,TO_290ms);
  4926. SGRAM_ACCESS(p_port);
  4927. if (RDW_HARPOON((p_port+hp_intstat)) & (RESET | TIMEOUT) ) {
  4928. WRW_HARPOON((p_port+hp_intstat),
  4929. (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
  4930. WR_HARPOON(p_port+hp_page_ctrl,
  4931. (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
  4932. return(0); /*No legacy device */
  4933. }
  4934. else {
  4935. while(!(RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)) {
  4936. if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
  4937. {
  4938. WR_HARPOON(p_port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
  4939. ACCEPT_MSG(p_port);
  4940. }
  4941. }
  4942. WRW_HARPOON((p_port+hp_intstat), CLR_ALL_INT_1);
  4943. WR_HARPOON(p_port+hp_page_ctrl,
  4944. (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
  4945. return(1); /*Found one of them oldies! */
  4946. }
  4947. }
  4948. /*---------------------------------------------------------------------
  4949. *
  4950. * Function: FPT_scwtsel
  4951. *
  4952. * Description: Wait to be selected by another SCAM initiator.
  4953. *
  4954. *---------------------------------------------------------------------*/
  4955. static void FPT_scwtsel(ULONG p_port)
  4956. {
  4957. while(!(RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL)) {}
  4958. }
  4959. /*---------------------------------------------------------------------
  4960. *
  4961. * Function: FPT_inisci
  4962. *
  4963. * Description: Setup the data Structure with the info from the EEPROM.
  4964. *
  4965. *---------------------------------------------------------------------*/
  4966. static void FPT_inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id)
  4967. {
  4968. UCHAR i,k,max_id;
  4969. USHORT ee_data;
  4970. PNVRamInfo pCurrNvRam;
  4971. pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
  4972. if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
  4973. max_id = 0x08;
  4974. else
  4975. max_id = 0x10;
  4976. if(pCurrNvRam){
  4977. for(i = 0; i < max_id; i++){
  4978. for(k = 0; k < 4; k++)
  4979. FPT_scamInfo[i].id_string[k] = pCurrNvRam->niScamTbl[i][k];
  4980. for(k = 4; k < ID_STRING_LENGTH; k++)
  4981. FPT_scamInfo[i].id_string[k] = (UCHAR) 0x00;
  4982. if(FPT_scamInfo[i].id_string[0] == 0x00)
  4983. FPT_scamInfo[i].state = ID_UNUSED; /*Default to unused ID. */
  4984. else
  4985. FPT_scamInfo[i].state = ID_UNASSIGNED; /*Default to unassigned ID. */
  4986. }
  4987. }else {
  4988. for (i=0; i < max_id; i++)
  4989. {
  4990. for (k=0; k < ID_STRING_LENGTH; k+=2)
  4991. {
  4992. ee_data = FPT_utilEERead(p_port, (USHORT)((EE_SCAMBASE/2) +
  4993. (USHORT) (i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2)));
  4994. FPT_scamInfo[i].id_string[k] = (UCHAR) ee_data;
  4995. ee_data >>= 8;
  4996. FPT_scamInfo[i].id_string[k+1] = (UCHAR) ee_data;
  4997. }
  4998. if ((FPT_scamInfo[i].id_string[0] == 0x00) ||
  4999. (FPT_scamInfo[i].id_string[0] == 0xFF))
  5000. FPT_scamInfo[i].state = ID_UNUSED; /*Default to unused ID. */
  5001. else
  5002. FPT_scamInfo[i].state = ID_UNASSIGNED; /*Default to unassigned ID. */
  5003. }
  5004. }
  5005. for(k = 0; k < ID_STRING_LENGTH; k++)
  5006. FPT_scamInfo[p_our_id].id_string[k] = FPT_scamHAString[k];
  5007. }
  5008. /*---------------------------------------------------------------------
  5009. *
  5010. * Function: FPT_scmachid
  5011. *
  5012. * Description: Match the Device ID string with our values stored in
  5013. * the EEPROM.
  5014. *
  5015. *---------------------------------------------------------------------*/
  5016. static UCHAR FPT_scmachid(UCHAR p_card, UCHAR p_id_string[])
  5017. {
  5018. UCHAR i,k,match;
  5019. for (i=0; i < MAX_SCSI_TAR; i++) {
  5020. match = 1;
  5021. for (k=0; k < ID_STRING_LENGTH; k++)
  5022. {
  5023. if (p_id_string[k] != FPT_scamInfo[i].id_string[k])
  5024. match = 0;
  5025. }
  5026. if (match)
  5027. {
  5028. FPT_scamInfo[i].state = ID_ASSIGNED;
  5029. return(i);
  5030. }
  5031. }
  5032. if (p_id_string[0] & BIT(5))
  5033. i = 8;
  5034. else
  5035. i = MAX_SCSI_TAR;
  5036. if (((p_id_string[0] & 0x06) == 0x02) || ((p_id_string[0] & 0x06) == 0x04))
  5037. match = p_id_string[1] & (UCHAR) 0x1F;
  5038. else
  5039. match = 7;
  5040. while (i > 0)
  5041. {
  5042. i--;
  5043. if (FPT_scamInfo[match].state == ID_UNUSED)
  5044. {
  5045. for (k=0; k < ID_STRING_LENGTH; k++)
  5046. {
  5047. FPT_scamInfo[match].id_string[k] = p_id_string[k];
  5048. }
  5049. FPT_scamInfo[match].state = ID_ASSIGNED;
  5050. if(FPT_BL_Card[p_card].pNvRamInfo == NULL)
  5051. FPT_BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
  5052. return(match);
  5053. }
  5054. match--;
  5055. if (match == 0xFF)
  5056. {
  5057. if (p_id_string[0] & BIT(5))
  5058. match = 7;
  5059. else
  5060. match = MAX_SCSI_TAR-1;
  5061. }
  5062. }
  5063. if (p_id_string[0] & BIT(7))
  5064. {
  5065. return(CLR_PRIORITY);
  5066. }
  5067. if (p_id_string[0] & BIT(5))
  5068. i = 8;
  5069. else
  5070. i = MAX_SCSI_TAR;
  5071. if (((p_id_string[0] & 0x06) == 0x02) || ((p_id_string[0] & 0x06) == 0x04))
  5072. match = p_id_string[1] & (UCHAR) 0x1F;
  5073. else
  5074. match = 7;
  5075. while (i > 0)
  5076. {
  5077. i--;
  5078. if (FPT_scamInfo[match].state == ID_UNASSIGNED)
  5079. {
  5080. for (k=0; k < ID_STRING_LENGTH; k++)
  5081. {
  5082. FPT_scamInfo[match].id_string[k] = p_id_string[k];
  5083. }
  5084. FPT_scamInfo[match].id_string[0] |= BIT(7);
  5085. FPT_scamInfo[match].state = ID_ASSIGNED;
  5086. if(FPT_BL_Card[p_card].pNvRamInfo == NULL)
  5087. FPT_BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
  5088. return(match);
  5089. }
  5090. match--;
  5091. if (match == 0xFF)
  5092. {
  5093. if (p_id_string[0] & BIT(5))
  5094. match = 7;
  5095. else
  5096. match = MAX_SCSI_TAR-1;
  5097. }
  5098. }
  5099. return(NO_ID_AVAIL);
  5100. }
  5101. /*---------------------------------------------------------------------
  5102. *
  5103. * Function: FPT_scsavdi
  5104. *
  5105. * Description: Save off the device SCAM ID strings.
  5106. *
  5107. *---------------------------------------------------------------------*/
  5108. static void FPT_scsavdi(UCHAR p_card, ULONG p_port)
  5109. {
  5110. UCHAR i,k,max_id;
  5111. USHORT ee_data,sum_data;
  5112. sum_data = 0x0000;
  5113. for (i = 1; i < EE_SCAMBASE/2; i++)
  5114. {
  5115. sum_data += FPT_utilEERead(p_port, i);
  5116. }
  5117. FPT_utilEEWriteOnOff(p_port,1); /* Enable write access to the EEPROM */
  5118. if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
  5119. max_id = 0x08;
  5120. else
  5121. max_id = 0x10;
  5122. for (i=0; i < max_id; i++)
  5123. {
  5124. for (k=0; k < ID_STRING_LENGTH; k+=2)
  5125. {
  5126. ee_data = FPT_scamInfo[i].id_string[k+1];
  5127. ee_data <<= 8;
  5128. ee_data |= FPT_scamInfo[i].id_string[k];
  5129. sum_data += ee_data;
  5130. FPT_utilEEWrite(p_port, ee_data, (USHORT)((EE_SCAMBASE/2) +
  5131. (USHORT)(i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2)));
  5132. }
  5133. }
  5134. FPT_utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM/2);
  5135. FPT_utilEEWriteOnOff(p_port,0); /* Turn off write access */
  5136. }
  5137. /*---------------------------------------------------------------------
  5138. *
  5139. * Function: FPT_XbowInit
  5140. *
  5141. * Description: Setup the Xbow for normal operation.
  5142. *
  5143. *---------------------------------------------------------------------*/
  5144. static void FPT_XbowInit(ULONG port, UCHAR ScamFlg)
  5145. {
  5146. UCHAR i;
  5147. i = RD_HARPOON(port+hp_page_ctrl);
  5148. WR_HARPOON(port+hp_page_ctrl, (UCHAR) (i | G_INT_DISABLE));
  5149. WR_HARPOON(port+hp_scsireset,0x00);
  5150. WR_HARPOON(port+hp_portctrl_1,HOST_MODE8);
  5151. WR_HARPOON(port+hp_scsireset,(DMA_RESET | HPSCSI_RESET | PROG_RESET | \
  5152. FIFO_CLR));
  5153. WR_HARPOON(port+hp_scsireset,SCSI_INI);
  5154. WR_HARPOON(port+hp_clkctrl_0,CLKCTRL_DEFAULT);
  5155. WR_HARPOON(port+hp_scsisig,0x00); /* Clear any signals we might */
  5156. WR_HARPOON(port+hp_scsictrl_0,ENA_SCAM_SEL);
  5157. WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
  5158. FPT_default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
  5159. BUS_FREE | XFER_CNT_0 | AUTO_INT;
  5160. if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
  5161. FPT_default_intena |= SCAM_SEL;
  5162. WRW_HARPOON((port+hp_intena), FPT_default_intena);
  5163. WR_HARPOON(port+hp_seltimeout,TO_290ms);
  5164. /* Turn on SCSI_MODE8 for narrow cards to fix the
  5165. strapping issue with the DUAL CHANNEL card */
  5166. if (RD_HARPOON(port+hp_page_ctrl) & NARROW_SCSI_CARD)
  5167. WR_HARPOON(port+hp_addstat,SCSI_MODE8);
  5168. WR_HARPOON(port+hp_page_ctrl, i);
  5169. }
  5170. /*---------------------------------------------------------------------
  5171. *
  5172. * Function: FPT_BusMasterInit
  5173. *
  5174. * Description: Initialize the BusMaster for normal operations.
  5175. *
  5176. *---------------------------------------------------------------------*/
  5177. static void FPT_BusMasterInit(ULONG p_port)
  5178. {
  5179. WR_HARPOON(p_port+hp_sys_ctrl, DRVR_RST);
  5180. WR_HARPOON(p_port+hp_sys_ctrl, 0x00);
  5181. WR_HARPOON(p_port+hp_host_blk_cnt, XFER_BLK64);
  5182. WR_HARPOON(p_port+hp_bm_ctrl, (BMCTRL_DEFAULT));
  5183. WR_HARPOON(p_port+hp_ee_ctrl, (SCSI_TERM_ENA_H));
  5184. RD_HARPOON(p_port+hp_int_status); /*Clear interrupts. */
  5185. WR_HARPOON(p_port+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
  5186. WR_HARPOON(p_port+hp_page_ctrl, (RD_HARPOON(p_port+hp_page_ctrl) &
  5187. ~SCATTER_EN));
  5188. }
  5189. /*---------------------------------------------------------------------
  5190. *
  5191. * Function: FPT_DiagEEPROM
  5192. *
  5193. * Description: Verfiy checksum and 'Key' and initialize the EEPROM if
  5194. * necessary.
  5195. *
  5196. *---------------------------------------------------------------------*/
  5197. static void FPT_DiagEEPROM(ULONG p_port)
  5198. {
  5199. USHORT index,temp,max_wd_cnt;
  5200. if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
  5201. max_wd_cnt = EEPROM_WD_CNT;
  5202. else
  5203. max_wd_cnt = EEPROM_WD_CNT * 2;
  5204. temp = FPT_utilEERead(p_port, FW_SIGNATURE/2);
  5205. if (temp == 0x4641) {
  5206. for (index = 2; index < max_wd_cnt; index++) {
  5207. temp += FPT_utilEERead(p_port, index);
  5208. }
  5209. if (temp == FPT_utilEERead(p_port, EEPROM_CHECK_SUM/2)) {
  5210. return; /*EEPROM is Okay so return now! */
  5211. }
  5212. }
  5213. FPT_utilEEWriteOnOff(p_port,(UCHAR)1);
  5214. for (index = 0; index < max_wd_cnt; index++) {
  5215. FPT_utilEEWrite(p_port, 0x0000, index);
  5216. }
  5217. temp = 0;
  5218. FPT_utilEEWrite(p_port, 0x4641, FW_SIGNATURE/2);
  5219. temp += 0x4641;
  5220. FPT_utilEEWrite(p_port, 0x3920, MODEL_NUMB_0/2);
  5221. temp += 0x3920;
  5222. FPT_utilEEWrite(p_port, 0x3033, MODEL_NUMB_2/2);
  5223. temp += 0x3033;
  5224. FPT_utilEEWrite(p_port, 0x2020, MODEL_NUMB_4/2);
  5225. temp += 0x2020;
  5226. FPT_utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG/2);
  5227. temp += 0x70D3;
  5228. FPT_utilEEWrite(p_port, 0x0010, BIOS_CONFIG/2);
  5229. temp += 0x0010;
  5230. FPT_utilEEWrite(p_port, 0x0003, SCAM_CONFIG/2);
  5231. temp += 0x0003;
  5232. FPT_utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID/2);
  5233. temp += 0x0007;
  5234. FPT_utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN/2);
  5235. temp += 0x0000;
  5236. FPT_utilEEWrite(p_port, 0x0000, SEND_START_ENA/2);
  5237. temp += 0x0000;
  5238. FPT_utilEEWrite(p_port, 0x0000, DEVICE_ENABLE/2);
  5239. temp += 0x0000;
  5240. FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01/2);
  5241. temp += 0x4242;
  5242. FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23/2);
  5243. temp += 0x4242;
  5244. FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45/2);
  5245. temp += 0x4242;
  5246. FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67/2);
  5247. temp += 0x4242;
  5248. FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89/2);
  5249. temp += 0x4242;
  5250. FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab/2);
  5251. temp += 0x4242;
  5252. FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd/2);
  5253. temp += 0x4242;
  5254. FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef/2);
  5255. temp += 0x4242;
  5256. FPT_utilEEWrite(p_port, 0x6C46, 64/2); /*PRODUCT ID */
  5257. temp += 0x6C46;
  5258. FPT_utilEEWrite(p_port, 0x7361, 66/2); /* FlashPoint LT */
  5259. temp += 0x7361;
  5260. FPT_utilEEWrite(p_port, 0x5068, 68/2);
  5261. temp += 0x5068;
  5262. FPT_utilEEWrite(p_port, 0x696F, 70/2);
  5263. temp += 0x696F;
  5264. FPT_utilEEWrite(p_port, 0x746E, 72/2);
  5265. temp += 0x746E;
  5266. FPT_utilEEWrite(p_port, 0x4C20, 74/2);
  5267. temp += 0x4C20;
  5268. FPT_utilEEWrite(p_port, 0x2054, 76/2);
  5269. temp += 0x2054;
  5270. FPT_utilEEWrite(p_port, 0x2020, 78/2);
  5271. temp += 0x2020;
  5272. index = ((EE_SCAMBASE/2)+(7*16));
  5273. FPT_utilEEWrite(p_port, (0x0700+TYPE_CODE0), index);
  5274. temp += (0x0700+TYPE_CODE0);
  5275. index++;
  5276. FPT_utilEEWrite(p_port, 0x5542, index); /*Vendor ID code */
  5277. temp += 0x5542; /* BUSLOGIC */
  5278. index++;
  5279. FPT_utilEEWrite(p_port, 0x4C53, index);
  5280. temp += 0x4C53;
  5281. index++;
  5282. FPT_utilEEWrite(p_port, 0x474F, index);
  5283. temp += 0x474F;
  5284. index++;
  5285. FPT_utilEEWrite(p_port, 0x4349, index);
  5286. temp += 0x4349;
  5287. index++;
  5288. FPT_utilEEWrite(p_port, 0x5442, index); /*Vendor unique code */
  5289. temp += 0x5442; /* BT- 930 */
  5290. index++;
  5291. FPT_utilEEWrite(p_port, 0x202D, index);
  5292. temp += 0x202D;
  5293. index++;
  5294. FPT_utilEEWrite(p_port, 0x3339, index);
  5295. temp += 0x3339;
  5296. index++; /*Serial # */
  5297. FPT_utilEEWrite(p_port, 0x2030, index); /* 01234567 */
  5298. temp += 0x2030;
  5299. index++;
  5300. FPT_utilEEWrite(p_port, 0x5453, index);
  5301. temp += 0x5453;
  5302. index++;
  5303. FPT_utilEEWrite(p_port, 0x5645, index);
  5304. temp += 0x5645;
  5305. index++;
  5306. FPT_utilEEWrite(p_port, 0x2045, index);
  5307. temp += 0x2045;
  5308. index++;
  5309. FPT_utilEEWrite(p_port, 0x202F, index);
  5310. temp += 0x202F;
  5311. index++;
  5312. FPT_utilEEWrite(p_port, 0x4F4A, index);
  5313. temp += 0x4F4A;
  5314. index++;
  5315. FPT_utilEEWrite(p_port, 0x204E, index);
  5316. temp += 0x204E;
  5317. index++;
  5318. FPT_utilEEWrite(p_port, 0x3539, index);
  5319. temp += 0x3539;
  5320. FPT_utilEEWrite(p_port, temp, EEPROM_CHECK_SUM/2);
  5321. FPT_utilEEWriteOnOff(p_port,(UCHAR)0);
  5322. }
  5323. /*---------------------------------------------------------------------
  5324. *
  5325. * Function: Queue Search Select
  5326. *
  5327. * Description: Try to find a new command to execute.
  5328. *
  5329. *---------------------------------------------------------------------*/
  5330. static void FPT_queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card)
  5331. {
  5332. UCHAR scan_ptr, lun;
  5333. PSCCBMgr_tar_info currTar_Info;
  5334. PSCCB pOldSccb;
  5335. scan_ptr = pCurrCard->scanIndex;
  5336. do
  5337. {
  5338. currTar_Info = &FPT_sccbMgrTbl[p_card][scan_ptr];
  5339. if((pCurrCard->globalFlags & F_CONLUN_IO) &&
  5340. ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  5341. {
  5342. if (currTar_Info->TarSelQ_Cnt != 0)
  5343. {
  5344. scan_ptr++;
  5345. if (scan_ptr == MAX_SCSI_TAR)
  5346. scan_ptr = 0;
  5347. for(lun=0; lun < MAX_LUN; lun++)
  5348. {
  5349. if(currTar_Info->TarLUNBusy[lun] == 0)
  5350. {
  5351. pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head;
  5352. pOldSccb = NULL;
  5353. while((pCurrCard->currentSCCB != NULL) &&
  5354. (lun != pCurrCard->currentSCCB->Lun))
  5355. {
  5356. pOldSccb = pCurrCard->currentSCCB;
  5357. pCurrCard->currentSCCB = (PSCCB)(pCurrCard->currentSCCB)->
  5358. Sccb_forwardlink;
  5359. }
  5360. if(pCurrCard->currentSCCB == NULL)
  5361. continue;
  5362. if(pOldSccb != NULL)
  5363. {
  5364. pOldSccb->Sccb_forwardlink = (PSCCB)(pCurrCard->currentSCCB)->
  5365. Sccb_forwardlink;
  5366. pOldSccb->Sccb_backlink = (PSCCB)(pCurrCard->currentSCCB)->
  5367. Sccb_backlink;
  5368. currTar_Info->TarSelQ_Cnt--;
  5369. }
  5370. else
  5371. {
  5372. currTar_Info->TarSelQ_Head = (PSCCB)(pCurrCard->currentSCCB)->Sccb_forwardlink;
  5373. if (currTar_Info->TarSelQ_Head == NULL)
  5374. {
  5375. currTar_Info->TarSelQ_Tail = NULL;
  5376. currTar_Info->TarSelQ_Cnt = 0;
  5377. }
  5378. else
  5379. {
  5380. currTar_Info->TarSelQ_Cnt--;
  5381. currTar_Info->TarSelQ_Head->Sccb_backlink = (PSCCB)NULL;
  5382. }
  5383. }
  5384. pCurrCard->scanIndex = scan_ptr;
  5385. pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
  5386. break;
  5387. }
  5388. }
  5389. }
  5390. else
  5391. {
  5392. scan_ptr++;
  5393. if (scan_ptr == MAX_SCSI_TAR) {
  5394. scan_ptr = 0;
  5395. }
  5396. }
  5397. }
  5398. else
  5399. {
  5400. if ((currTar_Info->TarSelQ_Cnt != 0) &&
  5401. (currTar_Info->TarLUNBusy[0] == 0))
  5402. {
  5403. pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head;
  5404. currTar_Info->TarSelQ_Head = (PSCCB)(pCurrCard->currentSCCB)->Sccb_forwardlink;
  5405. if (currTar_Info->TarSelQ_Head == NULL)
  5406. {
  5407. currTar_Info->TarSelQ_Tail = NULL;
  5408. currTar_Info->TarSelQ_Cnt = 0;
  5409. }
  5410. else
  5411. {
  5412. currTar_Info->TarSelQ_Cnt--;
  5413. currTar_Info->TarSelQ_Head->Sccb_backlink = (PSCCB)NULL;
  5414. }
  5415. scan_ptr++;
  5416. if (scan_ptr == MAX_SCSI_TAR)
  5417. scan_ptr = 0;
  5418. pCurrCard->scanIndex = scan_ptr;
  5419. pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
  5420. break;
  5421. }
  5422. else
  5423. {
  5424. scan_ptr++;
  5425. if (scan_ptr == MAX_SCSI_TAR)
  5426. {
  5427. scan_ptr = 0;
  5428. }
  5429. }
  5430. }
  5431. } while (scan_ptr != pCurrCard->scanIndex);
  5432. }
  5433. /*---------------------------------------------------------------------
  5434. *
  5435. * Function: Queue Select Fail
  5436. *
  5437. * Description: Add the current SCCB to the head of the Queue.
  5438. *
  5439. *---------------------------------------------------------------------*/
  5440. static void FPT_queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card)
  5441. {
  5442. UCHAR thisTarg;
  5443. PSCCBMgr_tar_info currTar_Info;
  5444. if (pCurrCard->currentSCCB != NULL)
  5445. {
  5446. thisTarg = (UCHAR)(((PSCCB)(pCurrCard->currentSCCB))->TargID);
  5447. currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
  5448. pCurrCard->currentSCCB->Sccb_backlink = (PSCCB)NULL;
  5449. pCurrCard->currentSCCB->Sccb_forwardlink = currTar_Info->TarSelQ_Head;
  5450. if (currTar_Info->TarSelQ_Cnt == 0)
  5451. {
  5452. currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB;
  5453. }
  5454. else
  5455. {
  5456. currTar_Info->TarSelQ_Head->Sccb_backlink = pCurrCard->currentSCCB;
  5457. }
  5458. currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB;
  5459. pCurrCard->currentSCCB = NULL;
  5460. currTar_Info->TarSelQ_Cnt++;
  5461. }
  5462. }
  5463. /*---------------------------------------------------------------------
  5464. *
  5465. * Function: Queue Command Complete
  5466. *
  5467. * Description: Call the callback function with the current SCCB.
  5468. *
  5469. *---------------------------------------------------------------------*/
  5470. static void FPT_queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_sccb,
  5471. UCHAR p_card)
  5472. {
  5473. UCHAR i, SCSIcmd;
  5474. CALL_BK_FN callback;
  5475. PSCCBMgr_tar_info currTar_Info;
  5476. SCSIcmd = p_sccb->Cdb[0];
  5477. if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED)) {
  5478. if ((p_sccb->ControlByte & (SCCB_DATA_XFER_OUT | SCCB_DATA_XFER_IN)) &&
  5479. (p_sccb->HostStatus == SCCB_COMPLETE) &&
  5480. (p_sccb->TargetStatus != SSCHECK))
  5481. if ((SCSIcmd == SCSI_READ) ||
  5482. (SCSIcmd == SCSI_WRITE) ||
  5483. (SCSIcmd == SCSI_READ_EXTENDED) ||
  5484. (SCSIcmd == SCSI_WRITE_EXTENDED) ||
  5485. (SCSIcmd == SCSI_WRITE_AND_VERIFY) ||
  5486. (SCSIcmd == SCSI_START_STOP_UNIT) ||
  5487. (pCurrCard->globalFlags & F_NO_FILTER)
  5488. )
  5489. p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
  5490. }
  5491. if(p_sccb->SccbStatus == SCCB_IN_PROCESS)
  5492. {
  5493. if (p_sccb->HostStatus || p_sccb->TargetStatus)
  5494. p_sccb->SccbStatus = SCCB_ERROR;
  5495. else
  5496. p_sccb->SccbStatus = SCCB_SUCCESS;
  5497. }
  5498. if (p_sccb->Sccb_XferState & F_AUTO_SENSE) {
  5499. p_sccb->CdbLength = p_sccb->Save_CdbLen;
  5500. for (i=0; i < 6; i++) {
  5501. p_sccb->Cdb[i] = p_sccb->Save_Cdb[i];
  5502. }
  5503. }
  5504. if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
  5505. (p_sccb->OperationCode == RESIDUAL_COMMAND)) {
  5506. FPT_utilUpdateResidual(p_sccb);
  5507. }
  5508. pCurrCard->cmdCounter--;
  5509. if (!pCurrCard->cmdCounter) {
  5510. if (pCurrCard->globalFlags & F_GREEN_PC) {
  5511. WR_HARPOON(pCurrCard->ioPort+hp_clkctrl_0,(PWR_DWN | CLKCTRL_DEFAULT));
  5512. WR_HARPOON(pCurrCard->ioPort+hp_sys_ctrl, STOP_CLK);
  5513. }
  5514. WR_HARPOON(pCurrCard->ioPort+hp_semaphore,
  5515. (RD_HARPOON(pCurrCard->ioPort+hp_semaphore) & ~SCCB_MGR_ACTIVE));
  5516. }
  5517. if(pCurrCard->discQCount != 0)
  5518. {
  5519. currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
  5520. if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
  5521. ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
  5522. {
  5523. pCurrCard->discQCount--;
  5524. pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = NULL;
  5525. }
  5526. else
  5527. {
  5528. if(p_sccb->Sccb_tag)
  5529. {
  5530. pCurrCard->discQCount--;
  5531. pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
  5532. }else
  5533. {
  5534. pCurrCard->discQCount--;
  5535. pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
  5536. }
  5537. }
  5538. }
  5539. callback = (CALL_BK_FN)p_sccb->SccbCallback;
  5540. callback(p_sccb);
  5541. pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
  5542. pCurrCard->currentSCCB = NULL;
  5543. }
  5544. /*---------------------------------------------------------------------
  5545. *
  5546. * Function: Queue Disconnect
  5547. *
  5548. * Description: Add SCCB to our disconnect array.
  5549. *
  5550. *---------------------------------------------------------------------*/
  5551. static void FPT_queueDisconnect(PSCCB p_sccb, UCHAR p_card)
  5552. {
  5553. PSCCBMgr_tar_info currTar_Info;
  5554. currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
  5555. if(((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  5556. ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
  5557. {
  5558. FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = p_sccb;
  5559. }
  5560. else
  5561. {
  5562. if (p_sccb->Sccb_tag)
  5563. {
  5564. FPT_BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] = p_sccb;
  5565. FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] = 0;
  5566. FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
  5567. }else
  5568. {
  5569. FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = p_sccb;
  5570. }
  5571. }
  5572. FPT_BL_Card[p_card].currentSCCB = NULL;
  5573. }
  5574. /*---------------------------------------------------------------------
  5575. *
  5576. * Function: Queue Flush SCCB
  5577. *
  5578. * Description: Flush all SCCB's back to the host driver for this target.
  5579. *
  5580. *---------------------------------------------------------------------*/
  5581. static void FPT_queueFlushSccb(UCHAR p_card, UCHAR error_code)
  5582. {
  5583. UCHAR qtag,thisTarg;
  5584. PSCCB currSCCB;
  5585. PSCCBMgr_tar_info currTar_Info;
  5586. currSCCB = FPT_BL_Card[p_card].currentSCCB;
  5587. if(currSCCB != NULL)
  5588. {
  5589. thisTarg = (UCHAR)currSCCB->TargID;
  5590. currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
  5591. for (qtag=0; qtag<QUEUE_DEPTH; qtag++) {
  5592. if (FPT_BL_Card[p_card].discQ_Tbl[qtag] &&
  5593. (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
  5594. {
  5595. FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
  5596. FPT_queueCmdComplete(&FPT_BL_Card[p_card],FPT_BL_Card[p_card].discQ_Tbl[qtag], p_card);
  5597. FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  5598. currTar_Info->TarTagQ_Cnt--;
  5599. }
  5600. }
  5601. }
  5602. }
  5603. /*---------------------------------------------------------------------
  5604. *
  5605. * Function: Queue Flush Target SCCB
  5606. *
  5607. * Description: Flush all SCCB's back to the host driver for this target.
  5608. *
  5609. *---------------------------------------------------------------------*/
  5610. static void FPT_queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg,
  5611. UCHAR error_code)
  5612. {
  5613. UCHAR qtag;
  5614. PSCCBMgr_tar_info currTar_Info;
  5615. currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
  5616. for (qtag=0; qtag<QUEUE_DEPTH; qtag++) {
  5617. if (FPT_BL_Card[p_card].discQ_Tbl[qtag] &&
  5618. (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
  5619. {
  5620. FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
  5621. FPT_queueCmdComplete(&FPT_BL_Card[p_card],FPT_BL_Card[p_card].discQ_Tbl[qtag], p_card);
  5622. FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  5623. currTar_Info->TarTagQ_Cnt--;
  5624. }
  5625. }
  5626. }
  5627. static void FPT_queueAddSccb(PSCCB p_SCCB, UCHAR p_card)
  5628. {
  5629. PSCCBMgr_tar_info currTar_Info;
  5630. currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
  5631. p_SCCB->Sccb_forwardlink = NULL;
  5632. p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail;
  5633. if (currTar_Info->TarSelQ_Cnt == 0) {
  5634. currTar_Info->TarSelQ_Head = p_SCCB;
  5635. }
  5636. else {
  5637. currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB;
  5638. }
  5639. currTar_Info->TarSelQ_Tail = p_SCCB;
  5640. currTar_Info->TarSelQ_Cnt++;
  5641. }
  5642. /*---------------------------------------------------------------------
  5643. *
  5644. * Function: Queue Find SCCB
  5645. *
  5646. * Description: Search the target select Queue for this SCCB, and
  5647. * remove it if found.
  5648. *
  5649. *---------------------------------------------------------------------*/
  5650. static UCHAR FPT_queueFindSccb(PSCCB p_SCCB, UCHAR p_card)
  5651. {
  5652. PSCCB q_ptr;
  5653. PSCCBMgr_tar_info currTar_Info;
  5654. currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
  5655. q_ptr = currTar_Info->TarSelQ_Head;
  5656. while(q_ptr != NULL) {
  5657. if (q_ptr == p_SCCB) {
  5658. if (currTar_Info->TarSelQ_Head == q_ptr) {
  5659. currTar_Info->TarSelQ_Head = q_ptr->Sccb_forwardlink;
  5660. }
  5661. if (currTar_Info->TarSelQ_Tail == q_ptr) {
  5662. currTar_Info->TarSelQ_Tail = q_ptr->Sccb_backlink;
  5663. }
  5664. if (q_ptr->Sccb_forwardlink != NULL) {
  5665. q_ptr->Sccb_forwardlink->Sccb_backlink = q_ptr->Sccb_backlink;
  5666. }
  5667. if (q_ptr->Sccb_backlink != NULL) {
  5668. q_ptr->Sccb_backlink->Sccb_forwardlink = q_ptr->Sccb_forwardlink;
  5669. }
  5670. currTar_Info->TarSelQ_Cnt--;
  5671. return(1);
  5672. }
  5673. else {
  5674. q_ptr = q_ptr->Sccb_forwardlink;
  5675. }
  5676. }
  5677. return(0);
  5678. }
  5679. /*---------------------------------------------------------------------
  5680. *
  5681. * Function: Utility Update Residual Count
  5682. *
  5683. * Description: Update the XferCnt to the remaining byte count.
  5684. * If we transferred all the data then just write zero.
  5685. * If Non-SG transfer then report Total Cnt - Actual Transfer
  5686. * Cnt. For SG transfers add the count fields of all
  5687. * remaining SG elements, as well as any partial remaining
  5688. * element.
  5689. *
  5690. *---------------------------------------------------------------------*/
  5691. static void FPT_utilUpdateResidual(PSCCB p_SCCB)
  5692. {
  5693. ULONG partial_cnt;
  5694. UINT sg_index;
  5695. ULONG *sg_ptr;
  5696. if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) {
  5697. p_SCCB->DataLength = 0x0000;
  5698. }
  5699. else if (p_SCCB->Sccb_XferState & F_SG_XFER) {
  5700. partial_cnt = 0x0000;
  5701. sg_index = p_SCCB->Sccb_sgseg;
  5702. sg_ptr = (ULONG *)p_SCCB->DataPointer;
  5703. if (p_SCCB->Sccb_SGoffset) {
  5704. partial_cnt = p_SCCB->Sccb_SGoffset;
  5705. sg_index++;
  5706. }
  5707. while ( ((ULONG)sg_index * (ULONG)SG_ELEMENT_SIZE) <
  5708. p_SCCB->DataLength ) {
  5709. partial_cnt += *(sg_ptr+(sg_index * 2));
  5710. sg_index++;
  5711. }
  5712. p_SCCB->DataLength = partial_cnt;
  5713. }
  5714. else {
  5715. p_SCCB->DataLength -= p_SCCB->Sccb_ATC;
  5716. }
  5717. }
  5718. /*---------------------------------------------------------------------
  5719. *
  5720. * Function: Wait 1 Second
  5721. *
  5722. * Description: Wait for 1 second.
  5723. *
  5724. *---------------------------------------------------------------------*/
  5725. static void FPT_Wait1Second(ULONG p_port)
  5726. {
  5727. UCHAR i;
  5728. for(i=0; i < 4; i++) {
  5729. FPT_Wait(p_port, TO_250ms);
  5730. if ((RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST))
  5731. break;
  5732. if((RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL))
  5733. break;
  5734. }
  5735. }
  5736. /*---------------------------------------------------------------------
  5737. *
  5738. * Function: FPT_Wait
  5739. *
  5740. * Description: Wait the desired delay.
  5741. *
  5742. *---------------------------------------------------------------------*/
  5743. static void FPT_Wait(ULONG p_port, UCHAR p_delay)
  5744. {
  5745. UCHAR old_timer;
  5746. UCHAR green_flag;
  5747. old_timer = RD_HARPOON(p_port+hp_seltimeout);
  5748. green_flag=RD_HARPOON(p_port+hp_clkctrl_0);
  5749. WR_HARPOON(p_port+hp_clkctrl_0, CLKCTRL_DEFAULT);
  5750. WR_HARPOON(p_port+hp_seltimeout,p_delay);
  5751. WRW_HARPOON((p_port+hp_intstat), TIMEOUT);
  5752. WRW_HARPOON((p_port+hp_intena), (FPT_default_intena & ~TIMEOUT));
  5753. WR_HARPOON(p_port+hp_portctrl_0,
  5754. (RD_HARPOON(p_port+hp_portctrl_0) | START_TO));
  5755. while (!(RDW_HARPOON((p_port+hp_intstat)) & TIMEOUT)) {
  5756. if ((RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST))
  5757. break;
  5758. if ((RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL))
  5759. break;
  5760. }
  5761. WR_HARPOON(p_port+hp_portctrl_0,
  5762. (RD_HARPOON(p_port+hp_portctrl_0) & ~START_TO));
  5763. WRW_HARPOON((p_port+hp_intstat), TIMEOUT);
  5764. WRW_HARPOON((p_port+hp_intena), FPT_default_intena);
  5765. WR_HARPOON(p_port+hp_clkctrl_0,green_flag);
  5766. WR_HARPOON(p_port+hp_seltimeout,old_timer);
  5767. }
  5768. /*---------------------------------------------------------------------
  5769. *
  5770. * Function: Enable/Disable Write to EEPROM
  5771. *
  5772. * Description: The EEPROM must first be enabled for writes
  5773. * A total of 9 clocks are needed.
  5774. *
  5775. *---------------------------------------------------------------------*/
  5776. static void FPT_utilEEWriteOnOff(ULONG p_port,UCHAR p_mode)
  5777. {
  5778. UCHAR ee_value;
  5779. ee_value = (UCHAR)(RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H));
  5780. if (p_mode)
  5781. FPT_utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
  5782. else
  5783. FPT_utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
  5784. WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */
  5785. WR_HARPOON(p_port+hp_ee_ctrl, ee_value); /*Turn off Master Select */
  5786. }
  5787. /*---------------------------------------------------------------------
  5788. *
  5789. * Function: Write EEPROM
  5790. *
  5791. * Description: Write a word to the EEPROM at the specified
  5792. * address.
  5793. *
  5794. *---------------------------------------------------------------------*/
  5795. static void FPT_utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr)
  5796. {
  5797. UCHAR ee_value;
  5798. USHORT i;
  5799. ee_value = (UCHAR)((RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H))|
  5800. (SEE_MS | SEE_CS));
  5801. FPT_utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
  5802. ee_value |= (SEE_MS + SEE_CS);
  5803. for(i = 0x8000; i != 0; i>>=1) {
  5804. if (i & ee_data)
  5805. ee_value |= SEE_DO;
  5806. else
  5807. ee_value &= ~SEE_DO;
  5808. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5809. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5810. ee_value |= SEE_CLK; /* Clock data! */
  5811. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5812. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5813. ee_value &= ~SEE_CLK;
  5814. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5815. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5816. }
  5817. ee_value &= (EXT_ARB_ACK | SCSI_TERM_ENA_H);
  5818. WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS));
  5819. FPT_Wait(p_port, TO_10ms);
  5820. WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS | SEE_CS)); /* Set CS to EEPROM */
  5821. WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /* Turn off CS */
  5822. WR_HARPOON(p_port+hp_ee_ctrl, ee_value); /* Turn off Master Select */
  5823. }
  5824. /*---------------------------------------------------------------------
  5825. *
  5826. * Function: Read EEPROM
  5827. *
  5828. * Description: Read a word from the EEPROM at the desired
  5829. * address.
  5830. *
  5831. *---------------------------------------------------------------------*/
  5832. static USHORT FPT_utilEERead(ULONG p_port, USHORT ee_addr)
  5833. {
  5834. USHORT i, ee_data1, ee_data2;
  5835. i = 0;
  5836. ee_data1 = FPT_utilEEReadOrg(p_port, ee_addr);
  5837. do
  5838. {
  5839. ee_data2 = FPT_utilEEReadOrg(p_port, ee_addr);
  5840. if(ee_data1 == ee_data2)
  5841. return(ee_data1);
  5842. ee_data1 = ee_data2;
  5843. i++;
  5844. }while(i < 4);
  5845. return(ee_data1);
  5846. }
  5847. /*---------------------------------------------------------------------
  5848. *
  5849. * Function: Read EEPROM Original
  5850. *
  5851. * Description: Read a word from the EEPROM at the desired
  5852. * address.
  5853. *
  5854. *---------------------------------------------------------------------*/
  5855. static USHORT FPT_utilEEReadOrg(ULONG p_port, USHORT ee_addr)
  5856. {
  5857. UCHAR ee_value;
  5858. USHORT i, ee_data;
  5859. ee_value = (UCHAR)((RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H))|
  5860. (SEE_MS | SEE_CS));
  5861. FPT_utilEESendCmdAddr(p_port, EE_READ, ee_addr);
  5862. ee_value |= (SEE_MS + SEE_CS);
  5863. ee_data = 0;
  5864. for(i = 1; i <= 16; i++) {
  5865. ee_value |= SEE_CLK; /* Clock data! */
  5866. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5867. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5868. ee_value &= ~SEE_CLK;
  5869. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5870. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5871. ee_data <<= 1;
  5872. if (RD_HARPOON(p_port+hp_ee_ctrl) & SEE_DI)
  5873. ee_data |= 1;
  5874. }
  5875. ee_value &= ~(SEE_MS + SEE_CS);
  5876. WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */
  5877. WR_HARPOON(p_port+hp_ee_ctrl, ee_value); /*Turn off Master Select */
  5878. return(ee_data);
  5879. }
  5880. /*---------------------------------------------------------------------
  5881. *
  5882. * Function: Send EE command and Address to the EEPROM
  5883. *
  5884. * Description: Transfers the correct command and sends the address
  5885. * to the eeprom.
  5886. *
  5887. *---------------------------------------------------------------------*/
  5888. static void FPT_utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr)
  5889. {
  5890. UCHAR ee_value;
  5891. UCHAR narrow_flg;
  5892. USHORT i;
  5893. narrow_flg= (UCHAR)(RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD);
  5894. ee_value = SEE_MS;
  5895. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5896. ee_value |= SEE_CS; /* Set CS to EEPROM */
  5897. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5898. for(i = 0x04; i != 0; i>>=1) {
  5899. if (i & ee_cmd)
  5900. ee_value |= SEE_DO;
  5901. else
  5902. ee_value &= ~SEE_DO;
  5903. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5904. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5905. ee_value |= SEE_CLK; /* Clock data! */
  5906. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5907. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5908. ee_value &= ~SEE_CLK;
  5909. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5910. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5911. }
  5912. if (narrow_flg)
  5913. i = 0x0080;
  5914. else
  5915. i = 0x0200;
  5916. while (i != 0) {
  5917. if (i & ee_addr)
  5918. ee_value |= SEE_DO;
  5919. else
  5920. ee_value &= ~SEE_DO;
  5921. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5922. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5923. ee_value |= SEE_CLK; /* Clock data! */
  5924. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5925. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5926. ee_value &= ~SEE_CLK;
  5927. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5928. WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
  5929. i >>= 1;
  5930. }
  5931. }
  5932. static USHORT FPT_CalcCrc16(UCHAR buffer[])
  5933. {
  5934. USHORT crc=0;
  5935. int i,j;
  5936. USHORT ch;
  5937. for (i=0; i < ID_STRING_LENGTH; i++)
  5938. {
  5939. ch = (USHORT) buffer[i];
  5940. for(j=0; j < 8; j++)
  5941. {
  5942. if ((crc ^ ch) & 1)
  5943. crc = (crc >> 1) ^ CRCMASK;
  5944. else
  5945. crc >>= 1;
  5946. ch >>= 1;
  5947. }
  5948. }
  5949. return(crc);
  5950. }
  5951. static UCHAR FPT_CalcLrc(UCHAR buffer[])
  5952. {
  5953. int i;
  5954. UCHAR lrc;
  5955. lrc = 0;
  5956. for(i = 0; i < ID_STRING_LENGTH; i++)
  5957. lrc ^= buffer[i];
  5958. return(lrc);
  5959. }
  5960. /*
  5961. The following inline definitions avoid type conflicts.
  5962. */
  5963. static inline unsigned char
  5964. FlashPoint__ProbeHostAdapter(struct FlashPoint_Info *FlashPointInfo)
  5965. {
  5966. return FlashPoint_ProbeHostAdapter((PSCCBMGR_INFO) FlashPointInfo);
  5967. }
  5968. static inline FlashPoint_CardHandle_T
  5969. FlashPoint__HardwareResetHostAdapter(struct FlashPoint_Info *FlashPointInfo)
  5970. {
  5971. return FlashPoint_HardwareResetHostAdapter((PSCCBMGR_INFO) FlashPointInfo);
  5972. }
  5973. static inline void
  5974. FlashPoint__ReleaseHostAdapter(FlashPoint_CardHandle_T CardHandle)
  5975. {
  5976. FlashPoint_ReleaseHostAdapter(CardHandle);
  5977. }
  5978. static inline void
  5979. FlashPoint__StartCCB(FlashPoint_CardHandle_T CardHandle, struct BusLogic_CCB *CCB)
  5980. {
  5981. FlashPoint_StartCCB(CardHandle, (PSCCB) CCB);
  5982. }
  5983. static inline void
  5984. FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle, struct BusLogic_CCB *CCB)
  5985. {
  5986. FlashPoint_AbortCCB(CardHandle, (PSCCB) CCB);
  5987. }
  5988. static inline boolean
  5989. FlashPoint__InterruptPending(FlashPoint_CardHandle_T CardHandle)
  5990. {
  5991. return FlashPoint_InterruptPending(CardHandle);
  5992. }
  5993. static inline int
  5994. FlashPoint__HandleInterrupt(FlashPoint_CardHandle_T CardHandle)
  5995. {
  5996. return FlashPoint_HandleInterrupt(CardHandle);
  5997. }
  5998. #define FlashPoint_ProbeHostAdapter FlashPoint__ProbeHostAdapter
  5999. #define FlashPoint_HardwareResetHostAdapter FlashPoint__HardwareResetHostAdapter
  6000. #define FlashPoint_ReleaseHostAdapter FlashPoint__ReleaseHostAdapter
  6001. #define FlashPoint_StartCCB FlashPoint__StartCCB
  6002. #define FlashPoint_AbortCCB FlashPoint__AbortCCB
  6003. #define FlashPoint_InterruptPending FlashPoint__InterruptPending
  6004. #define FlashPoint_HandleInterrupt FlashPoint__HandleInterrupt
  6005. #else /* CONFIG_SCSI_OMIT_FLASHPOINT */
  6006. /*
  6007. Define prototypes for the FlashPoint SCCB Manager Functions.
  6008. */
  6009. extern unsigned char FlashPoint_ProbeHostAdapter(struct FlashPoint_Info *);
  6010. extern FlashPoint_CardHandle_T
  6011. FlashPoint_HardwareResetHostAdapter(struct FlashPoint_Info *);
  6012. extern void FlashPoint_StartCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *);
  6013. extern int FlashPoint_AbortCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *);
  6014. extern boolean FlashPoint_InterruptPending(FlashPoint_CardHandle_T);
  6015. extern int FlashPoint_HandleInterrupt(FlashPoint_CardHandle_T);
  6016. extern void FlashPoint_ReleaseHostAdapter(FlashPoint_CardHandle_T);
  6017. #endif /* CONFIG_SCSI_OMIT_FLASHPOINT */