mesh.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:52k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * SCSI low-level driver for the MESH (Macintosh Enhanced SCSI Hardware)
  3.  * bus adaptor found on Power Macintosh computers.
  4.  * We assume the MESH is connected to a DBDMA (descriptor-based DMA)
  5.  * controller.
  6.  *
  7.  * Paul Mackerras, August 1996.
  8.  * Copyright (C) 1996 Paul Mackerras.
  9.  *
  10.  * Apr. 14 2002  - BenH Rework bus reset code for new error handler
  11.  *                              Add delay after initial bus reset
  12.  *                              Add module parameters
  13.  * To do:
  14.  * - handle aborts correctly
  15.  * - retry arbitration if lost (unless higher levels do this for us)
  16.  */
  17. #include <linux/config.h>
  18. #include <linux/module.h>
  19. #include <linux/kernel.h>
  20. #include <linux/delay.h>
  21. #include <linux/types.h>
  22. #include <linux/string.h>
  23. #include <linux/slab.h>
  24. #include <linux/blk.h>
  25. #include <linux/proc_fs.h>
  26. #include <linux/stat.h>
  27. #include <linux/tqueue.h>
  28. #include <linux/interrupt.h>
  29. #include <linux/reboot.h>
  30. #include <linux/spinlock.h>
  31. #include <linux/pci.h>
  32. #include <asm/dbdma.h>
  33. #include <asm/io.h>
  34. #include <asm/pgtable.h>
  35. #include <asm/prom.h>
  36. #include <asm/system.h>
  37. #include <asm/irq.h>
  38. #include <asm/hydra.h>
  39. #include <asm/processor.h>
  40. #include <asm/machdep.h>
  41. #include <asm/pmac_feature.h>
  42. #include <asm/pci-bridge.h>
  43. #ifdef CONFIG_PMAC_PBOOK
  44. #include <linux/adb.h>
  45. #include <linux/pmu.h>
  46. #endif
  47. #include "scsi.h"
  48. #include "hosts.h"
  49. #include "mesh.h"
  50. #if 1
  51. #undef KERN_DEBUG
  52. #define KERN_DEBUG KERN_WARNING
  53. #endif
  54. MODULE_AUTHOR("Paul Mackerras (paulus@samba.org)");
  55. MODULE_DESCRIPTION("PowerMac MESH SCSI driver");
  56. MODULE_LICENSE("GPL");
  57. MODULE_PARM(sync_rate, "i");
  58. MODULE_PARM_DESC(sync_rate, "Synchronous rate (0..10, 0=async)");
  59. MODULE_PARM(sync_targets, "i");
  60. MODULE_PARM_DESC(sync_targets, "Bitmask of targets allowed to set synchronous");
  61. MODULE_PARM(resel_targets, "i");
  62. MODULE_PARM_DESC(resel_targets, "Bitmask of targets allowed to set disconnect");
  63. MODULE_PARM(debug_targets, "i");
  64. MODULE_PARM_DESC(debug_targets, "Bitmask of debugged targets");
  65. MODULE_PARM(init_reset_delay, "i");
  66. MODULE_PARM_DESC(init_reset_delay, "Initial bus reset delay (0=no reset)");
  67. static int sync_rate = CONFIG_SCSI_MESH_SYNC_RATE;
  68. static int sync_targets = 0xff;
  69. static int resel_targets = 0xff;
  70. static int debug_targets = 0; /* print debug for these targets */
  71. static int init_reset_delay = CONFIG_SCSI_MESH_RESET_DELAY_MS;
  72. static int mesh_sync_period = 100;
  73. static int mesh_sync_offset = 0;
  74. static unsigned char use_active_neg = 0;  /* bit mask for SEQ_ACTIVE_NEG if used */
  75. #define ALLOW_SYNC(tgt) ((sync_targets >> (tgt)) & 1)
  76. #define ALLOW_RESEL(tgt) ((resel_targets >> (tgt)) & 1)
  77. #define ALLOW_DEBUG(tgt) ((debug_targets >> (tgt)) & 1)
  78. #define DEBUG_TARGET(cmd) ((cmd) && ALLOW_DEBUG((cmd)->target))
  79. #undef MESH_DBG
  80. #define N_DBG_LOG 50
  81. #define N_DBG_SLOG 20
  82. #define NUM_DBG_EVENTS 13
  83. #undef DBG_USE_TB /* bombs on 601 */
  84. struct dbglog {
  85. char *fmt;
  86. u32 tb;
  87. u8 phase;
  88. u8 bs0;
  89. u8 bs1;
  90. u8 tgt;
  91. int d;
  92. };
  93. enum mesh_phase {
  94. idle,
  95. arbitrating,
  96. selecting,
  97. commanding,
  98. dataing,
  99. statusing,
  100. busfreeing,
  101. disconnecting,
  102. reselecting,
  103. sleeping
  104. };
  105. enum msg_phase {
  106. msg_none,
  107. msg_out,
  108. msg_out_xxx,
  109. msg_out_last,
  110. msg_in,
  111. msg_in_bad,
  112. };
  113. enum sdtr_phase {
  114. do_sdtr,
  115. sdtr_sent,
  116. sdtr_done
  117. };
  118. struct mesh_target {
  119. enum sdtr_phase sdtr_state;
  120. int sync_params;
  121. int data_goes_out; /* guess as to data direction */
  122. Scsi_Cmnd *current_req;
  123. u32 saved_ptr;
  124. #ifdef MESH_DBG
  125. int log_ix;
  126. int n_log;
  127. struct dbglog log[N_DBG_LOG];
  128. #endif
  129. };
  130. struct mesh_state {
  131. volatile struct mesh_regs *mesh;
  132. int meshintr;
  133. volatile struct dbdma_regs *dma;
  134. int dmaintr;
  135. struct Scsi_Host *host;
  136. struct mesh_state *next;
  137. Scsi_Cmnd *request_q;
  138. Scsi_Cmnd *request_qtail;
  139. enum mesh_phase phase; /* what we're currently trying to do */
  140. enum msg_phase msgphase;
  141. int conn_tgt; /* target we're connected to */
  142. Scsi_Cmnd *current_req; /* req we're currently working on */
  143. int data_ptr;
  144. int dma_started;
  145. int dma_count;
  146. int stat;
  147. int aborting;
  148. int expect_reply;
  149. int n_msgin;
  150. u8 msgin[16];
  151. int n_msgout;
  152. int last_n_msgout;
  153. u8 msgout[16];
  154. struct dbdma_cmd *dma_cmds; /* space for dbdma commands, aligned */
  155. int clk_freq;
  156. struct mesh_target tgts[8];
  157. void *dma_cmd_space;
  158. struct device_node *ofnode;
  159. struct pci_dev* pdev;
  160. #ifdef MESH_DBG
  161. int log_ix;
  162. int n_log;
  163. struct dbglog log[N_DBG_SLOG];
  164. #endif
  165. };
  166. #ifdef MESH_DBG
  167. static void dlog(struct mesh_state *ms, char *fmt, int a);
  168. static void dumplog(struct mesh_state *ms, int tgt);
  169. static void dumpslog(struct mesh_state *ms);
  170. #else
  171. static inline void dlog(struct mesh_state *ms, char *fmt, int a)
  172. {}
  173. static inline void dumplog(struct mesh_state *ms, int tgt)
  174. {}
  175. static inline void dumpslog(struct mesh_state *ms)
  176. {}
  177. #endif /* MESH_DBG */
  178. #define MKWORD(a, b, c, d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
  179. static struct mesh_state *all_meshes;
  180. static void mesh_init(struct mesh_state *);
  181. static int mesh_notify_reboot(struct notifier_block *, unsigned long, void *);
  182. static void mesh_dump_regs(struct mesh_state *);
  183. static void mesh_start(struct mesh_state *);
  184. static void mesh_start_cmd(struct mesh_state *, Scsi_Cmnd *);
  185. static void add_sdtr_msg(struct mesh_state *);
  186. static void set_sdtr(struct mesh_state *, int, int);
  187. static void start_phase(struct mesh_state *);
  188. static void get_msgin(struct mesh_state *);
  189. static int msgin_length(struct mesh_state *);
  190. static void cmd_complete(struct mesh_state *);
  191. static void phase_mismatch(struct mesh_state *);
  192. static void reselected(struct mesh_state *);
  193. static void handle_reset(struct mesh_state *);
  194. static void handle_error(struct mesh_state *);
  195. static void handle_exception(struct mesh_state *);
  196. static void mesh_interrupt(int, void *, struct pt_regs *);
  197. static void do_mesh_interrupt(int, void *, struct pt_regs *);
  198. static void handle_msgin(struct mesh_state *);
  199. static void mesh_done(struct mesh_state *, int);
  200. static void mesh_completed(struct mesh_state *, Scsi_Cmnd *);
  201. static void set_dma_cmds(struct mesh_state *, Scsi_Cmnd *);
  202. static void halt_dma(struct mesh_state *);
  203. static int data_goes_out(Scsi_Cmnd *);
  204. static void do_abort(struct mesh_state *ms);
  205. static void set_mesh_power(struct mesh_state *ms, int state);
  206. #ifdef CONFIG_PMAC_PBOOK
  207. static int mesh_notify_sleep(struct pmu_sleep_notifier *self, int when);
  208. static struct pmu_sleep_notifier mesh_sleep_notifier = {
  209. mesh_notify_sleep,
  210. SLEEP_LEVEL_BLOCK,
  211. };
  212. #endif
  213. static struct notifier_block mesh_notifier = {
  214. mesh_notify_reboot,
  215. NULL,
  216. 0
  217. };
  218. int
  219. mesh_detect(Scsi_Host_Template *tp)
  220. {
  221. struct device_node *mesh;
  222. int nmeshes, tgt, *cfp, minper;
  223. struct mesh_state *ms, **prev_statep;
  224. struct Scsi_Host *mesh_host;
  225. void *dma_cmd_space;
  226. /* The SCSI layer is dumb ! It calls us with the IO request
  227.  * lock held and interrupts disabled here... This doesn't happen
  228.  * in 2.5
  229.  */
  230. spin_unlock_irq(&io_request_lock);
  231. if (_machine == _MACH_Pmac) {
  232.     use_active_neg = (find_devices("mac-io") ? 0 : SEQ_ACTIVE_NEG);
  233. } else {
  234.     /* CHRP mac-io */
  235.     use_active_neg = SEQ_ACTIVE_NEG;
  236. }
  237. /* Calculate sync rate from module parameters */
  238. if (sync_rate > 10)
  239. sync_rate = 10;
  240. if (sync_rate > 0) {
  241. printk(KERN_INFO "mesh: configured for synchronous %d MB/sn", sync_rate);
  242. mesh_sync_period = 1000 / sync_rate; /* ns */
  243. mesh_sync_offset = 15;
  244. } else
  245. printk(KERN_INFO "mesh: configured for asynchronousn");
  246. nmeshes = 0;
  247. prev_statep = &all_meshes;
  248. /*
  249.  * On powermacs, the MESH node has device_type "mesh".
  250.  * On chrp machines, its device_type is "scsi" with
  251.  * "chrp,mesh0" as its `compatible' property.
  252.  */
  253. mesh = find_devices("mesh");
  254. if (mesh == 0)
  255. mesh = find_compatible_devices("scsi", "chrp,mesh0");
  256. for (; mesh != 0; mesh = mesh->next) {
  257. u8 pci_bus, pci_devfn;
  258. struct pci_dev* pdev = NULL;
  259. if (mesh->n_addrs != 2 || mesh->n_intrs != 2) {
  260. printk(KERN_ERR "mesh: expected 2 addrs and 2 intrs"
  261.        " (got %d,%d)n", mesh->n_addrs, mesh->n_intrs);
  262. continue;
  263. }
  264. if (mesh->parent != NULL
  265.     && pci_device_from_OF_node(mesh->parent, &pci_bus,
  266.        &pci_devfn) == 0)
  267. pdev = pci_find_slot(pci_bus, pci_devfn);
  268. if (pdev == NULL) {
  269. printk(KERN_ERR "mesh: Can't locate PCI entryn");
  270. continue;
  271. }
  272. mesh_host = scsi_register(tp, sizeof(struct mesh_state));
  273. if (mesh_host == 0) {
  274. printk(KERN_ERR "mesh: couldn't register host");
  275. continue;
  276. }
  277. mesh_host->unique_id = nmeshes;
  278. #if !defined(MODULE)
  279. note_scsi_host(mesh, mesh_host);
  280. #endif
  281. ms = (struct mesh_state *) mesh_host->hostdata;
  282. if (ms == 0)
  283. panic("no mesh state");
  284. memset(ms, 0, sizeof(*ms));
  285. ms->host = mesh_host;
  286. ms->ofnode = mesh;
  287. ms->pdev = pdev;
  288. ms->mesh = (volatile struct mesh_regs *)
  289. ioremap(mesh->addrs[0].address, 0x1000);
  290. ms->dma = (volatile struct dbdma_regs *)
  291. ioremap(mesh->addrs[1].address, 0x1000);
  292. ms->meshintr = mesh->intrs[0].line;
  293. ms->dmaintr = mesh->intrs[1].line;
  294. /* Space for dma command list: +1 for stop command,
  295.    +1 to allow for aligning. */
  296. dma_cmd_space = kmalloc((mesh_host->sg_tablesize + 2) *
  297. sizeof(struct dbdma_cmd), GFP_KERNEL);
  298. if (dma_cmd_space == 0)
  299. panic("mesh: couldn't allocate dma command space");
  300. ms->dma_cmds = (struct dbdma_cmd *) DBDMA_ALIGN(dma_cmd_space);
  301. memset(ms->dma_cmds, 0, (mesh_host->sg_tablesize + 1)
  302.        * sizeof(struct dbdma_cmd));
  303. ms->dma_cmd_space = dma_cmd_space;
  304. ms->current_req = 0;
  305. for (tgt = 0; tgt < 8; ++tgt) {
  306. ms->tgts[tgt].sdtr_state = do_sdtr;
  307. ms->tgts[tgt].sync_params = ASYNC_PARAMS;
  308. ms->tgts[tgt].current_req = 0;
  309. }
  310. *prev_statep = ms;
  311. prev_statep = &ms->next;
  312. if ((cfp = (int *) get_property(mesh, "clock-frequency",
  313. NULL))) {
  314. ms->clk_freq = *cfp;
  315. } else {
  316. printk(KERN_INFO "mesh: assuming 50MHz clock frequencyn");
  317. ms->clk_freq = 50000000;
  318. }
  319. /* The maximum sync rate is clock / 5; increase
  320.    mesh_sync_period if necessary. */
  321. minper = 1000000000 / (ms->clk_freq / 5); /* ns */
  322. if (mesh_sync_period < minper)
  323. mesh_sync_period = minper;
  324. set_mesh_power(ms, 1);
  325. mesh_init(ms);
  326. if (request_irq(ms->meshintr, do_mesh_interrupt, 0, "MESH", ms)) {
  327. printk(KERN_ERR "MESH: can't get irq %dn", ms->meshintr);
  328. }
  329. ++nmeshes;
  330. }
  331. if ((_machine == _MACH_Pmac) && (nmeshes > 0)) {
  332. #ifdef CONFIG_PMAC_PBOOK
  333. pmu_register_sleep_notifier(&mesh_sleep_notifier);
  334. #endif /* CONFIG_PMAC_PBOOK */
  335. register_reboot_notifier(&mesh_notifier);
  336. }
  337. /* Return to the SCSI layer in the same state we got called */
  338. spin_lock_irq(&io_request_lock);
  339. return nmeshes;
  340. }
  341. int
  342. mesh_release(struct Scsi_Host *host)
  343. {
  344. struct mesh_state *ms = (struct mesh_state *) host->hostdata;
  345. if (ms == 0)
  346. return 0;
  347. if (ms->mesh)
  348. iounmap((void *) ms->mesh);
  349. if (ms->dma)
  350. iounmap((void *) ms->dma);
  351. kfree(ms->dma_cmd_space);
  352. free_irq(ms->meshintr, ms);
  353. pmac_call_feature(PMAC_FTR_MESH_ENABLE, ms->ofnode, 0, 0);
  354. return 0;
  355. }
  356. static void
  357. set_mesh_power(struct mesh_state *ms, int state)
  358. {
  359. if (_machine != _MACH_Pmac)
  360. return;
  361. if (state) {
  362. pmac_call_feature(PMAC_FTR_MESH_ENABLE, ms->ofnode, 0, 1);
  363. mdelay(200);
  364. } else {
  365. pmac_call_feature(PMAC_FTR_MESH_ENABLE, ms->ofnode, 0, 0);
  366. mdelay(10);
  367. }
  368. }
  369. #ifdef CONFIG_PMAC_PBOOK
  370. /*
  371.  * notify clients before sleep and reset bus afterwards
  372.  */
  373. int
  374. mesh_notify_sleep(struct pmu_sleep_notifier *self, int when)
  375. {
  376. struct mesh_state *ms;
  377. switch (when) {
  378. case PBOOK_SLEEP_REQUEST:
  379. /* XXX We should wait for current transactions and queue
  380.  * new ones that would be posted beyond this point 
  381.  */ 
  382. break;
  383. case PBOOK_SLEEP_REJECT:
  384. break;
  385. case PBOOK_SLEEP_NOW:
  386. for (ms = all_meshes; ms != 0; ms = ms->next) {
  387. unsigned long flags;
  388. scsi_block_requests(ms->host);
  389. spin_lock_irqsave(&io_request_lock, flags);
  390. while(ms->phase != idle) {
  391. spin_unlock_irqrestore(&io_request_lock, flags);
  392. current->state = TASK_UNINTERRUPTIBLE;
  393. schedule_timeout(1);
  394. spin_lock_irqsave(&io_request_lock, flags);
  395. }
  396. ms->phase = sleeping;
  397. spin_unlock_irqrestore(&io_request_lock, flags);
  398. disable_irq(ms->meshintr);
  399. set_mesh_power(ms, 0);
  400. }
  401. break;
  402. case PBOOK_WAKE:
  403. for (ms = all_meshes; ms != 0; ms = ms->next) {
  404. unsigned long flags;
  405. set_mesh_power(ms, 1);
  406. mesh_init(ms);
  407. spin_lock_irqsave(&io_request_lock, flags);
  408. mesh_start(ms);
  409. spin_unlock_irqrestore(&io_request_lock, flags);
  410. enable_irq(ms->meshintr);
  411. scsi_unblock_requests(ms->host);
  412. }
  413. break;
  414. }
  415. return PBOOK_SLEEP_OK;
  416. }
  417. #endif /* CONFIG_PMAC_PBOOK */
  418. /*
  419.  * Called by midlayer with host locked to queue a new
  420.  * request
  421.  */
  422. int
  423. mesh_queue(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
  424. {
  425. struct mesh_state *ms;
  426. cmd->scsi_done = done;
  427. cmd->host_scribble = NULL;
  428. ms = (struct mesh_state *) cmd->host->hostdata;
  429. if (ms->request_q == NULL)
  430. ms->request_q = cmd;
  431. else
  432. ms->request_qtail->host_scribble = (void *) cmd;
  433. ms->request_qtail = cmd;
  434. if (ms->phase == idle)
  435. mesh_start(ms);
  436. return 0;
  437. }
  438. /* Todo: here we can at least try to remove the command from the
  439.  * queue if it isn't connected yet, and for pending command, assert
  440.  * ATN until the bus gets freed.
  441.  */
  442. int
  443. mesh_abort(Scsi_Cmnd *cmd)
  444. {
  445. struct mesh_state *ms = (struct mesh_state *) cmd->host->hostdata;
  446. printk(KERN_DEBUG "mesh_abort(%p)n", cmd);
  447. mesh_dump_regs(ms);
  448. dumplog(ms, cmd->target);
  449. dumpslog(ms);
  450. return SCSI_ABORT_SNOOZE;
  451. }
  452. static void
  453. mesh_dump_regs(struct mesh_state *ms)
  454. {
  455. volatile struct mesh_regs *mr = ms->mesh;
  456. volatile struct dbdma_regs *md = ms->dma;
  457. int t;
  458. struct mesh_target *tp;
  459. printk(KERN_DEBUG "mesh: state at %p, regs at %p, dma at %pn",
  460.        ms, mr, md);
  461. printk(KERN_DEBUG "    ct=%4x seq=%2x bs=%4x fc=%2x "
  462.        "exc=%2x err=%2x im=%2x int=%2x sp=%2xn",
  463.        (mr->count_hi << 8) + mr->count_lo, mr->sequence,
  464.        (mr->bus_status1 << 8) + mr->bus_status0, mr->fifo_count,
  465.        mr->exception, mr->error, mr->intr_mask, mr->interrupt,
  466.        mr->sync_params);
  467. while(in_8(&mr->fifo_count))
  468. printk(KERN_DEBUG " fifo data=%.2xn",in_8(&mr->fifo));
  469. printk(KERN_DEBUG "    dma stat=%x cmdptr=%xn",
  470.        in_le32(&md->status), in_le32(&md->cmdptr));
  471. printk(KERN_DEBUG "    phase=%d msgphase=%d conn_tgt=%d data_ptr=%dn",
  472.        ms->phase, ms->msgphase, ms->conn_tgt, ms->data_ptr);
  473. printk(KERN_DEBUG "    dma_st=%d dma_ct=%d n_msgout=%dn",
  474.        ms->dma_started, ms->dma_count, ms->n_msgout);
  475. for (t = 0; t < 8; ++t) {
  476. tp = &ms->tgts[t];
  477. if (tp->current_req == NULL)
  478. continue;
  479. printk(KERN_DEBUG "    target %d: req=%p goes_out=%d saved_ptr=%dn",
  480.        t, tp->current_req, tp->data_goes_out, tp->saved_ptr);
  481. }
  482. }
  483. /*
  484.  * Called by the midlayer with the lock held to reset the
  485.  * SCSI host and bus.
  486.  * The midlayer will wait for devices to come back, we don't need
  487.  * to do that ourselves
  488.  */
  489. int
  490. mesh_host_reset(Scsi_Cmnd *cmd)
  491. {
  492. struct mesh_state *ms = (struct mesh_state *) cmd->host->hostdata;
  493. volatile struct mesh_regs *mr = ms->mesh;
  494. volatile struct dbdma_regs *md = ms->dma;
  495. printk(KERN_DEBUG "mesh_host_resetn");
  496. /* Reset the controller & dbdma channel */
  497. out_le32(&md->control, (RUN|PAUSE|FLUSH|WAKE) << 16); /* stop dma */
  498. out_8(&mr->exception, 0xff); /* clear all exception bits */
  499. out_8(&mr->error, 0xff); /* clear all error bits */
  500. out_8(&mr->sequence, SEQ_RESETMESH);
  501. udelay(1);
  502. out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
  503. out_8(&mr->source_id, ms->host->this_id);
  504. out_8(&mr->sel_timeout, 25); /* 250ms */
  505. out_8(&mr->sync_params, ASYNC_PARAMS);
  506. /* Reset the bus */
  507. out_8(&mr->bus_status1, BS1_RST); /* assert RST */
  508. udelay(30); /* leave it on for >= 25us */
  509. out_8(&mr->bus_status1, 0); /* negate RST */
  510. /* Complete pending commands */
  511. handle_reset(ms);
  512. return SUCCESS;
  513. }
  514. /*
  515.  * If we leave drives set for synchronous transfers (especially
  516.  * CDROMs), and reboot to MacOS, it gets confused, poor thing.
  517.  * So, on reboot we reset the SCSI bus.
  518.  */
  519. static int
  520. mesh_notify_reboot(struct notifier_block *this, unsigned long code, void *x)
  521. {
  522. struct mesh_state *ms;
  523. volatile struct mesh_regs *mr;
  524. if (code == SYS_DOWN) {
  525. printk(KERN_INFO "resetting MESH scsi bus(es)n");
  526. for (ms = all_meshes; ms != 0; ms = ms->next) {
  527. mr = ms->mesh;
  528. out_8(&mr->intr_mask, 0);
  529. out_8(&mr->interrupt,
  530.       INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
  531. out_8(&mr->bus_status1, BS1_RST);
  532. udelay(30);
  533. out_8(&mr->bus_status1, 0);
  534. }
  535. }
  536. return NOTIFY_DONE;
  537. }
  538. /* Called with  meshinterrupt disabled, initialize the chipset
  539.  * and eventually do the initial bus reset. The lock must not be
  540.  * held since we can schedule.
  541.  */
  542. static void
  543. mesh_init(struct mesh_state *ms)
  544. {
  545. volatile struct mesh_regs *mr = ms->mesh;
  546. volatile struct dbdma_regs *md = ms->dma;
  547. udelay(100);
  548. /* Reset controller */
  549. out_le32(&md->control, (RUN|PAUSE|FLUSH|WAKE) << 16); /* stop dma */
  550. out_8(&mr->exception, 0xff); /* clear all exception bits */
  551. out_8(&mr->error, 0xff); /* clear all error bits */
  552. out_8(&mr->sequence, SEQ_RESETMESH);
  553. udelay(10);
  554. out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
  555. out_8(&mr->source_id, ms->host->this_id);
  556. out_8(&mr->sel_timeout, 25); /* 250ms */
  557. out_8(&mr->sync_params, ASYNC_PARAMS);
  558. if (init_reset_delay) {
  559. printk(KERN_INFO "mesh: performing initial bus reset...n");
  560. /* Reset bus */
  561. out_8(&mr->bus_status1, BS1_RST); /* assert RST */
  562. udelay(30); /* leave it on for >= 25us */
  563. out_8(&mr->bus_status1, 0); /* negate RST */
  564. /* Wait for bus to come back */
  565. current->state = TASK_UNINTERRUPTIBLE;
  566. schedule_timeout((init_reset_delay * HZ) / 1000);
  567. }
  568. /* Reconfigure controller */
  569. out_8(&mr->interrupt, 0xff); /* clear all interrupt bits */
  570. out_8(&mr->sequence, SEQ_FLUSHFIFO);
  571. udelay(1);
  572. out_8(&mr->sync_params, ASYNC_PARAMS);
  573. out_8(&mr->sequence, SEQ_ENBRESEL);
  574. ms->phase = idle;
  575. ms->msgphase = msg_none;
  576. }
  577. /*
  578.  * Start the next command for a MESH.
  579.  * Should be called with interrupts disabled.
  580.  */
  581. static void
  582. mesh_start(struct mesh_state *ms)
  583. {
  584. Scsi_Cmnd *cmd, *prev, *next;
  585. if (ms->phase != idle || ms->current_req != NULL) {
  586. printk(KERN_ERR "inappropriate mesh_start (phase=%d, ms=%p)",
  587.        ms->phase, ms);
  588. return;
  589. }
  590. while (ms->phase == idle) {
  591. prev = NULL;
  592. for (cmd = ms->request_q; ; cmd = (Scsi_Cmnd *) cmd->host_scribble) {
  593. if (cmd == NULL)
  594. return;
  595. if (ms->tgts[cmd->target].current_req == NULL)
  596. break;
  597. prev = cmd;
  598. }
  599. next = (Scsi_Cmnd *) cmd->host_scribble;
  600. if (prev == NULL)
  601. ms->request_q = next;
  602. else
  603. prev->host_scribble = (void *) next;
  604. if (next == NULL)
  605. ms->request_qtail = prev;
  606. mesh_start_cmd(ms, cmd);
  607. }
  608. }
  609. static void
  610. mesh_start_cmd(struct mesh_state *ms, Scsi_Cmnd *cmd)
  611. {
  612. volatile struct mesh_regs *mr = ms->mesh;
  613. int t;
  614. ms->current_req = cmd;
  615. ms->tgts[cmd->target].data_goes_out = data_goes_out(cmd);
  616. ms->tgts[cmd->target].current_req = cmd;
  617. #if 1
  618. if (DEBUG_TARGET(cmd)) {
  619. int i;
  620. printk(KERN_DEBUG "mesh_start: %p ser=%lu tgt=%d cmd=",
  621.        cmd, cmd->serial_number, cmd->target);
  622. for (i = 0; i < cmd->cmd_len; ++i)
  623. printk(" %x", cmd->cmnd[i]);
  624. printk(" use_sg=%d buffer=%p bufflen=%un",
  625.        cmd->use_sg, cmd->request_buffer, cmd->request_bufflen);
  626. }
  627. #endif
  628. if (ms->dma_started)
  629. panic("mesh: double DMA start !n");
  630. ms->phase = arbitrating;
  631. ms->msgphase = msg_none;
  632. ms->data_ptr = 0;
  633. ms->dma_started = 0;
  634. ms->n_msgout = 0;
  635. ms->last_n_msgout = 0;
  636. ms->expect_reply = 0;
  637. ms->conn_tgt = cmd->target;
  638. ms->tgts[cmd->target].saved_ptr = 0;
  639. ms->stat = DID_OK;
  640. ms->aborting = 0;
  641. #ifdef MESH_DBG
  642. ms->tgts[cmd->target].n_log = 0;
  643. dlog(ms, "start cmd=%x", (int) cmd);
  644. #endif
  645. /* Off we go */
  646. dlog(ms, "about to arb, intr/exc/err/fc=%.8x",
  647.      MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count));
  648. out_8(&mr->interrupt, INT_CMDDONE);
  649. out_8(&mr->sequence, SEQ_ENBRESEL);
  650. udelay(1);
  651. if (mr->bus_status1 & (BS1_BSY | BS1_SEL)) {
  652. /*
  653.  * Some other device has the bus or is arbitrating for it -
  654.  * probably a target which is about to reselect us.
  655.  */
  656. dlog(ms, "busy b4 arb, intr/exc/err/fc=%.8x",
  657.      MKWORD(mr->interrupt, mr->exception,
  658.     mr->error, mr->fifo_count));
  659. for (t = 100; t > 0; --t) {
  660. if ((mr->bus_status1 & (BS1_BSY | BS1_SEL)) == 0)
  661. break;
  662. if (in_8(&mr->interrupt) != 0) {
  663. dlog(ms, "intr b4 arb, intr/exc/err/fc=%.8x",
  664.      MKWORD(mr->interrupt, mr->exception,
  665.     mr->error, mr->fifo_count));
  666. mesh_interrupt(0, (void *)ms, 0);
  667. if (ms->phase != arbitrating)
  668. return;
  669. }
  670. udelay(1);
  671. }
  672. if (mr->bus_status1 & (BS1_BSY | BS1_SEL)) {
  673. /* XXX should try again in a little while */
  674. ms->stat = DID_BUS_BUSY;
  675. ms->phase = idle;
  676. mesh_done(ms, 0);
  677. return;
  678. }
  679. }
  680. /*
  681.  * Apparently the mesh has a bug where it will assert both its
  682.  * own bit and the target's bit on the bus during arbitration.
  683.  */
  684. out_8(&mr->dest_id, mr->source_id);
  685. /*
  686.  * There appears to be a race with reselection sometimes,
  687.  * where a target reselects us just as we issue the
  688.  * arbitrate command.  It seems that then the arbitrate
  689.  * command just hangs waiting for the bus to be free
  690.  * without giving us a reselection exception.
  691.  * The only way I have found to get it to respond correctly
  692.  * is this: disable reselection before issuing the arbitrate
  693.  * command, then after issuing it, if it looks like a target
  694.  * is trying to reselect us, reset the mesh and then enable
  695.  * reselection.
  696.  */
  697. out_8(&mr->sequence, SEQ_DISRESEL);
  698. if (in_8(&mr->interrupt) != 0) {
  699. dlog(ms, "intr after disresel, intr/exc/err/fc=%.8x",
  700.      MKWORD(mr->interrupt, mr->exception,
  701.     mr->error, mr->fifo_count));
  702. mesh_interrupt(0, (void *)ms, 0);
  703. if (ms->phase != arbitrating)
  704. return;
  705. dlog(ms, "after intr after disresel, intr/exc/err/fc=%.8x",
  706.      MKWORD(mr->interrupt, mr->exception,
  707.     mr->error, mr->fifo_count));
  708. }
  709. out_8(&mr->sequence, SEQ_ARBITRATE);
  710. for (t = 230; t > 0; --t) {
  711. if (in_8(&mr->interrupt) != 0)
  712. break;
  713. udelay(1);
  714. }
  715. dlog(ms, "after arb, intr/exc/err/fc=%.8x",
  716.      MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count));
  717. if (mr->interrupt == 0 && (mr->bus_status1 & BS1_SEL)
  718.     && (mr->bus_status0 & BS0_IO)) {
  719. /* looks like a reselection - try resetting the mesh */
  720. dlog(ms, "resel? after arb, intr/exc/err/fc=%.8x",
  721.      MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count));
  722. out_8(&mr->sequence, SEQ_RESETMESH);
  723. udelay(10);
  724. out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
  725. out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
  726. out_8(&mr->sequence, SEQ_ENBRESEL);
  727. for (t = 10; t > 0 && mr->interrupt == 0; --t)
  728. udelay(1);
  729. dlog(ms, "tried reset after arb, intr/exc/err/fc=%.8x",
  730.      MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count));
  731. #ifndef MESH_MULTIPLE_HOSTS
  732. if (mr->interrupt == 0 && (mr->bus_status1 & BS1_SEL)
  733.     && (mr->bus_status0 & BS0_IO)) {
  734. printk(KERN_ERR "mesh: controller not responding"
  735.        " to reselection!n");
  736. /*
  737.  * If this is a target reselecting us, and the
  738.  * mesh isn't responding, the higher levels of
  739.  * the scsi code will eventually time out and
  740.  * reset the bus.
  741.  */
  742. }
  743. #endif
  744. }
  745. }
  746. static inline void
  747. add_sdtr_msg(struct mesh_state *ms)
  748. {
  749. int i = ms->n_msgout;
  750. ms->msgout[i] = EXTENDED_MESSAGE;
  751. ms->msgout[i+1] = 3;
  752. ms->msgout[i+2] = EXTENDED_SDTR;
  753. ms->msgout[i+3] = mesh_sync_period/4;
  754. ms->msgout[i+4] = (ALLOW_SYNC(ms->conn_tgt)? mesh_sync_offset: 0);
  755. ms->n_msgout = i + 5;
  756. }
  757. static void
  758. set_sdtr(struct mesh_state *ms, int period, int offset)
  759. {
  760. struct mesh_target *tp = &ms->tgts[ms->conn_tgt];
  761. volatile struct mesh_regs *mr = ms->mesh;
  762. int v, tr;
  763. tp->sdtr_state = sdtr_done;
  764. if (offset == 0) {
  765. /* asynchronous */
  766. if (SYNC_OFF(tp->sync_params))
  767. printk(KERN_INFO "mesh: target %d now asynchronousn",
  768.        ms->conn_tgt);
  769. tp->sync_params = ASYNC_PARAMS;
  770. out_8(&mr->sync_params, ASYNC_PARAMS);
  771. return;
  772. }
  773. /*
  774.  * We need to compute ceil(clk_freq * period / 500e6) - 2
  775.  * without incurring overflow.
  776.  */
  777. v = (ms->clk_freq / 5000) * period;
  778. if (v <= 250000) {
  779. /* special case: sync_period == 5 * clk_period */
  780. v = 0;
  781. /* units of tr are 100kB/s */
  782. tr = (ms->clk_freq + 250000) / 500000;
  783. } else {
  784. /* sync_period == (v + 2) * 2 * clk_period */
  785. v = (v + 99999) / 100000 - 2;
  786. if (v > 15)
  787. v = 15; /* oops */
  788. tr = ((ms->clk_freq / (v + 2)) + 199999) / 200000;
  789. }
  790. if (offset > 15)
  791. offset = 15; /* can't happen */
  792. tp->sync_params = SYNC_PARAMS(offset, v);
  793. out_8(&mr->sync_params, tp->sync_params);
  794. printk(KERN_INFO "mesh: target %d synchronous at %d.%d MB/sn",
  795.        ms->conn_tgt, tr/10, tr%10);
  796. }
  797. static void
  798. start_phase(struct mesh_state *ms)
  799. {
  800. int i, seq, nb;
  801. volatile struct mesh_regs *mr = ms->mesh;
  802. volatile struct dbdma_regs *md = ms->dma;
  803. Scsi_Cmnd *cmd = ms->current_req;
  804. struct mesh_target *tp = &ms->tgts[ms->conn_tgt];
  805. dlog(ms, "start_phase nmo/exc/fc/seq = %.8x",
  806.      MKWORD(ms->n_msgout, mr->exception, mr->fifo_count, mr->sequence));
  807. out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
  808. seq = use_active_neg + (ms->n_msgout? SEQ_ATN: 0);
  809. switch (ms->msgphase) {
  810. case msg_none:
  811. break;
  812. case msg_in:
  813. out_8(&mr->count_hi, 0);
  814. out_8(&mr->count_lo, 1);
  815. out_8(&mr->sequence, SEQ_MSGIN + seq);
  816. ms->n_msgin = 0;
  817. return;
  818. case msg_out:
  819. /*
  820.  * To make sure ATN drops before we assert ACK for
  821.  * the last byte of the message, we have to do the
  822.  * last byte specially.
  823.  */
  824. if (ms->n_msgout <= 0) {
  825. printk(KERN_ERR "mesh: msg_out but n_msgout=%dn",
  826.        ms->n_msgout);
  827. mesh_dump_regs(ms);
  828. ms->msgphase = msg_none;
  829. break;
  830. }
  831. if (ALLOW_DEBUG(ms->conn_tgt)) {
  832. printk(KERN_DEBUG "mesh: sending %d msg bytes:",
  833.        ms->n_msgout);
  834. for (i = 0; i < ms->n_msgout; ++i)
  835. printk(" %x", ms->msgout[i]);
  836. printk("n");
  837. }
  838. dlog(ms, "msgout msg=%.8x", MKWORD(ms->n_msgout, ms->msgout[0],
  839. ms->msgout[1], ms->msgout[2]));
  840. out_8(&mr->count_hi, 0);
  841. out_8(&mr->sequence, SEQ_FLUSHFIFO);
  842. udelay(1);
  843. /*
  844.  * If ATN is not already asserted, we assert it, then
  845.  * issue a SEQ_MSGOUT to get the mesh to drop ACK.
  846.  */
  847. if ((mr->bus_status0 & BS0_ATN) == 0) {
  848. dlog(ms, "bus0 was %.2x explictly asserting ATN", mr->bus_status0);
  849. out_8(&mr->bus_status0, BS0_ATN); /* explicit ATN */
  850. udelay(1);
  851. out_8(&mr->count_lo, 1);
  852. out_8(&mr->sequence, SEQ_MSGOUT + seq);
  853. out_8(&mr->bus_status0, 0); /* release explicit ATN */
  854. dlog(ms,"hace: after explicit ATN bus0=%.2x",mr->bus_status0);
  855. }
  856. if (ms->n_msgout == 1) {
  857. /*
  858.  * We can't issue the SEQ_MSGOUT without ATN
  859.  * until the target has asserted REQ.  The logic
  860.  * in cmd_complete handles both situations:
  861.  * REQ already asserted or not.
  862.  */
  863. cmd_complete(ms);
  864. } else {
  865. out_8(&mr->count_lo, ms->n_msgout - 1);
  866. out_8(&mr->sequence, SEQ_MSGOUT + seq);
  867. for (i = 0; i < ms->n_msgout - 1; ++i)
  868. out_8(&mr->fifo, ms->msgout[i]);
  869. }
  870. return;
  871. default:
  872. printk(KERN_ERR "mesh bug: start_phase msgphase=%dn",
  873.        ms->msgphase);
  874. }
  875. switch (ms->phase) {
  876. case selecting:
  877. out_8(&mr->dest_id, ms->conn_tgt);
  878. out_8(&mr->sequence, SEQ_SELECT + SEQ_ATN);
  879. break;
  880. case commanding:
  881. out_8(&mr->sync_params, tp->sync_params);
  882. out_8(&mr->count_hi, 0);
  883. if (cmd) {
  884. out_8(&mr->count_lo, cmd->cmd_len);
  885. out_8(&mr->sequence, SEQ_COMMAND + seq);
  886. for (i = 0; i < cmd->cmd_len; ++i)
  887. out_8(&mr->fifo, cmd->cmnd[i]);
  888. } else {
  889. out_8(&mr->count_lo, 6);
  890. out_8(&mr->sequence, SEQ_COMMAND + seq);
  891. for (i = 0; i < 6; ++i)
  892. out_8(&mr->fifo, 0);
  893. }
  894. break;
  895. case dataing:
  896. /* transfer data, if any */
  897. if (!ms->dma_started) {
  898. set_dma_cmds(ms, cmd);
  899. out_le32(&md->cmdptr, virt_to_phys(ms->dma_cmds));
  900. out_le32(&md->control, (RUN << 16) | RUN);
  901. ms->dma_started = 1;
  902. }
  903. nb = ms->dma_count;
  904. if (nb > 0xfff0)
  905. nb = 0xfff0;
  906. ms->dma_count -= nb;
  907. ms->data_ptr += nb;
  908. out_8(&mr->count_lo, nb);
  909. out_8(&mr->count_hi, nb >> 8);
  910. out_8(&mr->sequence, (tp->data_goes_out?
  911. SEQ_DATAOUT: SEQ_DATAIN) + SEQ_DMA_MODE + seq);
  912. break;
  913. case statusing:
  914. out_8(&mr->count_hi, 0);
  915. out_8(&mr->count_lo, 1);
  916. out_8(&mr->sequence, SEQ_STATUS + seq);
  917. break;
  918. case busfreeing:
  919. case disconnecting:
  920. out_8(&mr->sequence, SEQ_ENBRESEL);
  921. udelay(1);
  922. dlog(ms, "enbresel intr/exc/err/fc=%.8x",
  923.      MKWORD(mr->interrupt, mr->exception, mr->error,
  924.     mr->fifo_count));
  925. out_8(&mr->sequence, SEQ_BUSFREE);
  926. break;
  927. default:
  928. printk(KERN_ERR "mesh: start_phase called with phase=%dn",
  929.        ms->phase);
  930. dumpslog(ms);
  931. }
  932. }
  933. static inline void
  934. get_msgin(struct mesh_state *ms)
  935. {
  936. volatile struct mesh_regs *mr = ms->mesh;
  937. int i, n;
  938. n = mr->fifo_count;
  939. if (n != 0) {
  940. i = ms->n_msgin;
  941. ms->n_msgin = i + n;
  942. for (; n > 0; --n)
  943. ms->msgin[i++] = in_8(&mr->fifo);
  944. }
  945. }
  946. static inline int
  947. msgin_length(struct mesh_state *ms)
  948. {
  949. int b, n;
  950. n = 1;
  951. if (ms->n_msgin > 0) {
  952. b = ms->msgin[0];
  953. if (b == 1) {
  954. /* extended message */
  955. n = ms->n_msgin < 2? 2: ms->msgin[1] + 2;
  956. } else if (0x20 <= b && b <= 0x2f) {
  957. /* 2-byte message */
  958. n = 2;
  959. }
  960. }
  961. return n;
  962. }
  963. static void
  964. cmd_complete(struct mesh_state *ms)
  965. {
  966. volatile struct mesh_regs *mr = ms->mesh;
  967. Scsi_Cmnd *cmd = ms->current_req;
  968. struct mesh_target *tp = &ms->tgts[ms->conn_tgt];
  969. int seq, n, t;
  970. dlog(ms, "cmd_complete fc=%x", mr->fifo_count);
  971. seq = use_active_neg + (ms->n_msgout? SEQ_ATN: 0);
  972. switch (ms->msgphase) {
  973. case msg_out_xxx:
  974. /* huh?  we expected a phase mismatch */
  975. ms->n_msgin = 0;
  976. ms->msgphase = msg_in;
  977. /* fall through */
  978. case msg_in:
  979. /* should have some message bytes in fifo */
  980. get_msgin(ms);
  981. n = msgin_length(ms);
  982. if (ms->n_msgin < n) {
  983. out_8(&mr->count_lo, n - ms->n_msgin);
  984. out_8(&mr->sequence, SEQ_MSGIN + seq);
  985. } else {
  986. ms->msgphase = msg_none;
  987. handle_msgin(ms);
  988. start_phase(ms);
  989. }
  990. break;
  991. case msg_in_bad:
  992. out_8(&mr->sequence, SEQ_FLUSHFIFO);
  993. udelay(1);
  994. out_8(&mr->count_lo, 1);
  995. out_8(&mr->sequence, SEQ_MSGIN + SEQ_ATN + use_active_neg);
  996. break;
  997. case msg_out:
  998. /*
  999.  * To get the right timing on ATN wrt ACK, we have
  1000.  * to get the MESH to drop ACK, wait until REQ gets
  1001.  * asserted, then drop ATN.  To do this we first
  1002.  * issue a SEQ_MSGOUT with ATN and wait for REQ,
  1003.  * then change the command to a SEQ_MSGOUT w/o ATN.
  1004.  * If we don't see REQ in a reasonable time, we
  1005.  * change the command to SEQ_MSGIN with ATN,
  1006.  * wait for the phase mismatch interrupt, then
  1007.  * issue the SEQ_MSGOUT without ATN.
  1008.  */
  1009. out_8(&mr->count_lo, 1);
  1010. out_8(&mr->sequence, SEQ_MSGOUT + use_active_neg + SEQ_ATN);
  1011. t = 30; /* wait up to 30us */
  1012. while ((mr->bus_status0 & BS0_REQ) == 0 && --t >= 0)
  1013. udelay(1);
  1014. dlog(ms, "last_mbyte err/exc/fc/cl=%.8x",
  1015.      MKWORD(mr->error, mr->exception,
  1016.     mr->fifo_count, mr->count_lo));
  1017. if (in_8(&mr->interrupt) & (INT_ERROR | INT_EXCEPTION)) {
  1018. /* whoops, target didn't do what we expected */
  1019. ms->last_n_msgout = ms->n_msgout;
  1020. ms->n_msgout = 0;
  1021. if (in_8(&mr->interrupt) & INT_ERROR) {
  1022. printk(KERN_ERR "mesh: error %x in msg_outn",
  1023.        in_8(&mr->error));
  1024. handle_error(ms);
  1025. return;
  1026. }
  1027. if (in_8(&mr->exception) != EXC_PHASEMM)
  1028. printk(KERN_ERR "mesh: exc %x in msg_outn",
  1029.        in_8(&mr->exception));
  1030. else
  1031. printk(KERN_DEBUG "mesh: bs0=%x in msg_outn",
  1032.        in_8(&mr->bus_status0));
  1033. handle_exception(ms);
  1034. return;
  1035. }
  1036. if (mr->bus_status0 & BS0_REQ) {
  1037. out_8(&mr->sequence, SEQ_MSGOUT + use_active_neg);
  1038. udelay(1);
  1039. out_8(&mr->fifo, ms->msgout[ms->n_msgout-1]);
  1040. ms->msgphase = msg_out_last;
  1041. } else {
  1042. out_8(&mr->sequence, SEQ_MSGIN + use_active_neg + SEQ_ATN);
  1043. ms->msgphase = msg_out_xxx;
  1044. }
  1045. break;
  1046. case msg_out_last:
  1047. ms->last_n_msgout = ms->n_msgout;
  1048. ms->n_msgout = 0;
  1049. ms->msgphase = ms->expect_reply? msg_in: msg_none;
  1050. start_phase(ms);
  1051. break;
  1052. case msg_none:
  1053. switch (ms->phase) {
  1054. case idle:
  1055. printk(KERN_ERR "mesh: interrupt in idle phase?n");
  1056. dumpslog(ms);
  1057. return;
  1058. case selecting:
  1059. dlog(ms, "Selecting phase at command completion",0);
  1060. ms->msgout[0] = IDENTIFY(ALLOW_RESEL(ms->conn_tgt),
  1061.  (cmd? cmd->lun: 0));
  1062. ms->n_msgout = 1;
  1063. ms->expect_reply = 0;
  1064. if (ms->aborting) {
  1065. ms->msgout[0] = ABORT;
  1066. ms->n_msgout++;
  1067. } else if (tp->sdtr_state == do_sdtr) {
  1068. /* add SDTR message */
  1069. add_sdtr_msg(ms);
  1070. ms->expect_reply = 1;
  1071. tp->sdtr_state = sdtr_sent;
  1072. }
  1073. ms->msgphase = msg_out;
  1074. /*
  1075.  * We need to wait for REQ before dropping ATN.
  1076.  * We wait for at most 30us, then fall back to
  1077.  * a scheme where we issue a SEQ_COMMAND with ATN,
  1078.  * which will give us a phase mismatch interrupt
  1079.  * when REQ does come, and then we send the message.
  1080.  */
  1081. t = 230; /* wait up to 230us */
  1082. while ((mr->bus_status0 & BS0_REQ) == 0) {
  1083. if (--t < 0) {
  1084. dlog(ms, "impatient for req", ms->n_msgout);
  1085. ms->msgphase = msg_none;
  1086. break;
  1087. }
  1088. udelay(1);
  1089. }
  1090. break;
  1091. case dataing:
  1092. if (ms->dma_count != 0) {
  1093. start_phase(ms);
  1094. return;
  1095. }
  1096. /*
  1097.  * We can get a phase mismatch here if the target
  1098.  * changes to the status phase, even though we have
  1099.  * had a command complete interrupt.  Then, if we
  1100.  * issue the SEQ_STATUS command, we'll get a sequence
  1101.  * error interrupt.  Which isn't so bad except that
  1102.  * occasionally the mesh actually executes the
  1103.  * SEQ_STATUS *as well as* giving us the sequence
  1104.  * error and phase mismatch exception.
  1105.  */
  1106. out_8(&mr->sequence, 0);
  1107. out_8(&mr->interrupt,
  1108.       INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
  1109. halt_dma(ms);
  1110. break;
  1111. case statusing:
  1112. if (cmd) {
  1113. cmd->SCp.Status = mr->fifo;
  1114. if (DEBUG_TARGET(cmd))
  1115. printk(KERN_DEBUG "mesh: status is %xn",
  1116.        cmd->SCp.Status);
  1117. }
  1118. ms->msgphase = msg_in;
  1119. break;
  1120. case busfreeing:
  1121. mesh_done(ms, 1);
  1122. return;
  1123. case disconnecting:
  1124. ms->current_req = 0;
  1125. ms->phase = idle;
  1126. mesh_start(ms);
  1127. return;
  1128. default:
  1129. break;
  1130. }
  1131. ++ms->phase;
  1132. start_phase(ms);
  1133. break;
  1134. }
  1135. }
  1136. static void phase_mismatch(struct mesh_state *ms)
  1137. {
  1138. volatile struct mesh_regs *mr = ms->mesh;
  1139. int phase;
  1140. dlog(ms, "phasemm ch/cl/seq/fc=%.8x",
  1141.      MKWORD(mr->count_hi, mr->count_lo, mr->sequence, mr->fifo_count));
  1142. phase = mr->bus_status0 & BS0_PHASE;
  1143. if (ms->msgphase == msg_out_xxx && phase == BP_MSGOUT) {
  1144. /* output the last byte of the message, without ATN */
  1145. out_8(&mr->count_lo, 1);
  1146. out_8(&mr->sequence, SEQ_MSGOUT + use_active_neg);
  1147. udelay(1);
  1148. out_8(&mr->fifo, ms->msgout[ms->n_msgout-1]);
  1149. ms->msgphase = msg_out_last;
  1150. return;
  1151. }
  1152. if (ms->msgphase == msg_in) {
  1153. get_msgin(ms);
  1154. if (ms->n_msgin)
  1155. handle_msgin(ms);
  1156. }
  1157. if (ms->dma_started)
  1158. halt_dma(ms);
  1159. if (mr->fifo_count) {
  1160. out_8(&mr->sequence, SEQ_FLUSHFIFO);
  1161. udelay(1);
  1162. }
  1163. ms->msgphase = msg_none;
  1164. switch (phase) {
  1165. case BP_DATAIN:
  1166. ms->tgts[ms->conn_tgt].data_goes_out = 0;
  1167. ms->phase = dataing;
  1168. break;
  1169. case BP_DATAOUT:
  1170. ms->tgts[ms->conn_tgt].data_goes_out = 1;
  1171. ms->phase = dataing;
  1172. break;
  1173. case BP_COMMAND:
  1174. ms->phase = commanding;
  1175. break;
  1176. case BP_STATUS:
  1177. ms->phase = statusing;
  1178. break;
  1179. case BP_MSGIN:
  1180. ms->msgphase = msg_in;
  1181. ms->n_msgin = 0;
  1182. break;
  1183. case BP_MSGOUT:
  1184. ms->msgphase = msg_out;
  1185. if (ms->n_msgout == 0) {
  1186. if (ms->aborting) {
  1187. do_abort(ms);
  1188. } else {
  1189. if (ms->last_n_msgout == 0) {
  1190. printk(KERN_DEBUG
  1191.        "mesh: no msg to repeatn");
  1192. ms->msgout[0] = NOP;
  1193. ms->last_n_msgout = 1;
  1194. }
  1195. ms->n_msgout = ms->last_n_msgout;
  1196. }
  1197. }
  1198. break;
  1199. default:
  1200. printk(KERN_DEBUG "mesh: unknown scsi phase %xn", phase);
  1201. ms->stat = DID_ERROR;
  1202. mesh_done(ms, 1);
  1203. return;
  1204. }
  1205. start_phase(ms);
  1206. }
  1207. static void
  1208. reselected(struct mesh_state *ms)
  1209. {
  1210. volatile struct mesh_regs *mr = ms->mesh;
  1211. Scsi_Cmnd *cmd;
  1212. struct mesh_target *tp;
  1213. int b, t, prev;
  1214. switch (ms->phase) {
  1215. case idle:
  1216. break;
  1217. case arbitrating:
  1218. if ((cmd = ms->current_req) != NULL) {
  1219. /* put the command back on the queue */
  1220. cmd->host_scribble = (void *) ms->request_q;
  1221. if (ms->request_q == NULL)
  1222. ms->request_qtail = cmd;
  1223. ms->request_q = cmd;
  1224. tp = &ms->tgts[cmd->target];
  1225. tp->current_req = NULL;
  1226. }
  1227. break;
  1228. case busfreeing:
  1229. ms->phase = reselecting;
  1230. mesh_done(ms, 0);
  1231. break;
  1232. case disconnecting:
  1233. break;
  1234. default:
  1235. printk(KERN_ERR "mesh: reselected in phase %d/%d tgt %dn",
  1236.        ms->msgphase, ms->phase, ms->conn_tgt);
  1237. dumplog(ms, ms->conn_tgt);
  1238. dumpslog(ms);
  1239. }
  1240. if (ms->dma_started) {
  1241. printk(KERN_ERR "mesh: reselected with DMA started !n");
  1242. halt_dma(ms);
  1243. }
  1244. ms->current_req = NULL;
  1245. ms->phase = dataing;
  1246. ms->msgphase = msg_in;
  1247. ms->n_msgout = 0;
  1248. ms->last_n_msgout = 0;
  1249. prev = ms->conn_tgt;
  1250. /*
  1251.  * We seem to get abortive reselections sometimes.
  1252.  */
  1253. while ((mr->bus_status1 & BS1_BSY) == 0) {
  1254. static int mesh_aborted_resels;
  1255. mesh_aborted_resels++;
  1256. out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
  1257. udelay(1);
  1258. out_8(&mr->sequence, SEQ_ENBRESEL);
  1259. udelay(5);
  1260. dlog(ms, "extra resel err/exc/fc = %.6x",
  1261.      MKWORD(0, mr->error, mr->exception, mr->fifo_count));
  1262. }
  1263. out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
  1264. udelay(1);
  1265. out_8(&mr->sequence, SEQ_ENBRESEL);
  1266. udelay(1);
  1267. out_8(&mr->sync_params, ASYNC_PARAMS);
  1268. /*
  1269.  * Find out who reselected us.
  1270.  */
  1271. if (mr->fifo_count == 0) {
  1272. printk(KERN_ERR "mesh: reselection but nothing in fifo?n");
  1273. ms->conn_tgt = ms->host->this_id;
  1274. goto bogus;
  1275. }
  1276. /* get the last byte in the fifo */
  1277. do {
  1278. b = in_8(&mr->fifo);
  1279. dlog(ms, "reseldata %x", b);
  1280. } while (in_8(&mr->fifo_count));
  1281. for (t = 0; t < 8; ++t)
  1282. if ((b & (1 << t)) != 0 && t != ms->host->this_id)
  1283. break;
  1284. if (b != (1 << t) + (1 << ms->host->this_id)) {
  1285. printk(KERN_ERR "mesh: bad reselection data %xn", b);
  1286. ms->conn_tgt = ms->host->this_id;
  1287. goto bogus;
  1288. }
  1289. /*
  1290.  * Set up to continue with that target's transfer.
  1291.  */
  1292. ms->conn_tgt = t;
  1293. tp = &ms->tgts[t];
  1294. out_8(&mr->sync_params, tp->sync_params);
  1295. if (ALLOW_DEBUG(t)) {
  1296. printk(KERN_DEBUG "mesh: reselected by target %dn", t);
  1297. printk(KERN_DEBUG "mesh: saved_ptr=%x goes_out=%d cmd=%pn",
  1298.        tp->saved_ptr, tp->data_goes_out, tp->current_req);
  1299. }
  1300. ms->current_req = tp->current_req;
  1301. if (tp->current_req == NULL) {
  1302. printk(KERN_ERR "mesh: reselected by tgt %d but no cmd!n", t);
  1303. goto bogus;
  1304. }
  1305. ms->data_ptr = tp->saved_ptr;
  1306. dlog(ms, "resel prev tgt=%d", prev);
  1307. dlog(ms, "resel err/exc=%.4x", MKWORD(0, 0, mr->error, mr->exception));
  1308. start_phase(ms);
  1309. return;
  1310. bogus:
  1311. dumplog(ms, ms->conn_tgt);
  1312. dumpslog(ms);
  1313. ms->data_ptr = 0;
  1314. ms->aborting = 1;
  1315. start_phase(ms);
  1316. }
  1317. static void do_abort(struct mesh_state *ms)
  1318. {
  1319. ms->msgout[0] = ABORT;
  1320. ms->n_msgout = 1;
  1321. ms->aborting = 1;
  1322. ms->stat = DID_ABORT;
  1323. dlog(ms, "abort", 0);
  1324. }
  1325. static void
  1326. handle_reset(struct mesh_state *ms)
  1327. {
  1328. int tgt;
  1329. struct mesh_target *tp;
  1330. Scsi_Cmnd *cmd;
  1331. volatile struct mesh_regs *mr = ms->mesh;
  1332. for (tgt = 0; tgt < 8; ++tgt) {
  1333. tp = &ms->tgts[tgt];
  1334. if ((cmd = tp->current_req) != NULL) {
  1335. cmd->result = DID_RESET << 16;
  1336. tp->current_req = NULL;
  1337. mesh_completed(ms, cmd);
  1338. }
  1339. ms->tgts[tgt].sdtr_state = do_sdtr;
  1340. ms->tgts[tgt].sync_params = ASYNC_PARAMS;
  1341. }
  1342. ms->current_req = NULL;
  1343. while ((cmd = ms->request_q) != NULL) {
  1344. ms->request_q = (Scsi_Cmnd *) cmd->host_scribble;
  1345. cmd->result = DID_RESET << 16;
  1346. mesh_completed(ms, cmd);
  1347. }
  1348. ms->phase = idle;
  1349. ms->msgphase = msg_none;
  1350. out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
  1351. out_8(&mr->sequence, SEQ_FLUSHFIFO);
  1352. udelay(1);
  1353. out_8(&mr->sync_params, ASYNC_PARAMS);
  1354. out_8(&mr->sequence, SEQ_ENBRESEL);
  1355. }
  1356. static void
  1357. do_mesh_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
  1358. {
  1359. unsigned long flags;
  1360. spin_lock_irqsave(&io_request_lock, flags);
  1361. mesh_interrupt(irq, dev_id, ptregs);
  1362. spin_unlock_irqrestore(&io_request_lock, flags);
  1363. }
  1364. static void handle_error(struct mesh_state *ms)
  1365. {
  1366. int err, exc, count;
  1367. volatile struct mesh_regs *mr = ms->mesh;
  1368. err = in_8(&mr->error);
  1369. exc = in_8(&mr->exception);
  1370. out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
  1371. dlog(ms, "error err/exc/fc/cl=%.8x",
  1372.      MKWORD(err, exc, mr->fifo_count, mr->count_lo));
  1373. if (err & ERR_SCSIRESET) {
  1374. /* SCSI bus was reset */
  1375. printk(KERN_INFO "mesh: SCSI bus reset detected: "
  1376.        "waiting for end...");
  1377. while ((mr->bus_status1 & BS1_RST) != 0)
  1378. udelay(1);
  1379. printk("donen");
  1380. handle_reset(ms);
  1381. /* request_q is empty, no point in mesh_start() */
  1382. return;
  1383. }
  1384. if (err & ERR_UNEXPDISC) {
  1385. /* Unexpected disconnect */
  1386. if (exc & EXC_RESELECTED) {
  1387. reselected(ms);
  1388. return;
  1389. }
  1390. if (!ms->aborting) {
  1391. printk(KERN_WARNING "mesh: target %d abortedn",
  1392.        ms->conn_tgt);
  1393. dumplog(ms, ms->conn_tgt);
  1394. dumpslog(ms);
  1395. }
  1396. out_8(&mr->interrupt, INT_CMDDONE);
  1397. ms->stat = DID_ABORT;
  1398. mesh_done(ms, 1);
  1399. return;
  1400. }
  1401. if (err & ERR_PARITY) {
  1402. if (ms->msgphase == msg_in) {
  1403. printk(KERN_ERR "mesh: msg parity error, target %dn",
  1404.        ms->conn_tgt);
  1405. ms->msgout[0] = MSG_PARITY_ERROR;
  1406. ms->n_msgout = 1;
  1407. ms->msgphase = msg_in_bad;
  1408. cmd_complete(ms);
  1409. return;
  1410. }
  1411. if (ms->stat == DID_OK) {
  1412. printk(KERN_ERR "mesh: parity error, target %dn",
  1413.        ms->conn_tgt);
  1414. ms->stat = DID_PARITY;
  1415. }
  1416. count = (mr->count_hi << 8) + mr->count_lo;
  1417. if (count == 0) {
  1418. cmd_complete(ms);
  1419. } else {
  1420. /* reissue the data transfer command */
  1421. out_8(&mr->sequence, mr->sequence);
  1422. }
  1423. return;
  1424. }
  1425. if (err & ERR_SEQERR) {
  1426. if (exc & EXC_RESELECTED) {
  1427. /* This can happen if we issue a command to
  1428.    get the bus just after the target reselects us. */
  1429. static int mesh_resel_seqerr;
  1430. mesh_resel_seqerr++;
  1431. reselected(ms);
  1432. return;
  1433. }
  1434. if (exc == EXC_PHASEMM) {
  1435. static int mesh_phasemm_seqerr;
  1436. mesh_phasemm_seqerr++;
  1437. phase_mismatch(ms);
  1438. return;
  1439. }
  1440. printk(KERN_ERR "mesh: sequence error (err=%x exc=%x)n",
  1441.        err, exc);
  1442. } else {
  1443. printk(KERN_ERR "mesh: unknown error %x (exc=%x)n", err, exc);
  1444. }
  1445. mesh_dump_regs(ms);
  1446. dumplog(ms, ms->conn_tgt);
  1447. if (ms->phase > selecting && (mr->bus_status1 & BS1_BSY)) {
  1448. /* try to do what the target wants */
  1449. do_abort(ms);
  1450. phase_mismatch(ms);
  1451. return;
  1452. }
  1453. ms->stat = DID_ERROR;
  1454. mesh_done(ms, 1);
  1455. }
  1456. static void handle_exception(struct mesh_state *ms)
  1457. {
  1458. int exc;
  1459. volatile struct mesh_regs *mr = ms->mesh;
  1460. exc = in_8(&mr->exception);
  1461. out_8(&mr->interrupt, INT_EXCEPTION | INT_CMDDONE);
  1462. if (exc & EXC_RESELECTED) {
  1463. static int mesh_resel_exc;
  1464. mesh_resel_exc++;
  1465. reselected(ms);
  1466. } else if (exc == EXC_ARBLOST) {
  1467. printk(KERN_DEBUG "mesh: lost arbitrationn");
  1468. ms->stat = DID_BUS_BUSY;
  1469. mesh_done(ms, 1);
  1470. } else if (exc == EXC_SELTO) {
  1471. /* selection timed out */
  1472. ms->stat = DID_BAD_TARGET;
  1473. mesh_done(ms, 1);
  1474. } else if (exc == EXC_PHASEMM) {
  1475. /* target wants to do something different:
  1476.    find out what it wants and do it. */
  1477. phase_mismatch(ms);
  1478. } else {
  1479. printk(KERN_ERR "mesh: can't cope with exception %xn", exc);
  1480. mesh_dump_regs(ms);
  1481. dumplog(ms, ms->conn_tgt);
  1482. do_abort(ms);
  1483. phase_mismatch(ms);
  1484. }
  1485. }
  1486. static void
  1487. mesh_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
  1488. {
  1489. struct mesh_state *ms = (struct mesh_state *) dev_id;
  1490. volatile struct mesh_regs *mr = ms->mesh;
  1491. int intr;
  1492. #if 0
  1493. if (ALLOW_DEBUG(ms->conn_tgt))
  1494. printk(KERN_DEBUG "mesh_intr, bs0=%x int=%x exc=%x err=%x "
  1495.        "phase=%d msgphase=%dn", mr->bus_status0,
  1496.        mr->interrupt, mr->exception, mr->error,
  1497.        ms->phase, ms->msgphase);
  1498. #endif
  1499. while ((intr = in_8(&mr->interrupt)) != 0) {
  1500. dlog(ms, "interrupt intr/err/exc/seq=%.8x", 
  1501.      MKWORD(intr, mr->error, mr->exception, mr->sequence));
  1502. if (intr & INT_ERROR) {
  1503. handle_error(ms);
  1504. } else if (intr & INT_EXCEPTION) {
  1505. handle_exception(ms);
  1506. } else if (intr & INT_CMDDONE) {
  1507. out_8(&mr->interrupt, INT_CMDDONE);
  1508. cmd_complete(ms);
  1509. }
  1510. }
  1511. }
  1512. static void
  1513. handle_msgin(struct mesh_state *ms)
  1514. {
  1515. int i, code;
  1516. Scsi_Cmnd *cmd = ms->current_req;
  1517. struct mesh_target *tp = &ms->tgts[ms->conn_tgt];
  1518. if (ms->n_msgin == 0)
  1519. return;
  1520. code = ms->msgin[0];
  1521. if (ALLOW_DEBUG(ms->conn_tgt)) {
  1522. printk(KERN_DEBUG "got %d message bytes:", ms->n_msgin);
  1523. for (i = 0; i < ms->n_msgin; ++i)
  1524. printk(" %x", ms->msgin[i]);
  1525. printk("n");
  1526. }
  1527. dlog(ms, "msgin msg=%.8x",
  1528.      MKWORD(ms->n_msgin, code, ms->msgin[1], ms->msgin[2]));
  1529. ms->expect_reply = 0;
  1530. ms->n_msgout = 0;
  1531. if (ms->n_msgin < msgin_length(ms))
  1532. goto reject;
  1533. if (cmd)
  1534. cmd->SCp.Message = code;
  1535. switch (code) {
  1536. case COMMAND_COMPLETE:
  1537. break;
  1538. case EXTENDED_MESSAGE:
  1539. switch (ms->msgin[2]) {
  1540. case EXTENDED_MODIFY_DATA_POINTER:
  1541. ms->data_ptr += (ms->msgin[3] << 24) + ms->msgin[6]
  1542. + (ms->msgin[4] << 16) + (ms->msgin[5] << 8);
  1543. break;
  1544. case EXTENDED_SDTR:
  1545. if (tp->sdtr_state != sdtr_sent) {
  1546. /* reply with an SDTR */
  1547. add_sdtr_msg(ms);
  1548. /* limit period to at least his value,
  1549.    offset to no more than his */
  1550. if (ms->msgout[3] < ms->msgin[3])
  1551. ms->msgout[3] = ms->msgin[3];
  1552. if (ms->msgout[4] > ms->msgin[4])
  1553. ms->msgout[4] = ms->msgin[4];
  1554. set_sdtr(ms, ms->msgout[3], ms->msgout[4]);
  1555. ms->msgphase = msg_out;
  1556. } else {
  1557. set_sdtr(ms, ms->msgin[3], ms->msgin[4]);
  1558. }
  1559. break;
  1560. default:
  1561. goto reject;
  1562. }
  1563. break;
  1564. case SAVE_POINTERS:
  1565. tp->saved_ptr = ms->data_ptr;
  1566. break;
  1567. case RESTORE_POINTERS:
  1568. ms->data_ptr = tp->saved_ptr;
  1569. break;
  1570. case DISCONNECT:
  1571. ms->phase = disconnecting;
  1572. break;
  1573. case ABORT:
  1574. break;
  1575. case MESSAGE_REJECT:
  1576. if (tp->sdtr_state == sdtr_sent)
  1577. set_sdtr(ms, 0, 0);
  1578. break;
  1579. case NOP:
  1580. break;
  1581. default:
  1582. if (IDENTIFY_BASE <= code && code <= IDENTIFY_BASE + 7) {
  1583. if (cmd == NULL) {
  1584. do_abort(ms);
  1585. ms->msgphase = msg_out;
  1586. } else if (code != cmd->lun + IDENTIFY_BASE) {
  1587. printk(KERN_WARNING "mesh: lun mismatch "
  1588.        "(%d != %d) on reselection from "
  1589.        "target %dn", i, cmd->lun,
  1590.        ms->conn_tgt);
  1591. }
  1592. break;
  1593. }
  1594. goto reject;
  1595. }
  1596. return;
  1597.  reject:
  1598. printk(KERN_WARNING "mesh: rejecting message from target %d:",
  1599.        ms->conn_tgt);
  1600. for (i = 0; i < ms->n_msgin; ++i)
  1601. printk(" %x", ms->msgin[i]);
  1602. printk("n");
  1603. ms->msgout[0] = MESSAGE_REJECT;
  1604. ms->n_msgout = 1;
  1605. ms->msgphase = msg_out;
  1606. }
  1607. static void
  1608. mesh_done(struct mesh_state *ms, int start_next)
  1609. {
  1610. Scsi_Cmnd *cmd;
  1611. struct mesh_target *tp = &ms->tgts[ms->conn_tgt];
  1612. cmd = ms->current_req;
  1613. ms->current_req = 0;
  1614. tp->current_req = 0;
  1615. if (cmd) {
  1616. cmd->result = (ms->stat << 16) + cmd->SCp.Status;
  1617. if (ms->stat == DID_OK)
  1618. cmd->result += (cmd->SCp.Message << 8);
  1619. if (DEBUG_TARGET(cmd)) {
  1620. printk(KERN_DEBUG "mesh_done: result = %x, data_ptr=%d, buflen=%dn",
  1621.        cmd->result, ms->data_ptr, cmd->request_bufflen);
  1622. if ((cmd->cmnd[0] == 0 || cmd->cmnd[0] == 0x12 || cmd->cmnd[0] == 3)
  1623.     && cmd->request_buffer != 0) {
  1624. unsigned char *b = cmd->request_buffer;
  1625. printk(KERN_DEBUG "buffer = %x %x %x %x %x %x %x %xn",
  1626.        b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
  1627. }
  1628. }
  1629. cmd->SCp.this_residual -= ms->data_ptr;
  1630. mesh_completed(ms, cmd);
  1631. }
  1632. if (start_next) {
  1633. out_8(&ms->mesh->sequence, SEQ_ENBRESEL);
  1634. udelay(1);
  1635. ms->phase = idle;
  1636. mesh_start(ms);
  1637. }
  1638. }
  1639. static void
  1640. mesh_completed(struct mesh_state *ms, Scsi_Cmnd *cmd)
  1641. {
  1642. (*cmd->scsi_done)(cmd);
  1643. }
  1644. /*
  1645.  * Set up DMA commands for transferring data.
  1646.  */
  1647. static void
  1648. set_dma_cmds(struct mesh_state *ms, Scsi_Cmnd *cmd)
  1649. {
  1650. int i, dma_cmd, total, off, dtot;
  1651. struct scatterlist *scl;
  1652. struct dbdma_cmd *dcmds;
  1653. dma_cmd = ms->tgts[ms->conn_tgt].data_goes_out?
  1654. OUTPUT_MORE: INPUT_MORE;
  1655. dcmds = ms->dma_cmds;
  1656. dtot = 0;
  1657. if (cmd) {
  1658. cmd->SCp.this_residual = cmd->request_bufflen;
  1659. if (cmd->use_sg > 0) {
  1660. int nseg;
  1661. total = 0;
  1662. scl = (struct scatterlist *) cmd->buffer;
  1663. off = ms->data_ptr;
  1664. nseg = pci_map_sg(ms->pdev, scl, cmd->use_sg,
  1665.  scsi_to_pci_dma_dir(cmd ->sc_data_direction));
  1666. for (i = 0; i <nseg; ++i, ++scl) {
  1667. u32 dma_addr = sg_dma_address(scl);
  1668. u32 dma_len = sg_dma_len(scl);
  1669. total += scl->length;
  1670. if (off >= dma_len) {
  1671. off -= dma_len;
  1672. continue;
  1673. }
  1674. if (dma_len > 0xffff)
  1675. panic("mesh: scatterlist element >= 64k");
  1676. st_le16(&dcmds->req_count, dma_len - off);
  1677. st_le16(&dcmds->command, dma_cmd);
  1678. st_le32(&dcmds->phy_addr, dma_addr + off);
  1679. dcmds->xfer_status = 0;
  1680. ++dcmds;
  1681. dtot += dma_len - off;
  1682. off = 0;
  1683. }
  1684. } else if (ms->data_ptr < cmd->request_bufflen) {
  1685. dtot = cmd->request_bufflen - ms->data_ptr;
  1686. if (dtot > 0xffff)
  1687. panic("mesh: transfer size >= 64k");
  1688. st_le16(&dcmds->req_count, dtot);
  1689. /* XXX Use pci DMA API here ... */
  1690. st_le32(&dcmds->phy_addr,
  1691. virt_to_phys(cmd->request_buffer) + ms->data_ptr);
  1692. dcmds->xfer_status = 0;
  1693. ++dcmds;
  1694. }
  1695. }
  1696. if (dtot == 0) {
  1697. /* Either the target has overrun our buffer,
  1698.    or the caller didn't provide a buffer. */
  1699. static char mesh_extra_buf[64];
  1700. dtot = sizeof(mesh_extra_buf);
  1701. st_le16(&dcmds->req_count, dtot);
  1702. st_le32(&dcmds->phy_addr, virt_to_phys(mesh_extra_buf));
  1703. dcmds->xfer_status = 0;
  1704. ++dcmds;
  1705. }
  1706. dma_cmd += OUTPUT_LAST - OUTPUT_MORE;
  1707. st_le16(&dcmds[-1].command, dma_cmd);
  1708. memset(dcmds, 0, sizeof(*dcmds));
  1709. st_le16(&dcmds->command, DBDMA_STOP);
  1710. ms->dma_count = dtot;
  1711. }
  1712. static void
  1713. halt_dma(struct mesh_state *ms)
  1714. {
  1715. volatile struct dbdma_regs *md = ms->dma;
  1716. volatile struct mesh_regs *mr = ms->mesh;
  1717. Scsi_Cmnd *cmd = ms->current_req;
  1718. int t, nb;
  1719. if (!ms->tgts[ms->conn_tgt].data_goes_out) {
  1720. /* wait a little while until the fifo drains */
  1721. t = 50;
  1722. while (t > 0 && mr->fifo_count != 0
  1723.        && (in_le32(&md->status) & ACTIVE) != 0) {
  1724. --t;
  1725. udelay(1);
  1726. }
  1727. }
  1728. out_le32(&md->control, RUN << 16); /* turn off RUN bit */
  1729. nb = (mr->count_hi << 8) + mr->count_lo;
  1730. dlog(ms, "halt_dma fc/count=%.6x",
  1731.      MKWORD(0, mr->fifo_count, 0, nb));
  1732. if (ms->tgts[ms->conn_tgt].data_goes_out)
  1733. nb += mr->fifo_count;
  1734. /* nb is the number of bytes not yet transferred
  1735.    to/from the target. */
  1736. ms->data_ptr -= nb;
  1737. dlog(ms, "data_ptr %x", ms->data_ptr);
  1738. if (ms->data_ptr < 0) {
  1739. printk(KERN_ERR "mesh: halt_dma: data_ptr=%d (nb=%d, ms=%p)n",
  1740.        ms->data_ptr, nb, ms);
  1741. ms->data_ptr = 0;
  1742. #ifdef MESH_DBG
  1743. dumplog(ms, ms->conn_tgt);
  1744. dumpslog(ms);
  1745. #endif /* MESH_DBG */
  1746. } else if (cmd && cmd->request_bufflen != 0 &&
  1747.    ms->data_ptr > cmd->request_bufflen) {
  1748. printk(KERN_DEBUG "mesh: target %d overrun, "
  1749.        "data_ptr=%x total=%x goes_out=%dn",
  1750.        ms->conn_tgt, ms->data_ptr, cmd->request_bufflen,
  1751.        ms->tgts[ms->conn_tgt].data_goes_out);
  1752. }
  1753. if (cmd->use_sg != 0) {
  1754. struct scatterlist *sg;
  1755. sg = (struct scatterlist *)cmd->request_buffer;
  1756. pci_unmap_sg(ms->pdev, sg, cmd->use_sg,
  1757.      scsi_to_pci_dma_dir(cmd->sc_data_direction));
  1758. }
  1759. ms->dma_started = 0;
  1760. }
  1761. /*
  1762.  * Work out whether we expect data to go out from the host adaptor or into it.
  1763.  * (If this information is available from somewhere else in the scsi
  1764.  * code, somebody please let me know :-)
  1765.  */
  1766. static int
  1767. data_goes_out(Scsi_Cmnd *cmd)
  1768. {
  1769. switch (cmd->cmnd[0]) {
  1770. case CHANGE_DEFINITION: 
  1771. case COMPARE:   
  1772. case COPY:
  1773. case COPY_VERIFY:     
  1774. case FORMAT_UNIT:  
  1775. case LOG_SELECT:
  1776. case MEDIUM_SCAN:   
  1777. case MODE_SELECT:
  1778. case MODE_SELECT_10:
  1779. case REASSIGN_BLOCKS: 
  1780. case RESERVE:
  1781. case SEARCH_EQUAL:   
  1782. case SEARCH_EQUAL_12: 
  1783. case SEARCH_HIGH:  
  1784. case SEARCH_HIGH_12:  
  1785. case SEARCH_LOW:
  1786. case SEARCH_LOW_12:
  1787. case SEND_DIAGNOSTIC: 
  1788. case SEND_VOLUME_TAG:      
  1789. case SET_WINDOW: 
  1790. case UPDATE_BLOCK:
  1791. case WRITE_BUFFER:
  1792.   case WRITE_6:
  1793. case WRITE_10:
  1794. case WRITE_12:   
  1795. case WRITE_LONG:
  1796. case WRITE_LONG_2:      /* alternate code for WRITE_LONG */
  1797. case WRITE_SAME:
  1798. case WRITE_VERIFY:
  1799. case WRITE_VERIFY_12:
  1800. return 1;
  1801. default:
  1802. return 0;
  1803. }
  1804. }
  1805. #ifdef MESH_DBG
  1806. static inline u32 readtb(void)
  1807. {
  1808. u32 tb;
  1809. #ifdef DBG_USE_TB
  1810. /* Beware: if you enable this, it will crash on 601s. */
  1811. asm ("mftb %0" : "=r" (tb) : );
  1812. #else
  1813. tb = 0;
  1814. #endif
  1815. return tb;
  1816. }
  1817. static void dlog(struct mesh_state *ms, char *fmt, int a)
  1818. {
  1819. struct mesh_target *tp = &ms->tgts[ms->conn_tgt];
  1820. struct dbglog *tlp, *slp;
  1821. tlp = &tp->log[tp->log_ix];
  1822. slp = &ms->log[ms->log_ix];
  1823. tlp->fmt = fmt;
  1824. tlp->tb = readtb();
  1825. tlp->phase = (ms->msgphase << 4) + ms->phase;
  1826. tlp->bs0 = ms->mesh->bus_status0;
  1827. tlp->bs1 = ms->mesh->bus_status1;
  1828. tlp->tgt = ms->conn_tgt;
  1829. tlp->d = a;
  1830. *slp = *tlp;
  1831. if (++tp->log_ix >= N_DBG_LOG)
  1832. tp->log_ix = 0;
  1833. if (tp->n_log < N_DBG_LOG)
  1834. ++tp->n_log;
  1835. if (++ms->log_ix >= N_DBG_SLOG)
  1836. ms->log_ix = 0;
  1837. if (ms->n_log < N_DBG_SLOG)
  1838. ++ms->n_log;
  1839. }
  1840. static void dumplog(struct mesh_state *ms, int t)
  1841. {
  1842. struct mesh_target *tp = &ms->tgts[t];
  1843. struct dbglog *lp;
  1844. int i;
  1845. if (tp->n_log == 0)
  1846. return;
  1847. i = tp->log_ix - tp->n_log;
  1848. if (i < 0)
  1849. i += N_DBG_LOG;
  1850. tp->n_log = 0;
  1851. do {
  1852. lp = &tp->log[i];
  1853. printk(KERN_DEBUG "mesh log %d: bs=%.2x%.2x ph=%.2x ",
  1854.        t, lp->bs1, lp->bs0, lp->phase);
  1855. #ifdef DBG_USE_TB
  1856. printk("tb=%10u ", lp->tb);
  1857. #endif
  1858. printk(lp->fmt, lp->d);
  1859. printk("n");
  1860. if (++i >= N_DBG_LOG)
  1861. i = 0;
  1862. } while (i != tp->log_ix);
  1863. }
  1864. static void dumpslog(struct mesh_state *ms)
  1865. {
  1866. struct dbglog *lp;
  1867. int i;
  1868. if (ms->n_log == 0)
  1869. return;
  1870. i = ms->log_ix - ms->n_log;
  1871. if (i < 0)
  1872. i += N_DBG_SLOG;
  1873. ms->n_log = 0;
  1874. do {
  1875. lp = &ms->log[i];
  1876. printk(KERN_DEBUG "mesh log: bs=%.2x%.2x ph=%.2x t%d ",
  1877.        lp->bs1, lp->bs0, lp->phase, lp->tgt);
  1878. #ifdef DBG_USE_TB
  1879. printk("tb=%10u ", lp->tb);
  1880. #endif
  1881. printk(lp->fmt, lp->d);
  1882. printk("n");
  1883. if (++i >= N_DBG_SLOG)
  1884. i = 0;
  1885. } while (i != ms->log_ix);
  1886. }
  1887. #endif /* MESH_DBG */
  1888. static Scsi_Host_Template driver_template = SCSI_MESH;
  1889. #include "scsi_module.c"