scsincr53c8xx.c 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210
  1. /*
  2. * NCR/Symbios/LSI Logic 53c8xx driver for Plan 9
  3. * Nigel Roles (nigel@9fs.org)
  4. *
  5. * 13/3/01 Fixed microcode to support targets > 7
  6. *
  7. * 01/12/00 Removed previous comments. Fixed a small problem in
  8. * mismatch recovery for targets with synchronous offsets of >=16
  9. * connected to >=875s. Thanks, Jean.
  10. *
  11. * Known problems
  12. *
  13. * Read/write mismatch recovery may fail on 53c1010s. Really need to get a manual.
  14. */
  15. #define MAXTARGET 8 /* can be 8 or 16 */
  16. /* Define one or the other ... */
  17. //#define CPU
  18. #ifndef FS
  19. #define FS
  20. #endif
  21. #include "u.h"
  22. #include "../port/lib.h"
  23. #include "mem.h"
  24. #include "dat.h"
  25. #include "fns.h"
  26. #include "io.h"
  27. #ifndef FS
  28. #include "../port/error.h"
  29. #endif
  30. #include "ureg.h"
  31. #ifdef NAINCLUDE
  32. #include "na/na.h"
  33. #include "na/nasupport.h"
  34. #endif /* NAINCLUDE */
  35. /**********************************/
  36. /* Portable configuration macros */
  37. /**********************************/
  38. //#define BOOTDEBUG
  39. //#define SINGLE_TARGET
  40. //#define ASYNC_ONLY
  41. //#define QUICK_TIMEOUT
  42. //#define INTERNAL_SCLK
  43. //#define ALWAYS_DO_WDTR
  44. #define WMR_DEBUG
  45. /**********************************/
  46. /* CPU specific macros */
  47. /**********************************/
  48. #ifdef CPU
  49. #ifdef BOOTDEBUG
  50. #define KPRINT oprint
  51. #define IPRINT iprint
  52. #define DEBUG(n) 0
  53. #define IFLUSH() iflush()
  54. #else
  55. #define KPRINT kprint
  56. #define IPRINT kprint
  57. #define DEBUG(n) scsidebugs[n]
  58. #define IFLUSH()
  59. #endif
  60. #endif
  61. /*******************************/
  62. /* Fileserver specific defines */
  63. /*******************************/
  64. #ifdef FS
  65. #define DEVICENAME "ncr53c8xx"
  66. #define PRINTPREFIX DEVICENAME ": "
  67. #define xalloc(n) ialloc(n, 1)
  68. #define KADDR(a) ((void*)((ulong)(a)|KZERO))
  69. #define KPRINT if(0)print
  70. #define IPRINT if(0)print
  71. #define DEBUG(n) 0
  72. #define IFLUSH()
  73. #endif
  74. /*******************************/
  75. /* General */
  76. /*******************************/
  77. #ifndef DMASEG
  78. #define DMASEG(x) PADDR(x)
  79. #define legetl(x) (*(ulong*)(x))
  80. #define lesetl(x,v) (*(ulong*)(x) = (v))
  81. #define swabl(a,b,c)
  82. #define IRQBASE Int0vec
  83. #else
  84. #define IRQBASE (PCIvec + 5)
  85. #endif
  86. #define DMASEG_TO_KADDR(x) KADDR(PADDR(x))
  87. #define KPTR(x) ((x) == 0 ? 0 : DMASEG_TO_KADDR(x))
  88. #define MEGA 1000000L
  89. #ifdef INTERNAL_SCLK
  90. #define SCLK (33 * MEGA)
  91. #else
  92. #define SCLK (40 * MEGA)
  93. #endif
  94. #define ULTRA_NOCLOCKDOUBLE_SCLK (80 * MEGA)
  95. #define MAXSYNCSCSIRATE (5 * MEGA)
  96. #define MAXFASTSYNCSCSIRATE (10 * MEGA)
  97. #define MAXULTRASYNCSCSIRATE (20 * MEGA)
  98. #define MAXULTRA2SYNCSCSIRATE (40 * MEGA)
  99. #define MAXASYNCCORERATE (25 * MEGA)
  100. #define MAXSYNCCORERATE (25 * MEGA)
  101. #define MAXFASTSYNCCORERATE (50 * MEGA)
  102. #define MAXULTRASYNCCORERATE (80 * MEGA)
  103. #define MAXULTRA2SYNCCORERATE (160 * MEGA)
  104. #define X_MSG 1
  105. #define X_MSG_SDTR 1
  106. #define X_MSG_WDTR 3
  107. #ifndef NAINCLUDE
  108. struct na_patch {
  109. unsigned lwoff;
  110. unsigned char type;
  111. };
  112. #endif /* NAINCLUDE */
  113. extern int scsidebugs[];
  114. typedef struct Ncr {
  115. uchar scntl0; /* 00 */
  116. uchar scntl1;
  117. uchar scntl2;
  118. uchar scntl3;
  119. uchar scid; /* 04 */
  120. uchar sxfer;
  121. uchar sdid;
  122. uchar gpreg;
  123. uchar sfbr; /* 08 */
  124. uchar socl;
  125. uchar ssid;
  126. uchar sbcl;
  127. uchar dstat; /* 0c */
  128. uchar sstat0;
  129. uchar sstat1;
  130. uchar sstat2;
  131. uchar dsa[4]; /* 10 */
  132. uchar istat; /* 14 */
  133. uchar istatpad[3];
  134. uchar ctest0; /* 18 */
  135. uchar ctest1;
  136. uchar ctest2;
  137. uchar ctest3;
  138. uchar temp[4]; /* 1c */
  139. uchar dfifo; /* 20 */
  140. uchar ctest4;
  141. uchar ctest5;
  142. uchar ctest6;
  143. uchar dbc[3]; /* 24 */
  144. uchar dcmd; /* 27 */
  145. uchar dnad[4]; /* 28 */
  146. uchar dsp[4]; /* 2c */
  147. uchar dsps[4]; /* 30 */
  148. uchar scratcha[4]; /* 34 */
  149. uchar dmode; /* 38 */
  150. uchar dien;
  151. uchar dwt;
  152. uchar dcntl;
  153. uchar adder[4]; /* 3c */
  154. uchar sien0; /* 40 */
  155. uchar sien1;
  156. uchar sist0;
  157. uchar sist1;
  158. uchar slpar; /* 44 */
  159. uchar slparpad0;
  160. uchar macntl;
  161. uchar gpcntl;
  162. uchar stime0; /* 48 */
  163. uchar stime1;
  164. uchar respid;
  165. uchar respidpad0;
  166. uchar stest0; /* 4c */
  167. uchar stest1;
  168. uchar stest2;
  169. uchar stest3;
  170. uchar sidl; /* 50 */
  171. uchar sidlpad[3];
  172. uchar sodl; /* 54 */
  173. uchar sodlpad[3];
  174. uchar sbdl; /* 58 */
  175. uchar sbdlpad[3];
  176. uchar scratchb[4]; /* 5c */
  177. } Ncr;
  178. typedef struct Movedata {
  179. uchar dbc[4];
  180. uchar pa[4];
  181. } Movedata;
  182. typedef enum NegoState {
  183. NeitherDone, WideInit, WideResponse, WideDone,
  184. SyncInit, SyncResponse, BothDone
  185. } NegoState;
  186. typedef enum State {
  187. Allocated, Queued, Active, Done
  188. } State;
  189. typedef struct Dsa {
  190. union {
  191. uchar state[4];
  192. struct {
  193. uchar stateb;
  194. uchar result;
  195. uchar dmablks;
  196. uchar flag; /* setbyte(state,3,...) */
  197. };
  198. };
  199. union {
  200. ulong dmancr; /* For block transfer: NCR order (little-endian) */
  201. uchar dmaaddr[4];
  202. };
  203. uchar target; /* Target */
  204. uchar pad0[3];
  205. uchar lun; /* Logical Unit Number */
  206. uchar pad1[3];
  207. uchar scntl3;
  208. uchar sxfer;
  209. uchar pad2[2];
  210. uchar next[4]; /* chaining for SCRIPT (NCR byte order) */
  211. struct Dsa *freechain; /* chaining for freelist */
  212. Rendez;
  213. uchar scsi_id_buf[4];
  214. Movedata msg_out_buf;
  215. Movedata cmd_buf;
  216. Movedata data_buf;
  217. Movedata status_buf;
  218. uchar msg_out[10]; /* enough to include SDTR */
  219. uchar status;
  220. ushort p9status;
  221. uchar parityerror;
  222. } Dsa;
  223. typedef enum Feature {
  224. BigFifo = 1, /* 536 byte fifo */
  225. BurstOpCodeFetch = 2, /* burst fetch opcodes */
  226. Prefetch = 4, /* prefetch 8 longwords */
  227. LocalRAM = 8, /* 4K longwords of local RAM */
  228. Differential = 16, /* Differential support */
  229. Wide = 32, /* Wide capable */
  230. Ultra = 64, /* Ultra capable */
  231. ClockDouble = 128, /* Has clock doubler */
  232. ClockQuad = 256, /* Has clock quadrupler (same as Ultra2) */
  233. Ultra2 = 256,
  234. } Feature;
  235. typedef enum Burst {
  236. Burst2 = 0,
  237. Burst4 = 1,
  238. Burst8 = 2,
  239. Burst16 = 3,
  240. Burst32 = 4,
  241. Burst64 = 5,
  242. Burst128 = 6
  243. } Burst;
  244. typedef struct Variant {
  245. ushort did;
  246. uchar maxrid; /* maximum allowed revision ID */
  247. char *name;
  248. Burst burst; /* codings for max burst */
  249. uchar maxsyncoff; /* max synchronous offset - must be power of 2 */
  250. uchar registers; /* number of 32 bit registers */
  251. unsigned feature;
  252. } Variant;
  253. static unsigned char cf2[] = { 6, 2, 3, 4, 6, 8, 12, 16 };
  254. #define NULTRA2SCF (sizeof(cf2)/sizeof(cf2[0]))
  255. #define NULTRASCF (NULTRA2SCF - 2)
  256. #define NSCF (NULTRASCF - 1)
  257. typedef struct Controller {
  258. Lock;
  259. struct {
  260. uchar scntl3;
  261. uchar stest2;
  262. } bios;
  263. int ctlrno;
  264. uchar synctab[NULTRA2SCF - 1][8];/* table of legal tpfs */
  265. NegoState s[MAXTARGET];
  266. uchar scntl3[MAXTARGET];
  267. uchar sxfer[MAXTARGET];
  268. uchar cap[MAXTARGET]; /* capabilities byte from Identify */
  269. ushort capvalid; /* bit per target for validity of cap[] */
  270. ushort wide; /* bit per target set if wide negotiated */
  271. ulong sclk; /* clock speed of controller */
  272. uchar clockmult; /* set by synctabinit */
  273. uchar ccf; /* CCF bits */
  274. uchar tpf; /* best tpf value for this controller */
  275. uchar feature; /* requested features */
  276. int running; /* is the script processor running? */
  277. int ssm; /* single step mode */
  278. Ncr *n; /* pointer to registers */
  279. Variant *v; /* pointer to variant type */
  280. ulong *script; /* where the real script is */
  281. ulong scriptpa; /* where the real script is */
  282. struct {
  283. Lock;
  284. uchar head[4]; /* head of free list (NCR byte order) */
  285. Dsa *tail;
  286. Dsa *freechain;
  287. } dsalist;
  288. QLock q[MAXTARGET]; /* queues for each target */
  289. } Controller;
  290. #define SYNCOFFMASK(c) (((c)->v->maxsyncoff * 2) - 1)
  291. #define SSIDMASK(c) (((c)->v->feature & Wide) ? 15 : 7)
  292. static Controller *ctlrxx[MaxScsi];
  293. /* ISTAT */
  294. enum { Abrt = 0x80, Srst = 0x40, Sigp = 0x20, Sem = 0x10, Con = 0x08, Intf = 0x04, Sip = 0x02, Dip = 0x01 };
  295. /* DSTAT */
  296. enum { Dfe = 0x80, Mdpe = 0x40, Bf = 0x20, Abrted = 0x10, Ssi = 0x08, Sir = 0x04, Iid = 0x01 };
  297. /* SSTAT */
  298. enum { DataOut, DataIn, Cmd, Status, ReservedOut, ReservedIn, MessageOut, MessageIn };
  299. #define STATUS_COMPLETE 0x6000
  300. #define STATUS_FAIL 0x8000
  301. #define STATUS_SELECTION_TIMEOUT 0x0200
  302. static void setmovedata(Movedata*, ulong, ulong);
  303. static void advancedata(Movedata*, long);
  304. static int bios_set_differential(Controller *c);
  305. static char *phase[] = {
  306. "data out", "data in", "command", "status",
  307. "reserved out", "reserved in", "message out", "message in"
  308. };
  309. #ifdef BOOTDEBUG
  310. #define DEBUGSIZE 10240
  311. char debugbuf[DEBUGSIZE];
  312. char *debuglast;
  313. void
  314. iprint(char *format, ...)
  315. {
  316. if (debuglast == 0)
  317. debuglast = debugbuf;
  318. debuglast = doprint(debuglast, debugbuf + (DEBUGSIZE - 1), format, (&format + 1));
  319. }
  320. void
  321. iflush()
  322. {
  323. int s;
  324. char *endp;
  325. s = splhi();
  326. if (debuglast == 0)
  327. debuglast = debugbuf;
  328. if (debuglast == debugbuf) {
  329. splx(s);
  330. return;
  331. }
  332. endp = debuglast;
  333. splx(s);
  334. screenputs(debugbuf, endp - debugbuf);
  335. s = splhi();
  336. memmove(debugbuf, endp, debuglast - endp);
  337. debuglast -= endp - debugbuf;
  338. splx(s);
  339. }
  340. void
  341. oprint(char *format, ...)
  342. {
  343. int s;
  344. iflush();
  345. s = splhi();
  346. if (debuglast == 0)
  347. debuglast = debugbuf;
  348. debuglast = doprint(debuglast, debugbuf + (DEBUGSIZE - 1), format, (&format + 1));
  349. splx(s);
  350. iflush();
  351. }
  352. #endif
  353. #include "script.i"
  354. static Dsa *
  355. dsaalloc(Controller *c, int target, int lun)
  356. {
  357. Dsa *d;
  358. ilock(&c->dsalist);
  359. if ((d = c->dsalist.freechain) == 0) {
  360. d = xalloc(sizeof(*d));
  361. if (DEBUG(1))
  362. KPRINT(PRINTPREFIX "%d/%d: allocated new dsa %lux\n", target, lun, (ulong)d);
  363. lesetl(d->next, 0);
  364. lesetl(d->state, A_STATE_ALLOCATED);
  365. if (legetl(c->dsalist.head) == 0)
  366. lesetl(c->dsalist.head, DMASEG(d)); /* ATOMIC?!? */
  367. else
  368. lesetl(c->dsalist.tail->next, DMASEG(d)); /* ATOMIC?!? */
  369. c->dsalist.tail = d;
  370. }
  371. else {
  372. if (DEBUG(1))
  373. KPRINT(PRINTPREFIX "%d/%d: reused dsa %lux\n", target, lun, (ulong)d);
  374. c->dsalist.freechain = d->freechain;
  375. lesetl(d->state, A_STATE_ALLOCATED);
  376. }
  377. iunlock(&c->dsalist);
  378. d->target = target;
  379. d->lun = lun;
  380. return d;
  381. }
  382. static void
  383. dsafree(Controller *c, Dsa *d)
  384. {
  385. ilock(&c->dsalist);
  386. d->freechain = c->dsalist.freechain;
  387. c->dsalist.freechain = d;
  388. lesetl(d->state, A_STATE_FREE);
  389. iunlock(&c->dsalist);
  390. }
  391. static Dsa *
  392. dsafind(Controller *c, uchar target, uchar lun, uchar state)
  393. {
  394. Dsa *d;
  395. for (d = KPTR(legetl(c->dsalist.head)); d; d = KPTR(legetl(d->next))) {
  396. if (d->target != 0xff && d->target != target)
  397. continue;
  398. if (lun != 0xff && d->lun != lun)
  399. continue;
  400. if (state != 0xff && d->stateb != state)
  401. continue;
  402. break;
  403. }
  404. return d;
  405. }
  406. static void
  407. dumpncrregs(Controller *c, int intr)
  408. {
  409. int i;
  410. Ncr *n = c->n;
  411. int depth = c->v->registers / 4;
  412. KPRINT("sa = %.8lux\n", c->scriptpa);
  413. for (i = 0; i < depth; i++) {
  414. int j;
  415. for (j = 0; j < 4; j++) {
  416. int k = j * depth + i;
  417. uchar *p;
  418. /* display little-endian to make 32-bit values readable */
  419. p = (uchar*)n+k*4;
  420. if (intr)
  421. IPRINT(" %.2x%.2x%.2x%.2x %.2x %.2x", p[3], p[2], p[1], p[0], k * 4, (k * 4) + 0x80);
  422. else
  423. KPRINT(" %.2x%.2x%.2x%.2x %.2x %.2x", p[3], p[2], p[1], p[0], k * 4, (k * 4) + 0x80);
  424. USED(p);
  425. }
  426. if (intr)
  427. IPRINT("\n");
  428. else
  429. KPRINT("\n");
  430. }
  431. }
  432. static int
  433. chooserate(Controller *c, int tpf, int *scfp, int *xferpp)
  434. {
  435. /* find lowest entry >= tpf */
  436. int besttpf = 1000;
  437. int bestscfi = 0;
  438. int bestxferp = 0;
  439. int scf, xferp;
  440. int maxscf;
  441. if (c->v->feature & Ultra2)
  442. maxscf = NULTRA2SCF;
  443. else if (c->v->feature & Ultra)
  444. maxscf = NULTRASCF;
  445. else
  446. maxscf = NSCF;
  447. /*
  448. * search large clock factors first since this should
  449. * result in more reliable transfers
  450. */
  451. for (scf = maxscf; scf >= 1; scf--) {
  452. for (xferp = 0; xferp < 8; xferp++) {
  453. unsigned char v = c->synctab[scf - 1][xferp];
  454. if (v == 0)
  455. continue;
  456. if (v >= tpf && v < besttpf) {
  457. besttpf = v;
  458. bestscfi = scf;
  459. bestxferp = xferp;
  460. }
  461. }
  462. }
  463. if (besttpf == 1000)
  464. return 0;
  465. if (scfp)
  466. *scfp = bestscfi;
  467. if (xferpp)
  468. *xferpp = bestxferp;
  469. return besttpf;
  470. }
  471. static void
  472. synctabinit(Controller *c)
  473. {
  474. int scf;
  475. unsigned long scsilimit;
  476. int xferp;
  477. unsigned long cr, sr;
  478. int tpf;
  479. int fast;
  480. int maxscf;
  481. if (c->v->feature & Ultra2)
  482. maxscf = NULTRA2SCF;
  483. else if (c->v->feature & Ultra)
  484. maxscf = NULTRASCF;
  485. else
  486. maxscf = NSCF;
  487. /*
  488. * for chips with no clock doubler, but Ultra capable (e.g. 860, or interestingly the
  489. * first spin of the 875), assume 80MHz
  490. * otherwise use the internal (33 Mhz) or external (40MHz) default
  491. */
  492. if ((c->v->feature & Ultra) != 0 && (c->v->feature & (ClockDouble | ClockQuad)) == 0)
  493. c->sclk = ULTRA_NOCLOCKDOUBLE_SCLK;
  494. else
  495. c->sclk = SCLK;
  496. /*
  497. * otherwise, if the chip is Ultra capable, but has a slow(ish) clock,
  498. * invoke the doubler
  499. */
  500. if (SCLK <= 40000000) {
  501. if (c->v->feature & ClockDouble) {
  502. c->sclk *= 2;
  503. c->clockmult = 1;
  504. }
  505. else if (c->v->feature & ClockQuad) {
  506. c->sclk *= 4;
  507. c->clockmult = 1;
  508. }
  509. else
  510. c->clockmult = 0;
  511. }
  512. else
  513. c->clockmult = 0;
  514. /* derive CCF from sclk */
  515. /* woebetide anyone with SCLK < 16.7 or > 80MHz */
  516. if (c->sclk <= 25 * MEGA)
  517. c->ccf = 1;
  518. else if (c->sclk <= 3750000)
  519. c->ccf = 2;
  520. else if (c->sclk <= 50 * MEGA)
  521. c->ccf = 3;
  522. else if (c->sclk <= 75 * MEGA)
  523. c->ccf = 4;
  524. else if ((c->v->feature & ClockDouble) && c->sclk <= 80 * MEGA)
  525. c->ccf = 5;
  526. else if ((c->v->feature & ClockQuad) && c->sclk <= 120 * MEGA)
  527. c->ccf = 6;
  528. else if ((c->v->feature & ClockQuad) && c->sclk <= 160 * MEGA)
  529. c->ccf = 7;
  530. for (scf = 1; scf < maxscf; scf++) {
  531. /* check for legal core rate */
  532. /* round up so we run slower for safety */
  533. cr = (c->sclk * 2 + cf2[scf] - 1) / cf2[scf];
  534. if (cr <= MAXSYNCCORERATE) {
  535. scsilimit = MAXSYNCSCSIRATE;
  536. fast = 0;
  537. }
  538. else if (cr <= MAXFASTSYNCCORERATE) {
  539. scsilimit = MAXFASTSYNCSCSIRATE;
  540. fast = 1;
  541. }
  542. else if ((c->v->feature & Ultra) && cr <= MAXULTRASYNCCORERATE) {
  543. scsilimit = MAXULTRASYNCSCSIRATE;
  544. fast = 2;
  545. }
  546. else if ((c->v->feature & Ultra2) && cr <= MAXULTRA2SYNCCORERATE) {
  547. scsilimit = MAXULTRA2SYNCSCSIRATE;
  548. fast = 3;
  549. }
  550. else
  551. continue;
  552. for (xferp = 11; xferp >= 4; xferp--) {
  553. int ok;
  554. int tp;
  555. /* calculate scsi rate - round up again */
  556. /* start from sclk for accuracy */
  557. int totaldivide = xferp * cf2[scf];
  558. sr = (c->sclk * 2 + totaldivide - 1) / totaldivide;
  559. if (sr > scsilimit)
  560. break;
  561. /*
  562. * now work out transfer period
  563. * round down now so that period is pessimistic
  564. */
  565. tp = (MEGA * 1000) / sr;
  566. /*
  567. * bounds check it
  568. */
  569. if (tp < 25 || tp > 255 * 4)
  570. continue;
  571. /*
  572. * spot stupid special case for Ultra or Ultra2
  573. * while working out factor
  574. */
  575. if (tp == 25)
  576. tpf = 10;
  577. else if (tp == 50)
  578. tpf = 12;
  579. else if (tp < 52)
  580. continue;
  581. else
  582. tpf = tp / 4;
  583. /*
  584. * now check tpf looks sensible
  585. * given core rate
  586. */
  587. switch (fast) {
  588. case 0:
  589. /* scf must be ccf for SCSI 1 */
  590. ok = tpf >= 50 && scf == c->ccf;
  591. break;
  592. case 1:
  593. ok = tpf >= 25 && tpf < 50;
  594. break;
  595. case 2:
  596. /*
  597. * must use xferp of 4, or 5 at a pinch
  598. * for an Ultra transfer
  599. */
  600. ok = xferp <= 5 && tpf >= 12 && tpf < 25;
  601. break;
  602. case 3:
  603. ok = xferp == 4 && (tpf == 10 || tpf == 11);
  604. break;
  605. default:
  606. ok = 0;
  607. }
  608. if (!ok)
  609. continue;
  610. c->synctab[scf - 1][xferp - 4] = tpf;
  611. }
  612. }
  613. #ifndef NO_ULTRA2
  614. if (c->v->feature & Ultra2)
  615. tpf = 10;
  616. else
  617. #endif
  618. if (c->v->feature & Ultra)
  619. tpf = 12;
  620. else
  621. tpf = 25;
  622. for (; tpf < 256; tpf++) {
  623. if (chooserate(c, tpf, &scf, &xferp) == tpf) {
  624. unsigned tp = tpf == 10 ? 25 : (tpf == 12 ? 50 : tpf * 4);
  625. unsigned long khz = (MEGA + tp - 1) / (tp);
  626. KPRINT(PRINTPREFIX "tpf=%d scf=%d.%.1d xferp=%d mhz=%ld.%.3ld\n",
  627. tpf, cf2[scf] / 2, (cf2[scf] & 1) ? 5 : 0,
  628. xferp + 4, khz / 1000, khz % 1000);
  629. USED(khz);
  630. if (c->tpf == 0)
  631. c->tpf = tpf; /* note lowest value for controller */
  632. }
  633. }
  634. }
  635. static void
  636. synctodsa(Dsa *dsa, Controller *c)
  637. {
  638. /*
  639. KPRINT("synctodsa(dsa=%lux, target=%d, scntl3=%.2lx sxfer=%.2x)\n",
  640. dsa, dsa->target, c->scntl3[dsa->target], c->sxfer[dsa->target]);
  641. */
  642. dsa->scntl3 = c->scntl3[dsa->target];
  643. dsa->sxfer = c->sxfer[dsa->target];
  644. }
  645. static void
  646. setsync(Dsa *dsa, Controller *c, int target, uchar ultra, uchar scf, uchar xferp, uchar reqack)
  647. {
  648. c->scntl3[target] =
  649. (c->scntl3[target] & 0x08) | (((scf << 4) | c->ccf | (ultra << 7)) & ~0x08);
  650. c->sxfer[target] = (xferp << 5) | reqack;
  651. c->s[target] = BothDone;
  652. if (dsa) {
  653. synctodsa(dsa, c);
  654. c->n->scntl3 = c->scntl3[target];
  655. c->n->sxfer = c->sxfer[target];
  656. }
  657. }
  658. static void
  659. setasync(Dsa *dsa, Controller *c, int target)
  660. {
  661. setsync(dsa, c, target, 0, c->ccf, 0, 0);
  662. }
  663. static void
  664. setwide(Dsa *dsa, Controller *c, int target, uchar wide)
  665. {
  666. c->scntl3[target] = wide ? (1 << 3) : 0;
  667. setasync(dsa, c, target);
  668. c->s[target] = WideDone;
  669. }
  670. static int
  671. buildsdtrmsg(uchar *buf, uchar tpf, uchar offset)
  672. {
  673. *buf++ = X_MSG;
  674. *buf++ = 3;
  675. *buf++ = X_MSG_SDTR;
  676. *buf++ = tpf;
  677. *buf = offset;
  678. return 5;
  679. }
  680. static int
  681. buildwdtrmsg(uchar *buf, uchar expo)
  682. {
  683. *buf++ = X_MSG;
  684. *buf++ = 2;
  685. *buf++ = X_MSG_WDTR;
  686. *buf = expo;
  687. return 4;
  688. }
  689. static void
  690. start(Controller *c, long entry)
  691. {
  692. ulong p;
  693. if (c->running)
  694. panic(PRINTPREFIX "start called while running");
  695. c->running = 1;
  696. p = c->scriptpa + entry;
  697. lesetl(c->n->dsp, p);
  698. if (c->ssm)
  699. c->n->dcntl |= 0x4; /* start DMA in SSI mode */
  700. }
  701. static void
  702. ncrcontinue(Controller *c)
  703. {
  704. if (c->running)
  705. panic(PRINTPREFIX "ncrcontinue called while running");
  706. /* set the start DMA bit to continue execution */
  707. c->running = 1;
  708. c->n->dcntl |= 0x4;
  709. }
  710. static void
  711. softreset(Controller *c)
  712. {
  713. Ncr *n = c->n;
  714. n->istat = Srst; /* software reset */
  715. n->istat = 0;
  716. /* general initialisation */
  717. n->scid = (1 << 6) | 7; /* respond to reselect, ID 7 */
  718. n->respid = 1 << 7; /* response ID = 7 */
  719. #ifdef INTERNAL_SCLK
  720. n->stest1 = 0x80; /* disable external scsi clock */
  721. #else
  722. n->stest1 = 0x00;
  723. #endif
  724. n->stime0 = 0xdd; /* about 0.5 second timeout on each device */
  725. n->scntl0 |= 0x8; /* Enable parity checking */
  726. /* continued setup */
  727. n->sien0 = 0x8f;
  728. n->sien1 = 0x04;
  729. n->dien = 0x7d;
  730. n->stest3 = 0x80; /* TolerANT enable */
  731. c->running = 0;
  732. if (c->v->feature & BigFifo)
  733. n->ctest5 = (1 << 5);
  734. n->dmode = c->v->burst << 6; /* set burst length bits */
  735. if (c->v->burst & 4)
  736. n->ctest5 |= (1 << 2); /* including overflow into ctest5 bit 2 */
  737. if (c->v->feature & Prefetch)
  738. n->dcntl |= (1 << 5); /* prefetch enable */
  739. else if (c->v->feature & BurstOpCodeFetch)
  740. n->dmode |= (1 << 1); /* burst opcode fetch */
  741. if (c->v->feature & Differential) {
  742. /* chip capable */
  743. if ((c->feature & Differential) || bios_set_differential(c)) {
  744. /* user enabled, or some evidence bios set differential */
  745. if (n->sstat2 & (1 << 2))
  746. print(PRINTPREFIX "can't go differential; wrong cable\n");
  747. else {
  748. n->stest2 = (1 << 5);
  749. print(PRINTPREFIX "differential mode set\n");
  750. }
  751. }
  752. }
  753. if (c->clockmult) {
  754. n->stest1 |= (1 << 3); /* power up doubler */
  755. delay(2);
  756. n->stest3 |= (1 << 5); /* stop clock */
  757. n->stest1 |= (1 << 2); /* enable doubler */
  758. n->stest3 &= ~(1 << 5); /* start clock */
  759. /* pray */
  760. }
  761. }
  762. static void
  763. msgsm(Dsa *dsa, Controller *c, int msg, int *cont, int *wakeme)
  764. {
  765. uchar histpf, hisreqack;
  766. int tpf;
  767. int scf, xferp;
  768. int len;
  769. Ncr *n = c->n;
  770. switch (c->s[dsa->target]) {
  771. case SyncInit:
  772. switch (msg) {
  773. case A_SIR_MSG_SDTR:
  774. /* reply to my SDTR */
  775. histpf = n->scratcha[2];
  776. hisreqack = n->scratcha[3];
  777. KPRINT(PRINTPREFIX "%d: SDTN response %d %d\n",
  778. dsa->target, histpf, hisreqack);
  779. if (hisreqack == 0)
  780. setasync(dsa, c, dsa->target);
  781. else {
  782. /* hisreqack should be <= c->v->maxsyncoff */
  783. tpf = chooserate(c, histpf, &scf, &xferp);
  784. KPRINT(PRINTPREFIX "%d: SDTN: using %d %d\n",
  785. dsa->target, tpf, hisreqack);
  786. setsync(dsa, c, dsa->target, tpf < 25, scf, xferp, hisreqack);
  787. }
  788. *cont = -2;
  789. return;
  790. case A_SIR_EV_PHASE_SWITCH_AFTER_ID:
  791. /* target ignored ATN for message after IDENTIFY - not SCSI-II */
  792. KPRINT(PRINTPREFIX "%d: illegal phase switch after ID message - SCSI-1 device?\n", dsa->target);
  793. KPRINT(PRINTPREFIX "%d: SDTN: async\n", dsa->target);
  794. setasync(dsa, c, dsa->target);
  795. *cont = E_to_decisions;
  796. return;
  797. case A_SIR_MSG_REJECT:
  798. /* rejection of my SDTR */
  799. KPRINT(PRINTPREFIX "%d: SDTN: rejected SDTR\n", dsa->target);
  800. //async:
  801. KPRINT(PRINTPREFIX "%d: SDTN: async\n", dsa->target);
  802. setasync(dsa, c, dsa->target);
  803. *cont = -2;
  804. return;
  805. }
  806. break;
  807. case WideInit:
  808. switch (msg) {
  809. case A_SIR_MSG_WDTR:
  810. /* reply to my WDTR */
  811. KPRINT(PRINTPREFIX "%d: WDTN: response %d\n",
  812. dsa->target, n->scratcha[2]);
  813. setwide(dsa, c, dsa->target, n->scratcha[2]);
  814. *cont = -2;
  815. return;
  816. case A_SIR_EV_PHASE_SWITCH_AFTER_ID:
  817. /* target ignored ATN for message after IDENTIFY - not SCSI-II */
  818. KPRINT(PRINTPREFIX "%d: illegal phase switch after ID message - SCSI-1 device?\n", dsa->target);
  819. setwide(dsa, c, dsa->target, 0);
  820. *cont = E_to_decisions;
  821. return;
  822. case A_SIR_MSG_REJECT:
  823. /* rejection of my SDTR */
  824. KPRINT(PRINTPREFIX "%d: WDTN: rejected WDTR\n", dsa->target);
  825. setwide(dsa, c, dsa->target, 0);
  826. *cont = -2;
  827. return;
  828. }
  829. break;
  830. case NeitherDone:
  831. case WideDone:
  832. case BothDone:
  833. switch (msg) {
  834. case A_SIR_MSG_WDTR: {
  835. uchar hiswide, mywide;
  836. hiswide = n->scratcha[2];
  837. mywide = (c->v->feature & Wide) != 0;
  838. KPRINT(PRINTPREFIX "%d: WDTN: target init %d\n",
  839. dsa->target, hiswide);
  840. if (hiswide < mywide)
  841. mywide = hiswide;
  842. KPRINT(PRINTPREFIX "%d: WDTN: responding %d\n",
  843. dsa->target, mywide);
  844. setwide(dsa, c, dsa->target, mywide);
  845. len = buildwdtrmsg(dsa->msg_out, mywide);
  846. setmovedata(&dsa->msg_out_buf, DMASEG(dsa->msg_out), len);
  847. *cont = E_response;
  848. c->s[dsa->target] = WideResponse;
  849. return;
  850. }
  851. case A_SIR_MSG_SDTR:
  852. #ifdef ASYNC_ONLY
  853. *cont = E_reject;
  854. return;
  855. #else
  856. /* target decides to renegotiate */
  857. histpf = n->scratcha[2];
  858. hisreqack = n->scratcha[3];
  859. KPRINT(PRINTPREFIX "%d: SDTN: target init %d %d\n",
  860. dsa->target, histpf, hisreqack);
  861. if (hisreqack == 0) {
  862. /* he wants asynchronous */
  863. setasync(dsa, c, dsa->target);
  864. tpf = 0;
  865. }
  866. else {
  867. /* he wants synchronous */
  868. tpf = chooserate(c, histpf, &scf, &xferp);
  869. if (hisreqack > c->v->maxsyncoff)
  870. hisreqack = c->v->maxsyncoff;
  871. KPRINT(PRINTPREFIX "%d: using %d %d\n",
  872. dsa->target, tpf, hisreqack);
  873. setsync(dsa, c, dsa->target, tpf < 25, scf, xferp, hisreqack);
  874. }
  875. /* build my SDTR message */
  876. len = buildsdtrmsg(dsa->msg_out, tpf, hisreqack);
  877. setmovedata(&dsa->msg_out_buf, DMASEG(dsa->msg_out), len);
  878. *cont = E_response;
  879. c->s[dsa->target] = SyncResponse;
  880. return;
  881. #endif
  882. }
  883. break;
  884. case WideResponse:
  885. switch (msg) {
  886. case A_SIR_EV_RESPONSE_OK:
  887. c->s[dsa->target] = WideDone;
  888. KPRINT(PRINTPREFIX "%d: WDTN: response accepted\n", dsa->target);
  889. *cont = -2;
  890. return;
  891. case A_SIR_MSG_REJECT:
  892. setwide(dsa, c, dsa->target, 0);
  893. KPRINT(PRINTPREFIX "%d: WDTN: response REJECTed\n", dsa->target);
  894. *cont = -2;
  895. return;
  896. }
  897. break;
  898. case SyncResponse:
  899. switch (msg) {
  900. case A_SIR_EV_RESPONSE_OK:
  901. c->s[dsa->target] = BothDone;
  902. KPRINT(PRINTPREFIX "%d: SDTN: response accepted (%s)\n",
  903. dsa->target, phase[n->sstat1 & 7]);
  904. *cont = -2;
  905. return; /* chf */
  906. case A_SIR_MSG_REJECT:
  907. setasync(dsa, c, dsa->target);
  908. KPRINT(PRINTPREFIX "%d: SDTN: response REJECTed\n", dsa->target);
  909. *cont = -2;
  910. return;
  911. }
  912. break;
  913. }
  914. KPRINT(PRINTPREFIX "%d: msgsm: state %d msg %d\n",
  915. dsa->target, c->s[dsa->target], msg);
  916. *wakeme = 1;
  917. return;
  918. }
  919. static void
  920. calcblockdma(Dsa *d, ulong base, ulong count)
  921. {
  922. ulong blocks;
  923. if (DEBUG(3))
  924. blocks = 0;
  925. else {
  926. blocks = count / A_BSIZE;
  927. if (blocks > 255)
  928. blocks = 255;
  929. }
  930. d->dmablks = blocks;
  931. d->dmaaddr[0] = base;
  932. d->dmaaddr[1] = base >> 8;
  933. d->dmaaddr[2] = base >> 16;
  934. d->dmaaddr[3] = base >> 24;
  935. setmovedata(&d->data_buf, base + blocks * A_BSIZE, count - blocks * A_BSIZE);
  936. if (legetl(d->data_buf.dbc) == 0)
  937. d->flag = 1;
  938. }
  939. static ulong
  940. read_mismatch_recover(Controller *c, Ncr *n, Dsa *dsa)
  941. {
  942. ulong dbc;
  943. uchar dfifo = n->dfifo;
  944. int inchip;
  945. dbc = (n->dbc[2]<<16)|(n->dbc[1]<<8)|n->dbc[0];
  946. if (n->ctest5 & (1 << 5))
  947. inchip = ((dfifo | ((n->ctest5 & 3) << 8)) - (dbc & 0x3ff)) & 0x3ff;
  948. else
  949. inchip = ((dfifo & 0x7f) - (dbc & 0x7f)) & 0x7f;
  950. if (inchip) {
  951. IPRINT(PRINTPREFIX "%d/%d: read_mismatch_recover: DMA FIFO = %d\n",
  952. dsa->target, dsa->lun, inchip);
  953. }
  954. if (n->sxfer & SYNCOFFMASK(c)) {
  955. /* SCSI FIFO */
  956. uchar fifo = n->sstat1 >> 4;
  957. if (c->v->maxsyncoff > 8)
  958. fifo |= (n->sstat2 & (1 << 4));
  959. if (fifo) {
  960. inchip += fifo;
  961. IPRINT(PRINTPREFIX "%d/%d: read_mismatch_recover: SCSI FIFO = %d\n",
  962. dsa->target, dsa->lun, fifo);
  963. }
  964. }
  965. else {
  966. if (n->sstat0 & (1 << 7)) {
  967. inchip++;
  968. IPRINT(PRINTPREFIX "%d/%d: read_mismatch_recover: SIDL full\n",
  969. dsa->target, dsa->lun);
  970. }
  971. if (n->sstat2 & (1 << 7)) {
  972. inchip++;
  973. IPRINT(PRINTPREFIX "%d/%d: read_mismatch_recover: SIDL msb full\n",
  974. dsa->target, dsa->lun);
  975. }
  976. }
  977. USED(inchip);
  978. return dbc;
  979. }
  980. static ulong
  981. write_mismatch_recover(Controller *c, Ncr *n, Dsa *dsa)
  982. {
  983. ulong dbc;
  984. uchar dfifo = n->dfifo;
  985. int inchip;
  986. dbc = (n->dbc[2]<<16)|(n->dbc[1]<<8)|n->dbc[0];
  987. USED(dsa);
  988. if (n->ctest5 & (1 << 5))
  989. inchip = ((dfifo | ((n->ctest5 & 3) << 8)) - (dbc & 0x3ff)) & 0x3ff;
  990. else
  991. inchip = ((dfifo & 0x7f) - (dbc & 0x7f)) & 0x7f;
  992. #ifdef WMR_DEBUG
  993. if (inchip) {
  994. IPRINT(PRINTPREFIX "%d/%d: write_mismatch_recover: DMA FIFO = %d\n",
  995. dsa->target, dsa->lun, inchip);
  996. }
  997. #endif
  998. if (n->sstat0 & (1 << 5)) {
  999. inchip++;
  1000. #ifdef WMR_DEBUG
  1001. IPRINT(PRINTPREFIX "%d/%d: write_mismatch_recover: SODL full\n", dsa->target, dsa->lun);
  1002. #endif
  1003. }
  1004. if (n->sstat2 & (1 << 5)) {
  1005. inchip++;
  1006. #ifdef WMR_DEBUG
  1007. IPRINT(PRINTPREFIX "%d/%d: write_mismatch_recover: SODL msb full\n", dsa->target, dsa->lun);
  1008. #endif
  1009. }
  1010. if (n->sxfer & SYNCOFFMASK(c)) {
  1011. /* synchronous SODR */
  1012. if (n->sstat0 & (1 << 6)) {
  1013. inchip++;
  1014. #ifdef WMR_DEBUG
  1015. IPRINT(PRINTPREFIX "%d/%d: write_mismatch_recover: SODR full\n",
  1016. dsa->target, dsa->lun);
  1017. #endif
  1018. }
  1019. if (n->sstat2 & (1 << 6)) {
  1020. inchip++;
  1021. #ifdef WMR_DEBUG
  1022. IPRINT(PRINTPREFIX "%d/%d: write_mismatch_recover: SODR msb full\n",
  1023. dsa->target, dsa->lun);
  1024. #endif
  1025. }
  1026. }
  1027. /* clear the dma fifo */
  1028. n->ctest3 |= (1 << 2);
  1029. /* wait till done */
  1030. while ((n->dstat & Dfe) == 0)
  1031. ;
  1032. return dbc + inchip;
  1033. }
  1034. static void
  1035. interrupt(Ureg *ur, void *a)
  1036. {
  1037. uchar istat;
  1038. ushort sist;
  1039. uchar dstat;
  1040. int wakeme = 0;
  1041. int cont = -1;
  1042. Dsa *dsa;
  1043. Controller *c = a;
  1044. Ncr *n = c->n;
  1045. USED(ur);
  1046. if (DEBUG(1))
  1047. IPRINT(PRINTPREFIX "int\n");
  1048. ilock(c);
  1049. istat = n->istat;
  1050. if (istat & Intf) {
  1051. Dsa *d;
  1052. int wokesomething = 0;
  1053. if (DEBUG(1))
  1054. IPRINT(PRINTPREFIX "Intfly\n");
  1055. n->istat = Intf;
  1056. /* search for structures in A_STATE_DONE */
  1057. for (d = KPTR(legetl(c->dsalist.head)); d; d = KPTR(legetl(d->next))) {
  1058. if (d->stateb == A_STATE_DONE) {
  1059. d->p9status = STATUS_COMPLETE | d->status;
  1060. if (DEBUG(1))
  1061. IPRINT(PRINTPREFIX "waking up dsa %lux\n", (ulong)d);
  1062. wakeup(d);
  1063. wokesomething = 1;
  1064. }
  1065. }
  1066. if (!wokesomething)
  1067. IPRINT(PRINTPREFIX "nothing to wake up\n");
  1068. }
  1069. if ((istat & (Sip | Dip)) == 0) {
  1070. if (DEBUG(1))
  1071. IPRINT(PRINTPREFIX "int end %x\n", istat);
  1072. iunlock(c);
  1073. return;
  1074. }
  1075. sist = (n->sist1<<8)|n->sist0; /* BUG? can two-byte read be inconsistent? */
  1076. dstat = n->dstat;
  1077. dsa = (Dsa *)DMASEG_TO_KADDR(legetl(n->dsa));
  1078. c->running = 0;
  1079. if (istat & Sip) {
  1080. if (DEBUG(1))
  1081. IPRINT("sist = %.4x\n", sist);
  1082. if (sist & 0x80) {
  1083. ulong addr;
  1084. ulong sa;
  1085. ulong dbc;
  1086. ulong tbc;
  1087. int dmablks;
  1088. ulong dmaaddr;
  1089. addr = legetl(n->dsp);
  1090. sa = addr - c->scriptpa;
  1091. if (DEBUG(1) || DEBUG(2))
  1092. IPRINT(PRINTPREFIX "%d/%d: Phase Mismatch sa=%.8lux\n",
  1093. dsa->target, dsa->lun, sa);
  1094. /*
  1095. * now recover
  1096. */
  1097. if (sa == E_data_in_mismatch) {
  1098. dbc = read_mismatch_recover(c, n, dsa);
  1099. tbc = legetl(dsa->data_buf.dbc) - dbc;
  1100. advancedata(&dsa->data_buf, tbc);
  1101. if (DEBUG(1) || DEBUG(2))
  1102. IPRINT(PRINTPREFIX "%d/%d: transferred = %ld residue = %ld\n",
  1103. dsa->target, dsa->lun, tbc, legetl(dsa->data_buf.dbc));
  1104. cont = E_to_decisions;
  1105. }
  1106. else if (sa == E_data_in_block_mismatch) {
  1107. dbc = read_mismatch_recover(c, n, dsa);
  1108. tbc = A_BSIZE - dbc;
  1109. /* recover current state from registers */
  1110. dmablks = n->scratcha[2];
  1111. dmaaddr = legetl(n->scratchb);
  1112. /* we have got to dmaaddr + tbc */
  1113. /* we have dmablks * A_BSIZE - tbc + residue left to do */
  1114. /* so remaining transfer is */
  1115. IPRINT("in_block_mismatch: dmaaddr = 0x%lux tbc=%lud dmablks=%d\n",
  1116. dmaaddr, tbc, dmablks);
  1117. calcblockdma(dsa, dmaaddr + tbc,
  1118. dmablks * A_BSIZE - tbc + legetl(dsa->data_buf.dbc));
  1119. /* copy changes into scratch registers */
  1120. IPRINT("recalc: dmablks %d dmaaddr 0x%lx pa 0x%lx dbc %ld\n",
  1121. dsa->dmablks, legetl(dsa->dmaaddr),
  1122. legetl(dsa->data_buf.pa), legetl(dsa->data_buf.dbc));
  1123. n->scratcha[2] = dsa->dmablks;
  1124. lesetl(n->scratchb, dsa->dmancr);
  1125. cont = E_data_block_mismatch_recover;
  1126. }
  1127. else if (sa == E_data_out_mismatch) {
  1128. dbc = write_mismatch_recover(c, n, dsa);
  1129. tbc = legetl(dsa->data_buf.dbc) - dbc;
  1130. advancedata(&dsa->data_buf, tbc);
  1131. if (DEBUG(1) || DEBUG(2))
  1132. IPRINT(PRINTPREFIX "%d/%d: transferred = %ld residue = %ld\n",
  1133. dsa->target, dsa->lun, tbc, legetl(dsa->data_buf.dbc));
  1134. cont = E_to_decisions;
  1135. }
  1136. else if (sa == E_data_out_block_mismatch) {
  1137. dbc = write_mismatch_recover(c, n, dsa);
  1138. tbc = legetl(dsa->data_buf.dbc) - dbc;
  1139. /* recover current state from registers */
  1140. dmablks = n->scratcha[2];
  1141. dmaaddr = legetl(n->scratchb);
  1142. /* we have got to dmaaddr + tbc */
  1143. /* we have dmablks blocks - tbc + residue left to do */
  1144. /* so remaining transfer is */
  1145. IPRINT("out_block_mismatch: dmaaddr = %lux tbc=%lud dmablks=%d\n",
  1146. dmaaddr, tbc, dmablks);
  1147. calcblockdma(dsa, dmaaddr + tbc,
  1148. dmablks * A_BSIZE - tbc + legetl(dsa->data_buf.dbc));
  1149. /* copy changes into scratch registers */
  1150. n->scratcha[2] = dsa->dmablks;
  1151. lesetl(n->scratchb, dsa->dmancr);
  1152. cont = E_data_block_mismatch_recover;
  1153. }
  1154. else if (sa == E_id_out_mismatch) {
  1155. /*
  1156. * target switched phases while attention held during
  1157. * message out. The possibilities are:
  1158. * 1. It didn't like the last message. This is indicated
  1159. * by the new phase being message_in. Use script to recover
  1160. *
  1161. * 2. It's not SCSI-II compliant. The new phase will be other
  1162. * than message_in. We should also indicate that the device
  1163. * is asynchronous, if it's the SDTR that got ignored
  1164. *
  1165. * For now, if the phase switch is not to message_in, and
  1166. * and it happens after IDENTIFY and before SDTR, we
  1167. * notify the negotiation state machine.
  1168. */
  1169. ulong lim = legetl(dsa->msg_out_buf.dbc);
  1170. uchar p = n->sstat1 & 7;
  1171. dbc = write_mismatch_recover(c, n, dsa);
  1172. tbc = lim - dbc;
  1173. IPRINT(PRINTPREFIX "%d/%d: msg_out_mismatch: %lud/%lud sent, phase %s\n",
  1174. dsa->target, dsa->lun, tbc, lim, phase[p]);
  1175. if (p != MessageIn && tbc == 1) {
  1176. msgsm(dsa, c, A_SIR_EV_PHASE_SWITCH_AFTER_ID, &cont, &wakeme);
  1177. }
  1178. else
  1179. cont = E_id_out_mismatch_recover;
  1180. }
  1181. else if (sa == E_cmd_out_mismatch) {
  1182. /*
  1183. * probably the command count is longer than the device wants ...
  1184. */
  1185. ulong lim = legetl(dsa->cmd_buf.dbc);
  1186. uchar p = n->sstat1 & 7;
  1187. dbc = write_mismatch_recover(c, n, dsa);
  1188. tbc = lim - dbc;
  1189. IPRINT(PRINTPREFIX "%d/%d: cmd_out_mismatch: %lud/%lud sent, phase %s\n",
  1190. dsa->target, dsa->lun, tbc, lim, phase[p]);
  1191. USED(p, tbc);
  1192. cont = E_to_decisions;
  1193. }
  1194. else {
  1195. IPRINT(PRINTPREFIX "%d/%d: ma sa=%.8lux wanted=%s got=%s\n",
  1196. dsa->target, dsa->lun, sa,
  1197. phase[n->dcmd & 7],
  1198. phase[n->sstat1 & 7]);
  1199. dumpncrregs(c, 1);
  1200. dsa->p9status = STATUS_FAIL; /* chf */
  1201. wakeme = 1;
  1202. }
  1203. }
  1204. /*else*/ if (sist & 0x400) {
  1205. if (DEBUG(0))
  1206. IPRINT(PRINTPREFIX "%d/%d Sto\n", dsa->target, dsa->lun);
  1207. dsa->p9status = STATUS_SELECTION_TIMEOUT;
  1208. dsa->stateb = A_STATE_DONE;
  1209. softreset(c);
  1210. cont = E_issue_check;
  1211. wakeme = 1;
  1212. }
  1213. if (sist & 0x1) {
  1214. IPRINT(PRINTPREFIX "%d/%d: parity error\n", dsa->target, dsa->lun);
  1215. dsa->parityerror = 1;
  1216. }
  1217. if (sist & 0x4) {
  1218. IPRINT(PRINTPREFIX "%d/%d: unexpected disconnect\n",
  1219. dsa->target, dsa->lun);
  1220. dumpncrregs(c, 1);
  1221. //wakeme = 1;
  1222. dsa->p9status = STATUS_FAIL;
  1223. }
  1224. }
  1225. if (istat & Dip) {
  1226. if (DEBUG(1))
  1227. IPRINT("dstat = %.2x\n", dstat);
  1228. /*else*/ if (dstat & Ssi) {
  1229. ulong *p = DMASEG_TO_KADDR(legetl(n->dsp));
  1230. ulong w = (uchar *)p - (uchar *)c->script;
  1231. IPRINT("[%lux]", w);
  1232. USED(w);
  1233. cont = -2; /* restart */
  1234. }
  1235. if (dstat & Sir) {
  1236. switch (legetl(n->dsps)) {
  1237. case A_SIR_MSG_IO_COMPLETE:
  1238. dsa->p9status = STATUS_COMPLETE | dsa->status;
  1239. wakeme = 1;
  1240. break;
  1241. case A_SIR_MSG_SDTR:
  1242. case A_SIR_MSG_WDTR:
  1243. case A_SIR_MSG_REJECT:
  1244. case A_SIR_EV_RESPONSE_OK:
  1245. msgsm(dsa, c, legetl(n->dsps), &cont, &wakeme);
  1246. break;
  1247. case A_SIR_MSG_IGNORE_WIDE_RESIDUE:
  1248. /* back up one in the data transfer */
  1249. IPRINT(PRINTPREFIX "%d/%d: ignore wide residue %d, WSR = %d\n",
  1250. dsa->target, dsa->lun, n->scratcha[1], n->scntl2 & 1);
  1251. if (dsa->dmablks == 0 && dsa->flag)
  1252. IPRINT(PRINTPREFIX "%d/%d: transfer over; residue ignored\n",
  1253. dsa->target, dsa->lun);
  1254. else
  1255. calcblockdma(dsa, legetl(dsa->dmaaddr) - 1,
  1256. dsa->dmablks * A_BSIZE + legetl(dsa->data_buf.dbc) + 1);
  1257. cont = -2;
  1258. break;
  1259. case A_SIR_ERROR_NOT_MSG_IN_AFTER_RESELECT:
  1260. IPRINT(PRINTPREFIX "%d: not msg_in after reselect (%s)",
  1261. n->ssid & SSIDMASK(c), phase[n->sstat1 & 7]);
  1262. dsa = dsafind(c, n->ssid & SSIDMASK(c), -1, A_STATE_DISCONNECTED);
  1263. dumpncrregs(c, 1);
  1264. wakeme = 1;
  1265. break;
  1266. case A_SIR_NOTIFY_MSG_IN:
  1267. IPRINT(PRINTPREFIX "%d/%d: msg_in %d\n",
  1268. dsa->target, dsa->lun, n->sfbr);
  1269. cont = -2;
  1270. break;
  1271. case A_SIR_NOTIFY_DISC:
  1272. IPRINT(PRINTPREFIX "%d/%d: disconnect:", dsa->target, dsa->lun);
  1273. goto dsadump;
  1274. case A_SIR_NOTIFY_STATUS:
  1275. IPRINT(PRINTPREFIX "%d/%d: status\n", dsa->target, dsa->lun);
  1276. cont = -2;
  1277. break;
  1278. case A_SIR_NOTIFY_COMMAND:
  1279. IPRINT(PRINTPREFIX "%d/%d: commands\n", dsa->target, dsa->lun);
  1280. cont = -2;
  1281. break;
  1282. case A_SIR_NOTIFY_DATA_IN:
  1283. IPRINT(PRINTPREFIX "%d/%d: data in a %lx b %lx\n",
  1284. dsa->target, dsa->lun, legetl(n->scratcha), legetl(n->scratchb));
  1285. cont = -2;
  1286. break;
  1287. case A_SIR_NOTIFY_BLOCK_DATA_IN:
  1288. IPRINT(PRINTPREFIX "%d/%d: block data in: a2 %x b %lx\n",
  1289. dsa->target, dsa->lun, n->scratcha[2], legetl(n->scratchb));
  1290. cont = -2;
  1291. break;
  1292. case A_SIR_NOTIFY_DATA_OUT:
  1293. IPRINT(PRINTPREFIX "%d/%d: data out\n", dsa->target, dsa->lun);
  1294. cont = -2;
  1295. break;
  1296. case A_SIR_NOTIFY_DUMP:
  1297. IPRINT(PRINTPREFIX "%d/%d: dump\n", dsa->target, dsa->lun);
  1298. dumpncrregs(c, 1);
  1299. cont = -2;
  1300. break;
  1301. case A_SIR_NOTIFY_DUMP2:
  1302. IPRINT(PRINTPREFIX "%d/%d: dump2:", dsa->target, dsa->lun);
  1303. IPRINT(" sa %lux", legetl(n->dsp) - c->scriptpa);
  1304. IPRINT(" dsa %lux", legetl(n->dsa));
  1305. IPRINT(" sfbr %ux", n->sfbr);
  1306. IPRINT(" a %lux", legetl(n->scratcha));
  1307. IPRINT(" b %lux", legetl(n->scratchb));
  1308. IPRINT(" ssid %ux", n->ssid);
  1309. IPRINT("\n");
  1310. cont = -2;
  1311. break;
  1312. case A_SIR_NOTIFY_WAIT_RESELECT:
  1313. IPRINT(PRINTPREFIX "wait reselect\n");
  1314. cont = -2;
  1315. break;
  1316. case A_SIR_NOTIFY_RESELECT:
  1317. IPRINT(PRINTPREFIX "reselect: ssid %.2x sfbr %.2x at %ld\n",
  1318. n->ssid, n->sfbr, TK2MS(m->ticks));
  1319. cont = -2;
  1320. break;
  1321. case A_SIR_NOTIFY_ISSUE:
  1322. IPRINT(PRINTPREFIX "%d/%d: issue:", dsa->target, dsa->lun);
  1323. dsadump:
  1324. IPRINT(" tgt=%d", dsa->target);
  1325. IPRINT(" time=%ld", TK2MS(m->ticks));
  1326. IPRINT("\n");
  1327. cont = -2;
  1328. break;
  1329. case A_SIR_NOTIFY_ISSUE_CHECK:
  1330. IPRINT(PRINTPREFIX "issue check\n");
  1331. cont = -2;
  1332. break;
  1333. case A_SIR_NOTIFY_SIGP:
  1334. IPRINT(PRINTPREFIX "responded to SIGP\n");
  1335. cont = -2;
  1336. break;
  1337. case A_SIR_NOTIFY_DUMP_NEXT_CODE: {
  1338. ulong *dsp = DMASEG_TO_KADDR(legetl(n->dsp));
  1339. int x;
  1340. IPRINT(PRINTPREFIX "code at %lux", dsp - c->script);
  1341. for (x = 0; x < 6; x++)
  1342. IPRINT(" %.8lux", dsp[x]);
  1343. IPRINT("\n");
  1344. USED(dsp);
  1345. cont = -2;
  1346. break;
  1347. }
  1348. case A_SIR_NOTIFY_WSR:
  1349. IPRINT(PRINTPREFIX "%d/%d: WSR set\n", dsa->target, dsa->lun);
  1350. cont = -2;
  1351. break;
  1352. case A_SIR_NOTIFY_LOAD_SYNC:
  1353. IPRINT(PRINTPREFIX "%d/%d: scntl=%.2x sxfer=%.2x\n",
  1354. dsa->target, dsa->lun, n->scntl3, n->sxfer);
  1355. cont = -2;
  1356. break;
  1357. case A_SIR_NOTIFY_RESELECTED_ON_SELECT:
  1358. IPRINT(PRINTPREFIX "%d/%d: reselected during select\n",
  1359. dsa->target, dsa->lun);
  1360. cont = -2;
  1361. break;
  1362. default:
  1363. IPRINT(PRINTPREFIX "%d/%d: script error %ld\n",
  1364. dsa->target, dsa->lun, legetl(n->dsps));
  1365. dumpncrregs(c, 1);
  1366. wakeme = 1;
  1367. }
  1368. }
  1369. /*else*/ if (dstat & Iid) {
  1370. ulong addr = legetl(n->dsp);
  1371. ulong dbc = (n->dbc[2]<<16)|(n->dbc[1]<<8)|n->dbc[0];
  1372. IPRINT(PRINTPREFIX "%d/%d: Iid pa=%.8lux sa=%.8lux dbc=%lux\n",
  1373. dsa->target, dsa->lun,
  1374. addr, addr - c->scriptpa, dbc);
  1375. addr = (ulong)DMASEG_TO_KADDR(addr);
  1376. IPRINT("%.8lux %.8lux %.8lux\n",
  1377. *(ulong *)(addr - 12), *(ulong *)(addr - 8), *(ulong *)(addr - 4));
  1378. USED(addr, dbc);
  1379. dsa->p9status = STATUS_FAIL;
  1380. wakeme = 1;
  1381. }
  1382. /*else*/ if (dstat & Bf) {
  1383. IPRINT(PRINTPREFIX "%d/%d: Bus Fault\n", dsa->target, dsa->lun);
  1384. dumpncrregs(c, 1);
  1385. dsa->p9status = STATUS_FAIL;
  1386. wakeme = 1;
  1387. }
  1388. }
  1389. if (cont == -2)
  1390. ncrcontinue(c);
  1391. else if (cont >= 0)
  1392. start(c, cont);
  1393. if (wakeme){
  1394. if(dsa->p9status == 0xffff)
  1395. dsa->p9status = STATUS_FAIL;
  1396. wakeup(dsa);
  1397. }
  1398. iunlock(c);
  1399. if (DEBUG(1)) {
  1400. IPRINT(PRINTPREFIX "int end 1\n");
  1401. }
  1402. }
  1403. static int
  1404. done(void *arg)
  1405. {
  1406. return ((Dsa *)arg)->p9status != 0xffff;
  1407. }
  1408. #define offsetof(s, t) ((ulong)&((s *)0)->t)
  1409. static int
  1410. xfunc(Controller *c, enum na_external x, unsigned long *v)
  1411. {
  1412. switch (x) {
  1413. default:
  1414. print("xfunc: can't find external %d\n", x);
  1415. return 0;
  1416. case X_scsi_id_buf:
  1417. *v = offsetof(Dsa, scsi_id_buf[0]);
  1418. break;
  1419. case X_msg_out_buf:
  1420. *v = offsetof(Dsa, msg_out_buf);
  1421. break;
  1422. case X_cmd_buf:
  1423. *v = offsetof(Dsa, cmd_buf);
  1424. break;
  1425. case X_data_buf:
  1426. *v = offsetof(Dsa, data_buf);
  1427. break;
  1428. case X_status_buf:
  1429. *v = offsetof(Dsa, status_buf);
  1430. break;
  1431. case X_dsa_head:
  1432. *v = DMASEG(&c->dsalist.head[0]);
  1433. break;
  1434. }
  1435. return 1;
  1436. }
  1437. static void
  1438. setmovedata(Movedata *d, ulong pa, ulong bc)
  1439. {
  1440. d->pa[0] = pa;
  1441. d->pa[1] = pa>>8;
  1442. d->pa[2] = pa>>16;
  1443. d->pa[3] = pa>>24;
  1444. d->dbc[0] = bc;
  1445. d->dbc[1] = bc>>8;
  1446. d->dbc[2] = bc>>16;
  1447. d->dbc[3] = bc>>24;
  1448. }
  1449. static void
  1450. advancedata(Movedata *d, long v)
  1451. {
  1452. lesetl(d->pa, legetl(d->pa) + v);
  1453. lesetl(d->dbc, legetl(d->dbc) - v);
  1454. }
  1455. static void
  1456. dumpwritedata(uchar *data, int datalen)
  1457. {
  1458. int i;
  1459. uchar *bp;
  1460. if (!DEBUG(0)){
  1461. USED(data, datalen);
  1462. return;
  1463. }
  1464. if (datalen) {
  1465. KPRINT(PRINTPREFIX "write:");
  1466. for (i = 0, bp = data; i < 50 && i < datalen; i++, bp++)
  1467. KPRINT("%.2ux", *bp);
  1468. if (i < datalen) {
  1469. KPRINT("...");
  1470. }
  1471. KPRINT("\n");
  1472. }
  1473. }
  1474. static void
  1475. dumpreaddata(uchar *data, int datalen)
  1476. {
  1477. int i;
  1478. uchar *bp;
  1479. if (!DEBUG(0)){
  1480. USED(data, datalen);
  1481. return;
  1482. }
  1483. if (datalen) {
  1484. KPRINT(PRINTPREFIX "read:");
  1485. for (i = 0, bp = data; i < 50 && i < datalen; i++, bp++)
  1486. KPRINT("%.2ux", *bp);
  1487. if (i < datalen) {
  1488. KPRINT("...");
  1489. }
  1490. KPRINT("\n");
  1491. }
  1492. }
  1493. static void
  1494. busreset(Controller *c)
  1495. {
  1496. int x, ntarget;
  1497. /* bus reset */
  1498. c->n->scntl1 |= (1 << 3);
  1499. delay(500);
  1500. c->n->scntl1 &= ~(1 << 3);
  1501. if(!(c->v->feature & Wide))
  1502. ntarget = 8;
  1503. else
  1504. ntarget = MAXTARGET;
  1505. for (x = 0; x < ntarget; x++) {
  1506. setwide(0, c, x, 0);
  1507. #ifndef ASYNC_ONLY
  1508. c->s[x] = NeitherDone;
  1509. #endif
  1510. }
  1511. c->capvalid = 0;
  1512. }
  1513. static void
  1514. reset(Controller *c)
  1515. {
  1516. /* should wakeup all pending tasks */
  1517. softreset(c);
  1518. busreset(c);
  1519. }
  1520. static int
  1521. io(Controller *c, uchar target, uchar lun, int rw, uchar *cmd, int cmdlen, uchar *data, int datalen,
  1522. int *transferred)
  1523. {
  1524. uchar *bp;
  1525. int bc;
  1526. Dsa *d;
  1527. Ncr *n = c->n;
  1528. uchar target_expo, my_expo;
  1529. ushort status;
  1530. d = dsaalloc(c, target, lun);
  1531. qlock(&c->q[target]); /* obtain access to target */
  1532. /* load the transfer control stuff */
  1533. d->scsi_id_buf[0] = 0;
  1534. d->scsi_id_buf[1] = c->sxfer[target];
  1535. d->scsi_id_buf[2] = target;
  1536. d->scsi_id_buf[3] = c->scntl3[target];
  1537. synctodsa(d, c);
  1538. bc = 0;
  1539. d->msg_out[bc] = 0x80 | lun;
  1540. #ifndef NO_DISCONNECT
  1541. d->msg_out[bc] |= (1 << 6);
  1542. #endif
  1543. bc++;
  1544. /* work out what to do about negotiation */
  1545. switch (c->s[target]) {
  1546. default:
  1547. KPRINT(PRINTPREFIX "%d: strange nego state %d\n", target, c->s[target]);
  1548. c->s[target] = NeitherDone;
  1549. /* fall through */
  1550. case NeitherDone:
  1551. if ((c->capvalid & (1 << target)) == 0)
  1552. break;
  1553. target_expo = (c->cap[target] >> 5) & 3;
  1554. my_expo = (c->v->feature & Wide) != 0;
  1555. if (target_expo < my_expo)
  1556. my_expo = target_expo;
  1557. #ifdef ALWAYS_DO_WDTR
  1558. bc += buildwdtrmsg(d->msg_out + bc, my_expo);
  1559. KPRINT(PRINTPREFIX "%d: WDTN: initiating expo %d\n", target, my_expo);
  1560. c->s[target] = WideInit;
  1561. break;
  1562. #else
  1563. if (my_expo) {
  1564. bc += buildwdtrmsg(d->msg_out + bc, (c->v->feature & Wide) ? 1 : 0);
  1565. KPRINT(PRINTPREFIX "%d: WDTN: initiating expo %d\n", target, my_expo);
  1566. c->s[target] = WideInit;
  1567. break;
  1568. }
  1569. KPRINT(PRINTPREFIX "%d: WDTN: narrow\n", target);
  1570. /* fall through */
  1571. #endif
  1572. case WideDone:
  1573. if (c->cap[target] & (1 << 4)) {
  1574. KPRINT(PRINTPREFIX "%d: SDTN: initiating %d %d\n", target, c->tpf, c->v->maxsyncoff);
  1575. bc += buildsdtrmsg(d->msg_out + bc, c->tpf, c->v->maxsyncoff);
  1576. c->s[target] = SyncInit;
  1577. break;
  1578. }
  1579. KPRINT(PRINTPREFIX "%d: SDTN: async only\n", target);
  1580. c->s[target] = BothDone;
  1581. break;
  1582. case BothDone:
  1583. break;
  1584. }
  1585. setmovedata(&d->msg_out_buf, DMASEG(d->msg_out), bc);
  1586. setmovedata(&d->cmd_buf, DMASEG(cmd), cmdlen);
  1587. calcblockdma(d, DMASEG(data), datalen);
  1588. if (DEBUG(0)) {
  1589. KPRINT(PRINTPREFIX "%d/%d: exec: ", target, lun);
  1590. for (bp = cmd; bp < &cmd[cmdlen]; bp++)
  1591. KPRINT("%.2ux", *bp);
  1592. KPRINT("\n");
  1593. if (rw)
  1594. KPRINT(PRINTPREFIX "%d/%d: exec: limit=(%d)%ld\n",
  1595. target, lun, d->dmablks, legetl(d->data_buf.dbc));
  1596. else
  1597. dumpwritedata(data, datalen);
  1598. }
  1599. setmovedata(&d->status_buf, DMASEG(&d->status), 1);
  1600. d->p9status = 0xffff;
  1601. d->parityerror = 0;
  1602. d->stateb = A_STATE_ISSUE; /* start operation */
  1603. ilock(c);
  1604. if (c->ssm)
  1605. c->n->dcntl |= 0x10; /* SSI */
  1606. if (c->running) {
  1607. n->istat |= Sigp;
  1608. }
  1609. else {
  1610. start(c, E_issue_check);
  1611. }
  1612. iunlock(c);
  1613. #ifdef CPU
  1614. while(waserror())
  1615. ;
  1616. #ifdef QUICK_TIMEOUT
  1617. tsleep(d, done, d, 30 * 1000);
  1618. #else
  1619. tsleep(d, done, d, 60 * 60 * 1000);
  1620. #endif
  1621. poperror();
  1622. if (!done(d)) {
  1623. KPRINT(PRINTPREFIX "%d/%d: exec: Timed out\n", target, lun);
  1624. dumpncrregs(c, 0);
  1625. dsafree(c, d);
  1626. reset(c);
  1627. qunlock(&c->q[target]);
  1628. error(Eio);
  1629. }
  1630. #endif
  1631. #ifdef FS
  1632. sleep(d, done, d);
  1633. #endif
  1634. if (d->p9status == STATUS_SELECTION_TIMEOUT)
  1635. c->s[target] = NeitherDone;
  1636. if (d->parityerror) {
  1637. d->p9status = STATUS_FAIL;
  1638. }
  1639. /*
  1640. * adjust datalen
  1641. */
  1642. if (d->dmablks > 0)
  1643. datalen -= d->dmablks * A_BSIZE;
  1644. else if (d->flag == 0)
  1645. datalen -= legetl(d->data_buf.dbc);
  1646. if (transferred)
  1647. *transferred = datalen;
  1648. if (rw)
  1649. dumpreaddata(data, datalen);
  1650. if (DEBUG(0))
  1651. KPRINT(PRINTPREFIX "%d/%d: exec: p9status=%d status %d rlen %d\n",
  1652. target, lun, d->p9status, status, datalen);
  1653. /*
  1654. * spot the identify
  1655. */
  1656. if ((c->capvalid & (1 << target)) == 0 &&
  1657. d->p9status == STATUS_COMPLETE && cmd[0] == 0x12 && datalen >= 8) {
  1658. c->capvalid |= 1 << target;
  1659. c->cap[target] = data[7];
  1660. KPRINT(PRINTPREFIX "%d: capabilities %.2x\n", target, data[7]);
  1661. }
  1662. status = d->p9status;
  1663. dsafree(c, d);
  1664. qunlock(&c->q[target]);
  1665. return status;
  1666. }
  1667. #ifdef CPU
  1668. static int
  1669. exec(Scsi *p, int rw)
  1670. {
  1671. int transferred;
  1672. Controller *c = &controller; /* MULTIPLE - map from scsi bus to controller instance */
  1673. p->status = io(c, p->target, p->lun, rw,
  1674. p->cmd.base, p->cmd.lim - p->cmd.base,
  1675. p->data.base, p->data.lim - p->data.base, &transferred);
  1676. p->data.ptr = p->data.base + transferred;
  1677. return p->status;
  1678. }
  1679. #endif
  1680. #ifdef Plan9fs
  1681. static int
  1682. exec(Device d, int rw, uchar *cmd, int clen, void *data, int dlen)
  1683. {
  1684. Controller *c = &controller; /* MULTIPLE - map from scsi bus to controller instance */
  1685. return io(c, d.unit, (cmd[1] >> 5) & 7, rw, cmd, clen, data, dlen, 0);
  1686. }
  1687. #endif /* Plan9fs
  1688. #ifdef FS
  1689. static int
  1690. exec(Target* t, int rw, uchar* cmd, int cbytes, void* data, int* dbytes)
  1691. {
  1692. int n, s;
  1693. Controller *ctlr;
  1694. if((ctlr = ctlrxx[t->ctlrno]) == nil || ctlr->n == nil)
  1695. return STharderr;
  1696. if(t->targetno == 0x07)
  1697. return STownid;
  1698. if(dbytes)
  1699. n = *dbytes;
  1700. else
  1701. n = 0;
  1702. s = io(ctlr, t->targetno, (cmd[1] >> 5) & 7, rw, cmd, cbytes, data, n, dbytes);
  1703. switch(s){
  1704. case STATUS_COMPLETE:
  1705. return STok;
  1706. case STATUS_FAIL:
  1707. return STharderr;
  1708. case STATUS_SELECTION_TIMEOUT:
  1709. return STtimeout;
  1710. case 0x6002:
  1711. return STcheck;
  1712. default:
  1713. print("scsi#%d: exec status 0x%ux\n", ctlr->ctlrno, s);
  1714. return STharderr;
  1715. }
  1716. }
  1717. #endif
  1718. static void
  1719. cribbios(Controller *c)
  1720. {
  1721. c->bios.scntl3 = c->n->scntl3;
  1722. c->bios.stest2 = c->n->stest2;
  1723. print(PRINTPREFIX "bios scntl3(%.2x) stest2(%.2x)\n", c->bios.scntl3, c->bios.stest2);
  1724. }
  1725. static int
  1726. bios_set_differential(Controller *c)
  1727. {
  1728. /* Concept lifted from FreeBSD - thanks Gerard */
  1729. /* basically, if clock conversion factors are set, then there is
  1730. * evidence the bios had a go at the chip, and if so, it would
  1731. * have set the differential enable bit in stest2
  1732. */
  1733. return (c->bios.scntl3 & 7) != 0 && (c->bios.stest2 & 0x20) != 0;
  1734. }
  1735. #define NCR_VID 0x1000
  1736. #define NCR_810_DID 0x0001
  1737. #define NCR_820_DID 0x0002 /* don't know enough about this one to support it */
  1738. #define NCR_825_DID 0x0003
  1739. #define NCR_815_DID 0x0004
  1740. #define SYM_810AP_DID 0x0005
  1741. #define SYM_860_DID 0x0006
  1742. #define SYM_896_DID 0x000b
  1743. #define SYM_895_DID 0x000c
  1744. #define SYM_885_DID 0x000d /* ditto */
  1745. #define SYM_875_DID 0x000f /* ditto */
  1746. #define SYM_1010_DID 0x0020
  1747. #define SYM_875J_DID 0x008f
  1748. static Variant variant[] = {
  1749. { NCR_810_DID, 0x0f, "NCR53C810", Burst16, 8, 24, 0 },
  1750. { NCR_810_DID, 0x1f, "SYM53C810ALV", Burst16, 8, 24, Prefetch },
  1751. { NCR_810_DID, 0xff, "SYM53C810A", Burst16, 8, 24, Prefetch },
  1752. { SYM_810AP_DID, 0xff, "SYM53C810AP", Burst16, 8, 24, Prefetch },
  1753. { NCR_815_DID, 0xff, "NCR53C815", Burst16, 8, 24, BurstOpCodeFetch },
  1754. { NCR_825_DID, 0x0f, "NCR53C825", Burst16, 8, 24, Wide|BurstOpCodeFetch|Differential },
  1755. { NCR_825_DID, 0xff, "SYM53C825A", Burst128, 16, 24, Prefetch|LocalRAM|BigFifo|Differential|Wide },
  1756. { SYM_860_DID, 0x0f, "SYM53C860", Burst16, 8, 24, Prefetch|Ultra },
  1757. { SYM_860_DID, 0xff, "SYM53C860LV", Burst16, 8, 24, Prefetch|Ultra },
  1758. { SYM_875_DID, 0x01, "SYM53C875r1", Burst128, 16, 24, Prefetch|LocalRAM|BigFifo|Differential|Wide|Ultra },
  1759. { SYM_875_DID, 0xff, "SYM53C875", Burst128, 16, 24, Prefetch|LocalRAM|BigFifo|Differential|Wide|Ultra|ClockDouble },
  1760. { SYM_875J_DID, 0xff, "SYM53C875j", Burst128, 16, 24, Prefetch|LocalRAM|BigFifo|Differential|Wide|Ultra|ClockDouble },
  1761. { SYM_885_DID, 0xff, "SYM53C885", Burst128, 16, 24, Prefetch|LocalRAM|BigFifo|Wide|Ultra|ClockDouble },
  1762. { SYM_895_DID, 0xff, "SYM53C895", Burst128, 16, 24, Prefetch|LocalRAM|BigFifo|Wide|Ultra|Ultra2 },
  1763. { SYM_896_DID, 0xff, "SYM53C896", Burst128, 16, 64, Prefetch|LocalRAM|BigFifo|Wide|Ultra|Ultra2 },
  1764. { SYM_1010_DID, 0xff, "SYM53C1010", Burst128, 16, 64, Prefetch|LocalRAM|BigFifo|Wide|Ultra|Ultra2 },
  1765. };
  1766. #define MAXVAR (sizeof(variant)/sizeof(variant[0]))
  1767. #ifndef NAINCLUDE
  1768. static int
  1769. na_fixup(Controller *c, ulong pa_reg,
  1770. struct na_patch *patch, int patches,
  1771. int (*externval)(Controller*, int, ulong*))
  1772. {
  1773. int p;
  1774. int v;
  1775. ulong *script, pa_script;
  1776. unsigned long lw, lv;
  1777. script = c->script;
  1778. pa_script = c->scriptpa;
  1779. for (p = 0; p < patches; p++) {
  1780. switch (patch[p].type) {
  1781. case 1:
  1782. /* script relative */
  1783. script[patch[p].lwoff] += pa_script;
  1784. break;
  1785. case 2:
  1786. /* register i/o relative */
  1787. script[patch[p].lwoff] += pa_reg;
  1788. break;
  1789. case 3:
  1790. /* data external */
  1791. lw = script[patch[p].lwoff];
  1792. v = (lw >> 8) & 0xff;
  1793. if (!(*externval)(c, v, &lv))
  1794. return 0;
  1795. v = lv & 0xff;
  1796. script[patch[p].lwoff] = (lw & 0xffff00ffL) | (v << 8);
  1797. break;
  1798. case 4:
  1799. /* 32 bit external */
  1800. lw = script[patch[p].lwoff];
  1801. if (!(*externval)(c, lw, &lv))
  1802. return 0;
  1803. script[patch[p].lwoff] = lv;
  1804. break;
  1805. case 5:
  1806. /* 24 bit external */
  1807. lw = script[patch[p].lwoff];
  1808. if (!(*externval)(c, lw & 0xffffff, &lv))
  1809. return 0;
  1810. script[patch[p].lwoff] = (lw & 0xff000000L) | (lv & 0xffffffL);
  1811. break;
  1812. }
  1813. }
  1814. return 1;
  1815. }
  1816. #endif /* NAINCLUDE */
  1817. typedef struct Adapter {
  1818. Pcidev* pcidev;
  1819. int port;
  1820. int irq;
  1821. int rid;
  1822. } Adapter;
  1823. static Msgbuf* adapter;
  1824. static void
  1825. scanpci(void)
  1826. {
  1827. Pcidev *p;
  1828. Msgbuf *mb, *last;
  1829. Adapter *ap;
  1830. p = nil;
  1831. last = nil;
  1832. while(p = pcimatch(p, NCR_VID, 0)){
  1833. mb = mballoc(sizeof(Adapter), 0, Mxxx);
  1834. ap = (Adapter*)mb->data;
  1835. ap->pcidev = p;
  1836. ap->port = p->mem[0].bar & ~0x01;
  1837. if(adapter == nil)
  1838. adapter = mb;
  1839. else
  1840. last->next = mb;
  1841. last = mb;
  1842. }
  1843. }
  1844. static int
  1845. init(Controller* ctlr, ISAConf* isa, int differential)
  1846. {
  1847. int is64, var, rid;
  1848. ulong regpa, scriptpa;
  1849. Pcidev *pcidev;
  1850. Msgbuf *mb, **mbb;
  1851. Adapter *ap;
  1852. extern ulong upamalloc(ulong, int, int);
  1853. /*
  1854. * Any adapter matches if no isa->port is supplied,
  1855. * otherwise the ports must match.
  1856. */
  1857. pcidev = nil;
  1858. mbb = &adapter;
  1859. for(mb = *mbb; mb; mb = mb->next){
  1860. ap = (Adapter*)mb->data;
  1861. if(isa->port == 0 || isa->port == ap->port){
  1862. pcidev = ap->pcidev;
  1863. *mbb = mb->next;
  1864. mbfree(mb);
  1865. break;
  1866. }
  1867. mbb = &mb->next;
  1868. }
  1869. if(pcidev == nil)
  1870. return 0;
  1871. rid = pcicfgr8(pcidev, PciRID);
  1872. for (var = 0; var < MAXVAR; var++) {
  1873. if (pcidev->did == variant[var].did && rid <= variant[var].maxrid)
  1874. break;
  1875. }
  1876. if (var >= MAXVAR)
  1877. return 0;
  1878. print("scsi#%d: %s rev. 0x%.2x intr=%d command=%.4x\n",
  1879. ctlr->ctlrno, variant[var].name, rid,
  1880. pcidev->intl, pcicfgr16(pcidev, PciPCR));
  1881. is64 = pcidev->mem[1].bar & 0x04;
  1882. if(is64 && pcidev->mem[2].bar){
  1883. print("scsi#%d: registers in 64-bit space\n",
  1884. ctlr->ctlrno);
  1885. return 0;
  1886. }
  1887. regpa = upamalloc(pcidev->mem[1].bar & ~0x0F, pcidev->mem[1].size, 0);
  1888. if (regpa == 0) {
  1889. print("scsi#%d: failed to map registers\n", ctlr->ctlrno);
  1890. return 0;
  1891. }
  1892. ctlr->n = KADDR(regpa);
  1893. ctlr->v = &variant[var];
  1894. scriptpa = 0;
  1895. if ((ctlr->v->feature & LocalRAM) && sizeof(na_script) <= 4096) {
  1896. if(is64){
  1897. if((pcidev->mem[3].bar & 0x04) && pcidev->mem[4].bar){
  1898. print("scsi#%d: RAM in 64-bit space\n",
  1899. ctlr->ctlrno);
  1900. scriptpa = 0;
  1901. }
  1902. else
  1903. scriptpa = upamalloc(pcidev->mem[3].bar & ~0x0F,
  1904. pcidev->mem[3].size, 0);
  1905. }
  1906. else
  1907. scriptpa = upamalloc(pcidev->mem[2].bar & ~0x0F,
  1908. pcidev->mem[2].size, 0);
  1909. if (scriptpa == 0)
  1910. print("scsi#%d: failed to map onboard RAM\n", ctlr->ctlrno);
  1911. else {
  1912. ctlr->script = KADDR(scriptpa);
  1913. ctlr->scriptpa = scriptpa;
  1914. memmove(ctlr->script, na_script, sizeof(na_script));
  1915. print("scsi#%d: local SCRIPT ram enabled\n", ctlr->ctlrno);
  1916. }
  1917. }
  1918. if (scriptpa == 0) {
  1919. /* either the map failed, or this chip does not have local RAM
  1920. * it will need a copy of the microcode
  1921. */
  1922. /*
  1923. * should allocate memory and copy na_script into it for
  1924. * multiple controllers here
  1925. * single controller version uses the microcode in place
  1926. */
  1927. ctlr->script = na_script;
  1928. ctlr->scriptpa = DMASEG(na_script);
  1929. }
  1930. /* fixup script */
  1931. if (!na_fixup(ctlr, regpa, na_patches, NA_PATCHES, xfunc)) {
  1932. print("script fixup failed\n");
  1933. return 0;
  1934. }
  1935. if (differential)
  1936. ctlr->feature |= Differential;
  1937. swabl(ctlr->script, ctlr->script, sizeof(na_script));
  1938. ctlr->dsalist.freechain = 0;
  1939. lesetl(ctlr->dsalist.head, 0);
  1940. isa->port = (ulong)KADDR(regpa);
  1941. isa->irq = pcidev->intl;
  1942. synctabinit(ctlr);
  1943. cribbios(ctlr);
  1944. /*
  1945. intrenable(isa->irq, interrupt, ctlr, pcidev->tbdf);
  1946. */
  1947. setvec(IRQBASE + isa->irq, interrupt, ctlr);
  1948. reset(ctlr);
  1949. return 1;
  1950. }
  1951. #ifdef CPU
  1952. int (*
  1953. ncr53c8xxreset(void))(Scsi*, int)
  1954. {
  1955. ISAConf isaconf;
  1956. int ic;
  1957. int differential = 0;
  1958. int o;
  1959. Controller *c;
  1960. memset(&isaconf, 0, sizeof(isaconf));
  1961. strcpy(isaconf.type, DEVICENAME);
  1962. ic = isaconfig("scsi", 0, &isaconf);
  1963. /* search any ISA opts */
  1964. if (ic) {
  1965. for (o = 0; o < isaconf.nopt; o++) {
  1966. if (strcmp(isaconf.opt[o], "diff") == 0)
  1967. differential = 1;
  1968. }
  1969. }
  1970. c = &controller; /* MULTIPLE - map from scsi bus to controller instance */
  1971. if (init(c, differential))
  1972. return exec;
  1973. return 0;
  1974. }
  1975. #endif
  1976. #ifdef Plan9fs
  1977. int (*
  1978. ncr53c8xxreset(int /*ctlrno*/, ISAConf */*isa*/))(Device, int, uchar*, int, void*, int)
  1979. {
  1980. Controller *c = &controller; /* MULTIPLE - map from scsi bus to controller instance */
  1981. if (init(c, 0))
  1982. return exec;
  1983. return 0;
  1984. }
  1985. #endif /* Plan9fs */
  1986. #ifdef FS
  1987. Scsiio
  1988. ncr53c8xxreset(int ctlrno, ISAConf* isa)
  1989. {
  1990. int differential, o;
  1991. Controller *ctlr;
  1992. static int scandone;
  1993. if(scandone == 0){
  1994. scanpci();
  1995. scandone = 1;
  1996. }
  1997. differential = 0;
  1998. for (o = 0; o < isa->nopt; o++) {
  1999. if (strcmp(isa->opt[o], "diff") == 0)
  2000. differential = 1;
  2001. }
  2002. if((ctlr = xalloc(sizeof(Controller))) == 0){
  2003. print("scsi#%d: %s: controller allocation failed\n",
  2004. ctlrno, isa->type);
  2005. return 0;
  2006. }
  2007. ctlrxx[ctlrno] = ctlr;
  2008. ctlr->ctlrno = ctlrno;
  2009. if (init(ctlr, isa, differential))
  2010. return exec;
  2011. return 0;
  2012. }
  2013. #endif /* FS */