53c700.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:67k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* -*- mode: c; c-basic-offset: 8 -*- */
  2. /* NCR (or Symbios) 53c700 and 53c700-66 Driver
  3.  *
  4.  * Copyright (C) 2001 by James.Bottomley@HansenPartnership.com
  5. **-----------------------------------------------------------------------------
  6. **  
  7. **  This program is free software; you can redistribute it and/or modify
  8. **  it under the terms of the GNU General Public License as published by
  9. **  the Free Software Foundation; either version 2 of the License, or
  10. **  (at your option) any later version.
  11. **
  12. **  This program is distributed in the hope that it will be useful,
  13. **  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. **  GNU General Public License for more details.
  16. **
  17. **  You should have received a copy of the GNU General Public License
  18. **  along with this program; if not, write to the Free Software
  19. **  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. **
  21. **-----------------------------------------------------------------------------
  22.  */
  23. /* Notes:
  24.  *
  25.  * This driver is designed exclusively for these chips (virtually the
  26.  * earliest of the scripts engine chips).  They need their own drivers
  27.  * because they are missing so many of the scripts and snazzy register
  28.  * features of their elder brothers (the 710, 720 and 770).
  29.  *
  30.  * The 700 is the lowliest of the line, it can only do async SCSI.
  31.  * The 700-66 can at least do synchronous SCSI up to 10MHz.
  32.  * 
  33.  * The 700 chip has no host bus interface logic of its own.  However,
  34.  * it is usually mapped to a location with well defined register
  35.  * offsets.  Therefore, if you can determine the base address and the
  36.  * irq your board incorporating this chip uses, you can probably use
  37.  * this driver to run it (although you'll probably have to write a
  38.  * minimal wrapper for the purpose---see the NCR_D700 driver for
  39.  * details about how to do this).
  40.  *
  41.  *
  42.  * TODO List:
  43.  *
  44.  * 1. Better statistics in the proc fs
  45.  *
  46.  * 2. Implement message queue (queues SCSI messages like commands) and make
  47.  *    the abort and device reset functions use them.
  48.  * */
  49. /* CHANGELOG
  50.  *
  51.  * Version 2.7
  52.  *
  53.  * Fixed scripts problem which caused certain devices (notably CDRWs)
  54.  * to hang on initial INQUIRY.  Updated NCR_700_readl/writel to use
  55.  * __raw_readl/writel for parisc compatibility (Thomas
  56.  * Bogendoerfer). Added missing SCp->request_bufflen initialisation
  57.  * for sense requests (Ryan Bradetich).
  58.  *
  59.  * Version 2.6
  60.  *
  61.  * Following test of the 64 bit parisc kernel by Richard Hirst,
  62.  * several problems have now been corrected.  Also adds support for
  63.  * consistent memory allocation.
  64.  *
  65.  * Version 2.5
  66.  * 
  67.  * More Compatibility changes for 710 (now actually works).  Enhanced
  68.  * support for odd clock speeds which constrain SDTR negotiations.
  69.  * correct cacheline separation for scsi messages and status for
  70.  * incoherent architectures.  Use of the pci mapping functions on
  71.  * buffers to begin support for 64 bit drivers.
  72.  *
  73.  * Version 2.4
  74.  *
  75.  * Added support for the 53c710 chip (in 53c700 emulation mode only---no 
  76.  * special 53c710 instructions or registers are used).
  77.  *
  78.  * Version 2.3
  79.  *
  80.  * More endianness/cache coherency changes.
  81.  *
  82.  * Better bad device handling (handles devices lying about tag
  83.  * queueing support and devices which fail to provide sense data on
  84.  * contingent allegiance conditions)
  85.  *
  86.  * Many thanks to Richard Hirst <rhirst@linuxcare.com> for patiently
  87.  * debugging this driver on the parisc architecture and suggesting
  88.  * many improvements and bug fixes.
  89.  *
  90.  * Thanks also go to Linuxcare Inc. for providing several PARISC
  91.  * machines for me to debug the driver on.
  92.  *
  93.  * Version 2.2
  94.  *
  95.  * Made the driver mem or io mapped; added endian invariance; added
  96.  * dma cache flushing operations for architectures which need it;
  97.  * added support for more varied clocking speeds.
  98.  *
  99.  * Version 2.1
  100.  *
  101.  * Initial modularisation from the D700.  See NCR_D700.c for the rest of
  102.  * the changelog.
  103.  * */
  104. #define NCR_700_VERSION "2.7"
  105. #include <linux/config.h>
  106. #include <linux/version.h>
  107. #include <linux/kernel.h>
  108. #include <linux/types.h>
  109. #include <linux/string.h>
  110. #include <linux/ioport.h>
  111. #include <linux/delay.h>
  112. #include <linux/spinlock.h>
  113. #include <linux/sched.h>
  114. #include <linux/proc_fs.h>
  115. #include <linux/init.h>
  116. #include <linux/mca.h>
  117. #include <asm/dma.h>
  118. #include <asm/system.h>
  119. #include <asm/io.h>
  120. #include <asm/pgtable.h>
  121. #include <asm/byteorder.h>
  122. #include <linux/blk.h>
  123. #include <linux/module.h>
  124. #include <linux/pci.h>
  125. #include "scsi.h"
  126. #include "hosts.h"
  127. #include "constants.h"
  128. #include "53c700.h"
  129. /* NOTE: For 64 bit drivers there are points in the code where we use
  130.  * a non dereferenceable pointer to point to a structure in dma-able
  131.  * memory (which is 32 bits) so that we can use all of the structure
  132.  * operations but take the address at the end.  This macro allows us
  133.  * to truncate the 64 bit pointer down to 32 bits without the compiler
  134.  * complaining */
  135. #define to32bit(x) ((__u32)((unsigned long)(x)))
  136. #ifdef NCR_700_DEBUG
  137. #define STATIC
  138. #else
  139. #define STATIC static
  140. #endif
  141. MODULE_AUTHOR("James Bottomley");
  142. MODULE_DESCRIPTION("53c700 and 53c700-66 Driver");
  143. MODULE_LICENSE("GPL");
  144. /* This is the script */
  145. #include "53c700_d.h"
  146. STATIC int NCR_700_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
  147. STATIC int NCR_700_abort(Scsi_Cmnd * SCpnt);
  148. STATIC int NCR_700_bus_reset(Scsi_Cmnd * SCpnt);
  149. STATIC int NCR_700_dev_reset(Scsi_Cmnd * SCpnt);
  150. STATIC int NCR_700_host_reset(Scsi_Cmnd * SCpnt);
  151. STATIC int NCR_700_proc_directory_info(char *, char **, off_t, int, int, int);
  152. STATIC void NCR_700_chip_setup(struct Scsi_Host *host);
  153. STATIC void NCR_700_chip_reset(struct Scsi_Host *host);
  154. static char *NCR_700_phase[] = {
  155. "",
  156. "after selection",
  157. "before command phase",
  158. "after command phase",
  159. "after status phase",
  160. "after data in phase",
  161. "after data out phase",
  162. "during data phase",
  163. };
  164. static char *NCR_700_condition[] = {
  165. "",
  166. "NOT MSG_OUT",
  167. "UNEXPECTED PHASE",
  168. "NOT MSG_IN",
  169. "UNEXPECTED MSG",
  170. "MSG_IN",
  171. "SDTR_MSG RECEIVED",
  172. "REJECT_MSG RECEIVED",
  173. "DISCONNECT_MSG RECEIVED",
  174. "MSG_OUT",
  175. "DATA_IN",
  176. };
  177. static char *NCR_700_fatal_messages[] = {
  178. "unexpected message after reselection",
  179. "still MSG_OUT after message injection",
  180. "not MSG_IN after selection",
  181. "Illegal message length received",
  182. };
  183. static char *NCR_700_SBCL_bits[] = {
  184. "IO ",
  185. "CD ",
  186. "MSG ",
  187. "ATN ",
  188. "SEL ",
  189. "BSY ",
  190. "ACK ",
  191. "REQ ",
  192. };
  193. static char *NCR_700_SBCL_to_phase[] = {
  194. "DATA_OUT",
  195. "DATA_IN",
  196. "CMD_OUT",
  197. "STATE",
  198. "ILLEGAL PHASE",
  199. "ILLEGAL PHASE",
  200. "MSG OUT",
  201. "MSG IN",
  202. };
  203. static __u8 NCR_700_SDTR_msg[] = {
  204. 0x01, /* Extended message */
  205. 0x03, /* Extended message Length */
  206. 0x01, /* SDTR Extended message */
  207. NCR_700_MIN_PERIOD,
  208. NCR_700_MAX_OFFSET
  209. };
  210. struct Scsi_Host * __init
  211. NCR_700_detect(Scsi_Host_Template *tpnt,
  212.        struct NCR_700_Host_Parameters *hostdata)
  213. {
  214. dma_addr_t pScript, pMemory, pSlots;
  215. __u8 *memory;
  216. __u32 *script;
  217. struct Scsi_Host *host;
  218. static int banner = 0;
  219. int j;
  220. #ifdef CONFIG_53C700_USE_CONSISTENT
  221. memory = pci_alloc_consistent(hostdata->pci_dev, TOTAL_MEM_SIZE,
  222.       &pMemory);
  223. hostdata->consistent = 1;
  224. if(memory == NULL ) {
  225. printk(KERN_WARNING "53c700: consistent memory allocation failedn");
  226. #endif
  227. memory = kmalloc(TOTAL_MEM_SIZE, GFP_KERNEL);
  228. if(memory == NULL) {
  229. printk(KERN_ERR "53c700: Failed to allocate memory for driver, detatchingn");
  230. return NULL;
  231. }
  232. pMemory = pci_map_single(hostdata->pci_dev, memory,
  233.  TOTAL_MEM_SIZE, PCI_DMA_BIDIRECTIONAL);
  234. #ifdef CONFIG_53C700_USE_CONSISTENT
  235. hostdata->consistent = 0;
  236. }
  237. #endif
  238. script = (__u32 *)memory;
  239. pScript = pMemory;
  240. hostdata->msgin = memory + MSGIN_OFFSET;
  241. hostdata->msgout = memory + MSGOUT_OFFSET;
  242. hostdata->status = memory + STATUS_OFFSET;
  243. hostdata->slots = (struct NCR_700_command_slot *)(memory + SLOTS_OFFSET);
  244. pSlots = pMemory + SLOTS_OFFSET;
  245. /* Fill in the missing routines from the host template */
  246. tpnt->queuecommand = NCR_700_queuecommand;
  247. tpnt->eh_abort_handler = NCR_700_abort;
  248. tpnt->eh_device_reset_handler = NCR_700_dev_reset;
  249. tpnt->eh_bus_reset_handler = NCR_700_bus_reset;
  250. tpnt->eh_host_reset_handler = NCR_700_host_reset;
  251. tpnt->can_queue = NCR_700_COMMAND_SLOTS_PER_HOST;
  252. tpnt->sg_tablesize = NCR_700_SG_SEGMENTS;
  253. tpnt->cmd_per_lun = NCR_700_MAX_TAGS;
  254. tpnt->use_clustering = DISABLE_CLUSTERING;
  255. tpnt->use_new_eh_code = 1;
  256. tpnt->proc_info = NCR_700_proc_directory_info;
  257. if(tpnt->name == NULL)
  258. tpnt->name = "53c700";
  259. if(tpnt->proc_name == NULL)
  260. tpnt->proc_name = "53c700";
  261. if((host = scsi_register(tpnt, 4)) == NULL)
  262. return NULL;
  263. memset(hostdata->slots, 0, sizeof(struct NCR_700_command_slot)
  264.        * NCR_700_COMMAND_SLOTS_PER_HOST);
  265. for(j = 0; j < NCR_700_COMMAND_SLOTS_PER_HOST; j++) {
  266. dma_addr_t offset = (dma_addr_t)((unsigned long)&hostdata->slots[j].SG[0]
  267.   - (unsigned long)&hostdata->slots[0].SG[0]);
  268. hostdata->slots[j].pSG = (struct NCR_700_SG_List *)((unsigned long)(pSlots + offset));
  269. if(j == 0)
  270. hostdata->free_list = &hostdata->slots[j];
  271. else
  272. hostdata->slots[j-1].ITL_forw = &hostdata->slots[j];
  273. hostdata->slots[j].state = NCR_700_SLOT_FREE;
  274. }
  275. for(j = 0; j < sizeof(SCRIPT)/sizeof(SCRIPT[0]); j++) {
  276. script[j] = bS_to_host(SCRIPT[j]);
  277. }
  278. /* adjust all labels to be bus physical */
  279. for(j = 0; j < PATCHES; j++) {
  280. script[LABELPATCHES[j]] = bS_to_host(pScript + SCRIPT[LABELPATCHES[j]]);
  281. }
  282. /* now patch up fixed addresses. */
  283. script_patch_32(script, MessageLocation,
  284. pScript + MSGOUT_OFFSET);
  285. script_patch_32(script, StatusAddress,
  286. pScript + STATUS_OFFSET);
  287. script_patch_32(script, ReceiveMsgAddress,
  288. pScript + MSGIN_OFFSET);
  289. hostdata->script = script;
  290. hostdata->pScript = pScript;
  291. NCR_700_dma_cache_wback((unsigned long)script, sizeof(SCRIPT));
  292. hostdata->state = NCR_700_HOST_FREE;
  293. spin_lock_init(&hostdata->lock);
  294. hostdata->cmd = NULL;
  295. host->max_id = 7;
  296. host->max_lun = NCR_700_MAX_LUNS;
  297. host->unique_id = hostdata->base;
  298. host->base = hostdata->base;
  299. host->hostdata[0] = (unsigned long)hostdata;
  300. /* kick the chip */
  301. NCR_700_writeb(0xff, host, CTEST9_REG);
  302. if(hostdata->chip710) 
  303. hostdata->rev = (NCR_700_readb(host, CTEST8_REG)>>4) & 0x0f;
  304. else
  305. hostdata->rev = (NCR_700_readb(host, CTEST7_REG)>>4) & 0x0f;
  306. hostdata->fast = (NCR_700_readb(host, CTEST9_REG) == 0);
  307. if(banner == 0) {
  308. printk(KERN_NOTICE "53c700: Version " NCR_700_VERSION " By James.Bottomley@HansenPartnership.comn");
  309. banner = 1;
  310. }
  311. printk(KERN_NOTICE "scsi%d: %s rev %d %sn", host->host_no,
  312.        hostdata->chip710 ? "53c710" : 
  313.        (hostdata->fast ? "53c700-66" : "53c700"),
  314.        hostdata->rev, hostdata->differential ?
  315.        "(Differential)" : "");
  316. /* reset the chip */
  317. NCR_700_chip_reset(host);
  318. return host;
  319. }
  320. int
  321. NCR_700_release(struct Scsi_Host *host)
  322. {
  323. struct NCR_700_Host_Parameters *hostdata = 
  324. (struct NCR_700_Host_Parameters *)host->hostdata[0];
  325. #ifdef CONFIG_53C700_USE_CONSISTENT
  326. if(hostdata->consistent) {
  327. pci_free_consistent(hostdata->pci_dev, TOTAL_MEM_SIZE,
  328.     hostdata->script, hostdata->pScript);
  329. } else {
  330. #endif
  331. pci_unmap_single(hostdata->pci_dev, hostdata->pScript,
  332.  TOTAL_MEM_SIZE, PCI_DMA_BIDIRECTIONAL);
  333. kfree(hostdata->script);
  334. #ifdef CONFIG_53C700_USE_CONSISTENT
  335. }
  336. #endif
  337. return 1;
  338. }
  339. static inline __u8
  340. NCR_700_identify(int can_disconnect, __u8 lun)
  341. {
  342. return IDENTIFY_BASE |
  343. ((can_disconnect) ? 0x40 : 0) |
  344. (lun & NCR_700_LUN_MASK);
  345. }
  346. /*
  347.  * Function : static int data_residual (Scsi_Host *host)
  348.  *
  349.  * Purpose : return residual data count of what's in the chip.  If you
  350.  * really want to know what this function is doing, it's almost a
  351.  * direct transcription of the algorithm described in the 53c710
  352.  * guide, except that the DBC and DFIFO registers are only 6 bits
  353.  * wide on a 53c700.
  354.  *
  355.  * Inputs : host - SCSI host */
  356. static inline int
  357. NCR_700_data_residual (struct Scsi_Host *host) {
  358. struct NCR_700_Host_Parameters *hostdata = 
  359. (struct NCR_700_Host_Parameters *)host->hostdata[0];
  360. int count, synchronous = 0;
  361. unsigned int ddir;
  362. if(hostdata->chip710) {
  363. count = ((NCR_700_readb(host, DFIFO_REG) & 0x7f) -
  364.  (NCR_700_readl(host, DBC_REG) & 0x7f)) & 0x7f;
  365. } else {
  366. count = ((NCR_700_readb(host, DFIFO_REG) & 0x3f) -
  367.  (NCR_700_readl(host, DBC_REG) & 0x3f)) & 0x3f;
  368. }
  369. if(hostdata->fast)
  370. synchronous = NCR_700_readb(host, SXFER_REG) & 0x0f;
  371. /* get the data direction */
  372. ddir = NCR_700_readb(host, CTEST0_REG) & 0x01;
  373. if (ddir) {
  374. /* Receive */
  375. if (synchronous) 
  376. count += (NCR_700_readb(host, SSTAT2_REG) & 0xf0) >> 4;
  377. else
  378. if (NCR_700_readb(host, SSTAT1_REG) & SIDL_REG_FULL)
  379. ++count;
  380. } else {
  381. /* Send */
  382. __u8 sstat = NCR_700_readb(host, SSTAT1_REG);
  383. if (sstat & SODL_REG_FULL)
  384. ++count;
  385. if (synchronous && (sstat & SODR_REG_FULL))
  386. ++count;
  387. }
  388. #ifdef NCR_700_DEBUG
  389. if(count)
  390. printk("RESIDUAL IS %d (ddir %d)n", count, ddir);
  391. #endif
  392. return count;
  393. }
  394. /* print out the SCSI wires and corresponding phase from the SBCL register
  395.  * in the chip */
  396. static inline char *
  397. sbcl_to_string(__u8 sbcl)
  398. {
  399. int i;
  400. static char ret[256];
  401. ret[0]='';
  402. for(i=0; i<8; i++) {
  403. if((1<<i) & sbcl) 
  404. strcat(ret, NCR_700_SBCL_bits[i]);
  405. }
  406. strcat(ret, NCR_700_SBCL_to_phase[sbcl & 0x07]);
  407. return ret;
  408. }
  409. static inline __u8
  410. bitmap_to_number(__u8 bitmap)
  411. {
  412. __u8 i;
  413. for(i=0; i<8 && !(bitmap &(1<<i)); i++)
  414. ;
  415. return i;
  416. }
  417. /* Pull a slot off the free list */
  418. STATIC struct NCR_700_command_slot *
  419. find_empty_slot(struct NCR_700_Host_Parameters *hostdata)
  420. {
  421. struct NCR_700_command_slot *slot = hostdata->free_list;
  422. if(slot == NULL) {
  423. /* sanity check */
  424. if(hostdata->command_slot_count != NCR_700_COMMAND_SLOTS_PER_HOST)
  425. printk(KERN_ERR "SLOTS FULL, but count is %d, should be %dn", hostdata->command_slot_count, NCR_700_COMMAND_SLOTS_PER_HOST);
  426. return NULL;
  427. }
  428. if(slot->state != NCR_700_SLOT_FREE)
  429. /* should panic! */
  430. printk(KERN_ERR "BUSY SLOT ON FREE LIST!!!n");
  431. hostdata->free_list = slot->ITL_forw;
  432. slot->ITL_forw = NULL;
  433. /* NOTE: set the state to busy here, not queued, since this
  434.  * indicates the slot is in use and cannot be run by the IRQ
  435.  * finish routine.  If we cannot queue the command when it
  436.  * is properly build, we then change to NCR_700_SLOT_QUEUED */
  437. slot->state = NCR_700_SLOT_BUSY;
  438. hostdata->command_slot_count++;
  439. return slot;
  440. }
  441. STATIC void 
  442. free_slot(struct NCR_700_command_slot *slot,
  443.   struct NCR_700_Host_Parameters *hostdata)
  444. {
  445. int hash;
  446. struct NCR_700_command_slot **forw, **back;
  447. if((slot->state & NCR_700_SLOT_MASK) != NCR_700_SLOT_MAGIC) {
  448. printk(KERN_ERR "53c700: SLOT %p is not MAGIC!!!n", slot);
  449. }
  450. if(slot->state == NCR_700_SLOT_FREE) {
  451. printk(KERN_ERR "53c700: SLOT %p is FREE!!!n", slot);
  452. }
  453. /* remove from queues */
  454. if(slot->tag != NCR_700_NO_TAG) {
  455. hash = hash_ITLQ(slot->cmnd->target, slot->cmnd->lun,
  456.  slot->tag);
  457. if(slot->ITLQ_forw == NULL)
  458. back = &hostdata->ITLQ_Hash_back[hash];
  459. else
  460. back = &slot->ITLQ_forw->ITLQ_back;
  461. if(slot->ITLQ_back == NULL)
  462. forw = &hostdata->ITLQ_Hash_forw[hash];
  463. else
  464. forw = &slot->ITLQ_back->ITLQ_forw;
  465. *forw = slot->ITLQ_forw;
  466. *back = slot->ITLQ_back;
  467. }
  468. hash = hash_ITL(slot->cmnd->target, slot->cmnd->lun);
  469. if(slot->ITL_forw == NULL)
  470. back = &hostdata->ITL_Hash_back[hash];
  471. else
  472. back = &slot->ITL_forw->ITL_back;
  473. if(slot->ITL_back == NULL)
  474. forw = &hostdata->ITL_Hash_forw[hash];
  475. else
  476. forw = &slot->ITL_back->ITL_forw;
  477. *forw = slot->ITL_forw;
  478. *back = slot->ITL_back;
  479. slot->resume_offset = 0;
  480. slot->cmnd = NULL;
  481. slot->state = NCR_700_SLOT_FREE;
  482. slot->ITL_forw = hostdata->free_list;
  483. hostdata->free_list = slot;
  484. hostdata->command_slot_count--;
  485. }
  486. /* This routine really does very little.  The command is indexed on
  487.    the ITL and (if tagged) the ITLQ lists in _queuecommand */
  488. STATIC void
  489. save_for_reselection(struct NCR_700_Host_Parameters *hostdata,
  490.      Scsi_Cmnd *SCp, __u32 dsp)
  491. {
  492. /* Its just possible that this gets executed twice */
  493. if(SCp != NULL) {
  494. struct NCR_700_command_slot *slot =
  495. (struct NCR_700_command_slot *)SCp->host_scribble;
  496. slot->resume_offset = dsp;
  497. }
  498. hostdata->state = NCR_700_HOST_FREE;
  499. hostdata->cmd = NULL;
  500. }
  501. /* Most likely nexus is the oldest in each case */
  502. STATIC inline struct NCR_700_command_slot *
  503. find_ITL_Nexus(struct NCR_700_Host_Parameters *hostdata, __u8 pun, __u8 lun)
  504. {
  505. int hash = hash_ITL(pun, lun);
  506. struct NCR_700_command_slot *slot = hostdata->ITL_Hash_back[hash];
  507. while(slot != NULL && !(slot->cmnd->target == pun &&
  508. slot->cmnd->lun == lun))
  509. slot = slot->ITL_back;
  510. return slot;
  511. }
  512. STATIC inline struct NCR_700_command_slot *
  513. find_ITLQ_Nexus(struct NCR_700_Host_Parameters *hostdata, __u8 pun,
  514. __u8 lun, __u8 tag)
  515. {
  516. int hash = hash_ITLQ(pun, lun, tag);
  517. struct NCR_700_command_slot *slot = hostdata->ITLQ_Hash_back[hash];
  518. while(slot != NULL && !(slot->cmnd->target == pun 
  519.       && slot->cmnd->lun == lun && slot->tag == tag))
  520. slot = slot->ITLQ_back;
  521. #ifdef NCR_700_TAG_DEBUG
  522. if(slot != NULL) {
  523. struct NCR_700_command_slot *n = slot->ITLQ_back;
  524. while(n != NULL && n->cmnd->target != pun
  525.       && n->cmnd->lun != lun && n->tag != tag)
  526. n = n->ITLQ_back;
  527. if(n != NULL && n->cmnd->target == pun && n->cmnd->lun == lun
  528.    && n->tag == tag) {
  529. printk(KERN_WARNING "53c700: WARNING: DUPLICATE tag %dn",
  530.        tag);
  531. }
  532. }
  533. #endif
  534. return slot;
  535. }
  536. /* This translates the SDTR message offset and period to a value
  537.  * which can be loaded into the SXFER_REG.
  538.  *
  539.  * NOTE: According to SCSI-2, the true transfer period (in ns) is
  540.  *       actually four times this period value */
  541. STATIC inline __u8
  542. NCR_700_offset_period_to_sxfer(struct NCR_700_Host_Parameters *hostdata,
  543.        __u8 offset, __u8 period)
  544. {
  545. int XFERP;
  546. __u8 min_xferp = (hostdata->chip710
  547.   ? NCR_710_MIN_XFERP : NCR_700_MIN_XFERP);
  548. __u8 max_offset = (hostdata->chip710
  549.    ? NCR_710_MAX_OFFSET : NCR_700_MAX_OFFSET);
  550. /* NOTE: NCR_700_SDTR_msg[3] contains our offer of the minimum
  551.  * period.  It is set in NCR_700_chip_setup() */
  552. if(period < NCR_700_SDTR_msg[3]) {
  553. printk(KERN_WARNING "53c700: Period %dns is less than this chip's minimum, setting to %dn", period*4, NCR_700_SDTR_msg[3]*4);
  554. period = NCR_700_SDTR_msg[3];
  555. }
  556. XFERP = (period*4 * hostdata->sync_clock)/1000 - 4;
  557. if(offset > max_offset) {
  558. printk(KERN_WARNING "53c700: Offset %d exceeds chip maximum, setting to %dn",
  559.        offset, max_offset);
  560. offset = max_offset;
  561. }
  562. if(XFERP < min_xferp) {
  563. printk(KERN_WARNING "53c700: XFERP %d is less than minium, setting to %dn",
  564.        XFERP,  min_xferp);
  565. XFERP =  min_xferp;
  566. }
  567. return (offset & 0x0f) | (XFERP & 0x07)<<4;
  568. }
  569. STATIC inline void
  570. NCR_700_unmap(struct NCR_700_Host_Parameters *hostdata, Scsi_Cmnd *SCp,
  571.       struct NCR_700_command_slot *slot)
  572. {
  573. if(SCp->sc_data_direction != SCSI_DATA_NONE &&
  574.    SCp->sc_data_direction != SCSI_DATA_UNKNOWN) {
  575. int pci_direction = scsi_to_pci_dma_dir(SCp->sc_data_direction);
  576. if(SCp->use_sg) {
  577. pci_unmap_sg(hostdata->pci_dev, SCp->buffer,
  578.      SCp->use_sg, pci_direction);
  579. } else {
  580. pci_unmap_single(hostdata->pci_dev,
  581.  slot->dma_handle,
  582.  SCp->request_bufflen,
  583.  pci_direction);
  584. }
  585. }
  586. }
  587. STATIC inline void
  588. NCR_700_scsi_done(struct NCR_700_Host_Parameters *hostdata,
  589.        Scsi_Cmnd *SCp, int result)
  590. {
  591. hostdata->state = NCR_700_HOST_FREE;
  592. hostdata->cmd = NULL;
  593. if(SCp != NULL) {
  594. struct NCR_700_command_slot *slot = 
  595. (struct NCR_700_command_slot *)SCp->host_scribble;
  596. NCR_700_unmap(hostdata, SCp, slot);
  597. pci_unmap_single(hostdata->pci_dev, slot->pCmd,
  598.  sizeof(SCp->cmnd), PCI_DMA_TODEVICE);
  599. if(SCp->cmnd[0] == REQUEST_SENSE && SCp->cmnd[6] == NCR_700_INTERNAL_SENSE_MAGIC) {
  600. #ifdef NCR_700_DEBUG
  601. printk(" ORIGINAL CMD %p RETURNED %d, new return is %d sense isn",
  602.        SCp, SCp->cmnd[7], result);
  603. print_sense("53c700", SCp);
  604. #endif
  605. SCp->use_sg = SCp->cmnd[8];
  606. if(result == 0)
  607. result = SCp->cmnd[7];
  608. }
  609. free_slot(slot, hostdata);
  610. SCp->host_scribble = NULL;
  611. SCp->result = result;
  612. SCp->scsi_done(SCp);
  613. if(NCR_700_get_depth(SCp->device) == 0 ||
  614.    NCR_700_get_depth(SCp->device) > NCR_700_MAX_TAGS)
  615. printk(KERN_ERR "Invalid depth in NCR_700_scsi_done(): %dn",
  616.        NCR_700_get_depth(SCp->device));
  617. NCR_700_set_depth(SCp->device, NCR_700_get_depth(SCp->device) - 1);
  618. } else {
  619. printk(KERN_ERR "53c700: SCSI DONE HAS NULL SCpn");
  620. }
  621. }
  622. STATIC void
  623. NCR_700_internal_bus_reset(struct Scsi_Host *host)
  624. {
  625. /* Bus reset */
  626. NCR_700_writeb(ASSERT_RST, host, SCNTL1_REG);
  627. udelay(50);
  628. NCR_700_writeb(0, host, SCNTL1_REG);
  629. }
  630. STATIC void
  631. NCR_700_chip_setup(struct Scsi_Host *host)
  632. {
  633. struct NCR_700_Host_Parameters *hostdata = 
  634. (struct NCR_700_Host_Parameters *)host->hostdata[0];
  635. __u32 dcntl_extra = 0;
  636. __u8 min_period;
  637. __u8 min_xferp = (hostdata->chip710 ? NCR_710_MIN_XFERP : NCR_700_MIN_XFERP);
  638. if(hostdata->chip710) {
  639. __u8 burst_disable = hostdata->burst_disable
  640. ? BURST_DISABLE : 0;
  641. dcntl_extra = COMPAT_700_MODE;
  642. NCR_700_writeb(dcntl_extra, host, DCNTL_REG);
  643. NCR_700_writeb(BURST_LENGTH_8  | hostdata->dmode_extra,
  644.        host, DMODE_710_REG);
  645. NCR_700_writeb(burst_disable | (hostdata->differential ? 
  646. DIFF : 0), host, CTEST7_REG);
  647. NCR_700_writeb(BTB_TIMER_DISABLE, host, CTEST0_REG);
  648. NCR_700_writeb(FULL_ARBITRATION | ENABLE_PARITY | PARITY
  649.        | AUTO_ATN, host, SCNTL0_REG);
  650. } else {
  651. NCR_700_writeb(BURST_LENGTH_8 | hostdata->dmode_extra,
  652.        host, DMODE_700_REG);
  653. NCR_700_writeb(hostdata->differential ? 
  654.        DIFF : 0, host, CTEST7_REG);
  655. if(hostdata->fast) {
  656. /* this is for 700-66, does nothing on 700 */
  657. NCR_700_writeb(LAST_DIS_ENBL | ENABLE_ACTIVE_NEGATION 
  658.        | GENERATE_RECEIVE_PARITY, host,
  659.        CTEST8_REG);
  660. } else {
  661. NCR_700_writeb(FULL_ARBITRATION | ENABLE_PARITY
  662.        | PARITY | AUTO_ATN, host, SCNTL0_REG);
  663. }
  664. }
  665. NCR_700_writeb(1 << host->this_id, host, SCID_REG);
  666. NCR_700_writeb(0, host, SBCL_REG);
  667. NCR_700_writeb(ASYNC_OPERATION, host, SXFER_REG);
  668. NCR_700_writeb(PHASE_MM_INT | SEL_TIMEOUT_INT | GROSS_ERR_INT | UX_DISC_INT
  669.      | RST_INT | PAR_ERR_INT | SELECT_INT, host, SIEN_REG);
  670. NCR_700_writeb(ABORT_INT | INT_INST_INT | ILGL_INST_INT, host, DIEN_REG);
  671. NCR_700_writeb(ENABLE_SELECT, host, SCNTL1_REG);
  672. if(hostdata->clock > 75) {
  673. printk(KERN_ERR "53c700: Clock speed %dMHz is too high: 75Mhz is the maximum this chip can be driven atn", hostdata->clock);
  674. /* do the best we can, but the async clock will be out
  675.  * of spec: sync divider 2, async divider 3 */
  676. DEBUG(("53c700: sync 2 async 3n"));
  677. NCR_700_writeb(SYNC_DIV_2_0, host, SBCL_REG);
  678. NCR_700_writeb(ASYNC_DIV_3_0 | dcntl_extra, host, DCNTL_REG);
  679. hostdata->sync_clock = hostdata->clock/2;
  680. } else if(hostdata->clock > 50  && hostdata->clock <= 75) {
  681. /* sync divider 1.5, async divider 3 */
  682. DEBUG(("53c700: sync 1.5 async 3n"));
  683. NCR_700_writeb(SYNC_DIV_1_5, host, SBCL_REG);
  684. NCR_700_writeb(ASYNC_DIV_3_0 | dcntl_extra, host, DCNTL_REG);
  685. hostdata->sync_clock = hostdata->clock*2;
  686. hostdata->sync_clock /= 3;
  687. } else if(hostdata->clock > 37 && hostdata->clock <= 50) {
  688. /* sync divider 1, async divider 2 */
  689. DEBUG(("53c700: sync 1 async 2n"));
  690. NCR_700_writeb(SYNC_DIV_1_0, host, SBCL_REG);
  691. NCR_700_writeb(ASYNC_DIV_2_0 | dcntl_extra, host, DCNTL_REG);
  692. hostdata->sync_clock = hostdata->clock;
  693. } else if(hostdata->clock > 25 && hostdata->clock <=37) {
  694. /* sync divider 1, async divider 1.5 */
  695. DEBUG(("53c700: sync 1 async 1.5n"));
  696. NCR_700_writeb(SYNC_DIV_1_0, host, SBCL_REG);
  697. NCR_700_writeb(ASYNC_DIV_1_5 | dcntl_extra, host, DCNTL_REG);
  698. hostdata->sync_clock = hostdata->clock;
  699. } else {
  700. DEBUG(("53c700: sync 1 async 1n"));
  701. NCR_700_writeb(SYNC_DIV_1_0, host, SBCL_REG);
  702. NCR_700_writeb(ASYNC_DIV_1_0 | dcntl_extra, host, DCNTL_REG);
  703. /* sync divider 1, async divider 1 */
  704. hostdata->sync_clock = hostdata->clock;
  705. }
  706. /* Calculate the actual minimum period that can be supported
  707.  * by our synchronous clock speed.  See the 710 manual for
  708.  * exact details of this calculation which is based on a
  709.  * setting of the SXFER register */
  710. min_period = 1000*(4+min_xferp)/(4*hostdata->sync_clock);
  711. if(min_period > NCR_700_MIN_PERIOD) {
  712. NCR_700_SDTR_msg[3] = min_period;
  713. }
  714. if(hostdata->chip710)
  715. NCR_700_SDTR_msg[4] = NCR_710_MAX_OFFSET;
  716. }
  717. STATIC void
  718. NCR_700_chip_reset(struct Scsi_Host *host)
  719. {
  720. struct NCR_700_Host_Parameters *hostdata = 
  721. (struct NCR_700_Host_Parameters *)host->hostdata[0];
  722. if(hostdata->chip710) {
  723. NCR_700_writeb(SOFTWARE_RESET_710, host, ISTAT_REG);
  724. udelay(100);
  725. NCR_700_writeb(0, host, ISTAT_REG);
  726. } else {
  727. NCR_700_writeb(SOFTWARE_RESET, host, DCNTL_REG);
  728. udelay(100);
  729. NCR_700_writeb(0, host, DCNTL_REG);
  730. }
  731. mdelay(1000);
  732. NCR_700_chip_setup(host);
  733. }
  734. /* The heart of the message processing engine is that the instruction
  735.  * immediately after the INT is the normal case (and so must be CLEAR
  736.  * ACK).  If we want to do something else, we call that routine in
  737.  * scripts and set temp to be the normal case + 8 (skipping the CLEAR
  738.  * ACK) so that the routine returns correctly to resume its activity
  739.  * */
  740. STATIC __u32
  741. process_extended_message(struct Scsi_Host *host, 
  742.  struct NCR_700_Host_Parameters *hostdata,
  743.  Scsi_Cmnd *SCp, __u32 dsp, __u32 dsps)
  744. {
  745. __u32 resume_offset = dsp, temp = dsp + 8;
  746. __u8 pun = 0xff, lun = 0xff;
  747. if(SCp != NULL) {
  748. pun = SCp->target;
  749. lun = SCp->lun;
  750. }
  751. switch(hostdata->msgin[2]) {
  752. case A_SDTR_MSG:
  753. if(SCp != NULL && NCR_700_is_flag_set(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION)) {
  754. __u8 period = hostdata->msgin[3];
  755. __u8 offset = hostdata->msgin[4];
  756. __u8 sxfer;
  757. if(offset != 0 && period != 0)
  758. sxfer = NCR_700_offset_period_to_sxfer(hostdata, offset, period);
  759. else 
  760. sxfer = 0;
  761. if(sxfer != NCR_700_get_SXFER(SCp->device)) {
  762. printk(KERN_INFO "scsi%d: (%d:%d) Synchronous at offset %d, period %dnsn",
  763.        host->host_no, pun, lun,
  764.        offset, period*4);
  765. NCR_700_set_SXFER(SCp->device, sxfer);
  766. }
  767. NCR_700_set_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC);
  768. NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION);
  769. NCR_700_writeb(NCR_700_get_SXFER(SCp->device),
  770.        host, SXFER_REG);
  771. } else {
  772. /* SDTR message out of the blue, reject it */
  773. printk(KERN_WARNING "scsi%d Unexpected SDTR msgn",
  774.        host->host_no);
  775. hostdata->msgout[0] = A_REJECT_MSG;
  776. NCR_700_dma_cache_wback((unsigned long)hostdata->msgout, 1);
  777. script_patch_16(hostdata->script, MessageCount, 1);
  778. /* SendMsgOut returns, so set up the return
  779.  * address */
  780. resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
  781. }
  782. break;
  783. case A_WDTR_MSG:
  784. printk(KERN_INFO "scsi%d: (%d:%d), Unsolicited WDTR after CMD, Rejectingn",
  785.        host->host_no, pun, lun);
  786. hostdata->msgout[0] = A_REJECT_MSG;
  787. NCR_700_dma_cache_wback((unsigned long)hostdata->msgout, 1);
  788. script_patch_16(hostdata->script, MessageCount, 1);
  789. resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
  790. break;
  791. default:
  792. printk(KERN_INFO "scsi%d (%d:%d): Unexpected message %s: ",
  793.        host->host_no, pun, lun,
  794.        NCR_700_phase[(dsps & 0xf00) >> 8]);
  795. print_msg(hostdata->msgin);
  796. printk("n");
  797. /* just reject it */
  798. hostdata->msgout[0] = A_REJECT_MSG;
  799. NCR_700_dma_cache_wback((unsigned long)hostdata->msgout, 1);
  800. script_patch_16(hostdata->script, MessageCount, 1);
  801. /* SendMsgOut returns, so set up the return
  802.  * address */
  803. resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
  804. }
  805. NCR_700_writel(temp, host, TEMP_REG);
  806. return resume_offset;
  807. }
  808. STATIC __u32
  809. process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata,
  810. Scsi_Cmnd *SCp, __u32 dsp, __u32 dsps)
  811. {
  812. /* work out where to return to */
  813. __u32 temp = dsp + 8, resume_offset = dsp;
  814. __u8 pun = 0xff, lun = 0xff;
  815. if(SCp != NULL) {
  816. pun = SCp->target;
  817. lun = SCp->lun;
  818. }
  819. #ifdef NCR_700_DEBUG
  820. printk("scsi%d (%d:%d): message %s: ", host->host_no, pun, lun,
  821.        NCR_700_phase[(dsps & 0xf00) >> 8]);
  822. print_msg(hostdata->msgin);
  823. printk("n");
  824. #endif
  825. switch(hostdata->msgin[0]) {
  826. case A_EXTENDED_MSG:
  827. resume_offset =  process_extended_message(host, hostdata, SCp,
  828.   dsp, dsps);
  829. break;
  830. case A_REJECT_MSG:
  831. if(SCp != NULL && NCR_700_is_flag_set(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION)) {
  832. /* Rejected our sync negotiation attempt */
  833. NCR_700_set_SXFER(SCp->device, 0);
  834. NCR_700_set_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC);
  835. NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION);
  836. } else if(SCp != NULL && NCR_700_is_flag_set(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING)) {
  837. /* rejected our first simple tag message */
  838. printk(KERN_WARNING "scsi%d (%d:%d) Rejected first tag queue attempt, turning off tag queueingn", host->host_no, pun, lun);
  839. NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING);
  840. hostdata->tag_negotiated &= ~(1<<SCp->target);
  841. SCp->device->tagged_queue = 0;
  842. SCp->device->tagged_supported = 0;
  843. } else {
  844. printk(KERN_WARNING "scsi%d (%d:%d) Unexpected REJECT Message %sn",
  845.        host->host_no, pun, lun,
  846.        NCR_700_phase[(dsps & 0xf00) >> 8]);
  847. /* however, just ignore it */
  848. }
  849. break;
  850. case A_PARITY_ERROR_MSG:
  851. printk(KERN_ERR "scsi%d (%d:%d) Parity Error!n", host->host_no,
  852.        pun, lun);
  853. NCR_700_internal_bus_reset(host);
  854. break;
  855. case A_SIMPLE_TAG_MSG:
  856. printk(KERN_INFO "scsi%d (%d:%d) SIMPLE TAG %d %sn", host->host_no,
  857.        pun, lun, hostdata->msgin[1],
  858.        NCR_700_phase[(dsps & 0xf00) >> 8]);
  859. /* just ignore it */
  860. break;
  861. default:
  862. printk(KERN_INFO "scsi%d (%d:%d): Unexpected message %s: ",
  863.        host->host_no, pun, lun,
  864.        NCR_700_phase[(dsps & 0xf00) >> 8]);
  865. print_msg(hostdata->msgin);
  866. printk("n");
  867. /* just reject it */
  868. hostdata->msgout[0] = A_REJECT_MSG;
  869. NCR_700_dma_cache_wback((unsigned long)hostdata->msgout, 1);
  870. script_patch_16(hostdata->script, MessageCount, 1);
  871. /* SendMsgOut returns, so set up the return
  872.  * address */
  873. resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
  874. break;
  875. }
  876. NCR_700_writel(temp, host, TEMP_REG);
  877. /* set us up to receive another message */
  878. NCR_700_dma_cache_inv((unsigned long)hostdata->msgin, MSG_ARRAY_SIZE);
  879. return resume_offset;
  880. }
  881. STATIC __u32
  882. process_script_interrupt(__u32 dsps, __u32 dsp, Scsi_Cmnd *SCp,
  883.  struct Scsi_Host *host,
  884.  struct NCR_700_Host_Parameters *hostdata)
  885. {
  886. __u32 resume_offset = 0;
  887. __u8 pun = 0xff, lun=0xff;
  888. if(SCp != NULL) {
  889. pun = SCp->target;
  890. lun = SCp->lun;
  891. }
  892. if(dsps == A_GOOD_STATUS_AFTER_STATUS) {
  893. DEBUG(("  COMMAND COMPLETE, status=%02xn",
  894.        hostdata->status[0]));
  895. /* OK, if TCQ still on, we know it works */
  896. NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING);
  897. /* check for contingent allegiance contitions */
  898. if(status_byte(hostdata->status[0]) == CHECK_CONDITION ||
  899.    status_byte(hostdata->status[0]) == COMMAND_TERMINATED) {
  900. struct NCR_700_command_slot *slot =
  901. (struct NCR_700_command_slot *)SCp->host_scribble;
  902. if(SCp->cmnd[0] == REQUEST_SENSE) {
  903. /* OOPS: bad device, returning another
  904.  * contingent allegiance condition */
  905. printk(KERN_ERR "scsi%d (%d:%d) broken device is looping in contingent allegiance: ignoringn", host->host_no, pun, lun);
  906. NCR_700_scsi_done(hostdata, SCp, hostdata->status[0]);
  907. } else {
  908. #ifdef NCR_DEBUG
  909. print_command(SCp->cmnd);
  910. printk("  cmd %p has status %d, requesting sensen",
  911.        SCp, hostdata->status[0]);
  912. #endif
  913. /* we can destroy the command here
  914.  * because the contingent allegiance
  915.  * condition will cause a retry which
  916.  * will re-copy the command from the
  917.  * saved data_cmnd.  We also unmap any
  918.  * data associated with the command
  919.  * here */
  920. NCR_700_unmap(hostdata, SCp, slot);
  921. SCp->cmnd[0] = REQUEST_SENSE;
  922. SCp->cmnd[1] = (SCp->lun & 0x7) << 5;
  923. SCp->cmnd[2] = 0;
  924. SCp->cmnd[3] = 0;
  925. SCp->cmnd[4] = sizeof(SCp->sense_buffer);
  926. SCp->cmnd[5] = 0;
  927. SCp->cmd_len = 6;
  928. /* Here's a quiet hack: the
  929.  * REQUEST_SENSE command is six bytes,
  930.  * so store a flag indicating that
  931.  * this was an internal sense request
  932.  * and the original status at the end
  933.  * of the command */
  934. SCp->cmnd[6] = NCR_700_INTERNAL_SENSE_MAGIC;
  935. SCp->cmnd[7] = hostdata->status[0];
  936. SCp->cmnd[8] = SCp->use_sg;
  937. SCp->use_sg = 0;
  938. SCp->sc_data_direction = SCSI_DATA_READ;
  939. pci_dma_sync_single(hostdata->pci_dev,
  940.     slot->pCmd,
  941.     SCp->cmd_len,
  942.     PCI_DMA_TODEVICE);
  943. SCp->request_bufflen = sizeof(SCp->sense_buffer);
  944. slot->dma_handle = pci_map_single(hostdata->pci_dev, SCp->sense_buffer, sizeof(SCp->sense_buffer), PCI_DMA_FROMDEVICE);
  945. slot->SG[0].ins = bS_to_host(SCRIPT_MOVE_DATA_IN | sizeof(SCp->sense_buffer));
  946. slot->SG[0].pAddr = bS_to_host(slot->dma_handle);
  947. slot->SG[1].ins = bS_to_host(SCRIPT_RETURN);
  948. slot->SG[1].pAddr = 0;
  949. slot->resume_offset = hostdata->pScript;
  950. NCR_700_dma_cache_wback((unsigned long)slot->SG, sizeof(slot->SG[0])*2);
  951. NCR_700_dma_cache_inv((unsigned long)SCp->sense_buffer, sizeof(SCp->sense_buffer));
  952. /* queue the command for reissue */
  953. slot->state = NCR_700_SLOT_QUEUED;
  954. hostdata->state = NCR_700_HOST_FREE;
  955. hostdata->cmd = NULL;
  956. }
  957. } else {
  958. // Currently rely on the mid layer evaluation
  959. // of the tag queuing capability
  960. //
  961. //if(status_byte(hostdata->status[0]) == GOOD &&
  962. //   SCp->cmnd[0] == INQUIRY && SCp->use_sg == 0) {
  963. // /* Piggy back the tag queueing support
  964. //  * on this command */
  965. // pci_dma_sync_single(hostdata->pci_dev,
  966. //     slot->dma_handle,
  967. //     SCp->request_bufflen,
  968. //     PCI_DMA_FROMDEVICE);
  969. // if(((char *)SCp->request_buffer)[7] & 0x02) {
  970. // printk(KERN_INFO "scsi%d: (%d:%d) Enabling Tag Command Queuingn", host->host_no, pun, lun);
  971. // hostdata->tag_negotiated |= (1<<SCp->target);
  972. // NCR_700_set_flag(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING);
  973. // } else {
  974. // NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING);
  975. // hostdata->tag_negotiated &= ~(1<<SCp->target);
  976. // }
  977. //}
  978. NCR_700_scsi_done(hostdata, SCp, hostdata->status[0]);
  979. }
  980. } else if((dsps & 0xfffff0f0) == A_UNEXPECTED_PHASE) {
  981. __u8 i = (dsps & 0xf00) >> 8;
  982. printk(KERN_ERR "scsi%d: (%d:%d), UNEXPECTED PHASE %s (%s)n",
  983.        host->host_no, pun, lun,
  984.        NCR_700_phase[i],
  985.        sbcl_to_string(NCR_700_readb(host, SBCL_REG)));
  986. printk(KERN_ERR "         len = %d, cmd =", SCp->cmd_len);
  987. print_command(SCp->cmnd);
  988. NCR_700_internal_bus_reset(host);
  989. } else if((dsps & 0xfffff000) == A_FATAL) {
  990. int i = (dsps & 0xfff);
  991. printk(KERN_ERR "scsi%d: (%d:%d) FATAL ERROR: %sn",
  992.        host->host_no, pun, lun, NCR_700_fatal_messages[i]);
  993. if(dsps == A_FATAL_ILLEGAL_MSG_LENGTH) {
  994. printk(KERN_ERR "     msg begins %02x %02xn",
  995.        hostdata->msgin[0], hostdata->msgin[1]);
  996. }
  997. NCR_700_internal_bus_reset(host);
  998. } else if((dsps & 0xfffff0f0) == A_DISCONNECT) {
  999. #ifdef NCR_700_DEBUG
  1000. __u8 i = (dsps & 0xf00) >> 8;
  1001. printk("scsi%d: (%d:%d), DISCONNECTED (%d) %sn",
  1002.        host->host_no, pun, lun,
  1003.        i, NCR_700_phase[i]);
  1004. #endif
  1005. save_for_reselection(hostdata, SCp, dsp);
  1006. } else if(dsps == A_RESELECTION_IDENTIFIED) {
  1007. __u8 lun;
  1008. struct NCR_700_command_slot *slot;
  1009. __u8 reselection_id = hostdata->reselection_id;
  1010. lun = hostdata->msgin[0] & 0x1f;
  1011. hostdata->reselection_id = 0xff;
  1012. DEBUG(("scsi%d: (%d:%d) RESELECTED!n",
  1013.        host->host_no, reselection_id, lun));
  1014. /* clear the reselection indicator */
  1015. if(hostdata->msgin[1] == A_SIMPLE_TAG_MSG) {
  1016. slot = find_ITLQ_Nexus(hostdata, reselection_id,
  1017.        lun, hostdata->msgin[2]);
  1018. } else {
  1019. slot = find_ITL_Nexus(hostdata, reselection_id, lun);
  1020. }
  1021. retry:
  1022. if(slot == NULL) {
  1023. struct NCR_700_command_slot *s = find_ITL_Nexus(hostdata, reselection_id, lun);
  1024. printk(KERN_ERR "scsi%d: (%d:%d) RESELECTED but no saved command (MSG = %02x %02x %02x)!!n",
  1025.        host->host_no, reselection_id, lun,
  1026.        hostdata->msgin[0], hostdata->msgin[1],
  1027.        hostdata->msgin[2]);
  1028. printk(KERN_ERR " OUTSTANDING TAGS:");
  1029. while(s != NULL) {
  1030. if(s->cmnd->target == reselection_id &&
  1031.    s->cmnd->lun == lun) {
  1032. printk("%d ", s->tag);
  1033. if(s->tag == hostdata->msgin[2]) {
  1034. printk(" ***FOUND*** n");
  1035. slot = s;
  1036. goto retry;
  1037. }
  1038. }
  1039. s = s->ITL_back;
  1040. }
  1041. printk("n");
  1042. } else {
  1043. if(hostdata->state != NCR_700_HOST_BUSY)
  1044. printk(KERN_ERR "scsi%d: FATAL, host not busy during valid reselection!n",
  1045.        host->host_no);
  1046. resume_offset = slot->resume_offset;
  1047. hostdata->cmd = slot->cmnd;
  1048. /* re-patch for this command */
  1049. script_patch_32_abs(hostdata->script, CommandAddress, 
  1050.     slot->pCmd);
  1051. script_patch_16(hostdata->script,
  1052. CommandCount, slot->cmnd->cmd_len);
  1053. script_patch_32_abs(hostdata->script, SGScriptStartAddress,
  1054.     to32bit(&slot->pSG[0].ins));
  1055. /* Note: setting SXFER only works if we're
  1056.  * still in the MESSAGE phase, so it is vital
  1057.  * that ACK is still asserted when we process
  1058.  * the reselection message.  The resume offset
  1059.  * should therefore always clear ACK */
  1060. NCR_700_writeb(NCR_700_get_SXFER(hostdata->cmd->device),
  1061.        host, SXFER_REG);
  1062. NCR_700_dma_cache_inv((unsigned long)hostdata->msgin,
  1063.       MSG_ARRAY_SIZE);
  1064. NCR_700_dma_cache_wback((unsigned long)hostdata->msgout,
  1065. MSG_ARRAY_SIZE);
  1066. /* I'm just being paranoid here, the command should
  1067.  * already have been flushed from the cache */
  1068. NCR_700_dma_cache_wback((unsigned long)slot->cmnd->cmnd,
  1069. slot->cmnd->cmd_len);
  1070. }
  1071. } else if(dsps == A_RESELECTED_DURING_SELECTION) {
  1072. /* This section is full of debugging code because I've
  1073.  * never managed to reach it.  I think what happens is
  1074.  * that, because the 700 runs with selection
  1075.  * interrupts enabled the whole time that we take a
  1076.  * selection interrupt before we manage to get to the
  1077.  * reselected script interrupt */
  1078. __u8 reselection_id = NCR_700_readb(host, SFBR_REG);
  1079. struct NCR_700_command_slot *slot;
  1080. /* Take out our own ID */
  1081. reselection_id &= ~(1<<host->this_id);
  1082. /* I've never seen this happen, so keep this as a printk rather
  1083.  * than a debug */
  1084. printk(KERN_INFO "scsi%d: (%d:%d) RESELECTION DURING SELECTION, dsp=%08x[%04x] state=%d, count=%dn",
  1085.        host->host_no, reselection_id, lun, dsp, dsp - hostdata->pScript, hostdata->state, hostdata->command_slot_count);
  1086. {
  1087. /* FIXME: DEBUGGING CODE */
  1088. __u32 SG = (__u32)bS_to_cpu(hostdata->script[A_SGScriptStartAddress_used[0]]);
  1089. int i;
  1090. for(i=0; i< NCR_700_COMMAND_SLOTS_PER_HOST; i++) {
  1091. if(SG >= to32bit(&hostdata->slots[i].pSG[0])
  1092.    && SG <= to32bit(&hostdata->slots[i].pSG[NCR_700_SG_SEGMENTS]))
  1093. break;
  1094. }
  1095. printk(KERN_INFO "IDENTIFIED SG segment as being %08x in slot %p, cmd %p, slot->resume_offset=%08xn", SG, &hostdata->slots[i], hostdata->slots[i].cmnd, hostdata->slots[i].resume_offset);
  1096. SCp =  hostdata->slots[i].cmnd;
  1097. }
  1098. if(SCp != NULL) {
  1099. slot = (struct NCR_700_command_slot *)SCp->host_scribble;
  1100. /* change slot from busy to queued to redo command */
  1101. slot->state = NCR_700_SLOT_QUEUED;
  1102. }
  1103. hostdata->cmd = NULL;
  1104. if(reselection_id == 0) {
  1105. if(hostdata->reselection_id == 0xff) {
  1106. printk(KERN_ERR "scsi%d: Invalid reselection during selection!!n", host->host_no);
  1107. return 0;
  1108. } else {
  1109. printk(KERN_ERR "scsi%d: script reselected and we took a selection interruptn",
  1110.        host->host_no);
  1111. reselection_id = hostdata->reselection_id;
  1112. }
  1113. } else {
  1114. /* convert to real ID */
  1115. reselection_id = bitmap_to_number(reselection_id);
  1116. }
  1117. hostdata->reselection_id = reselection_id;
  1118. /* just in case we have a stale simple tag message, clear it */
  1119. hostdata->msgin[1] = 0;
  1120. NCR_700_dma_cache_wback_inv((unsigned long)hostdata->msgin,
  1121.     MSG_ARRAY_SIZE);
  1122. if(hostdata->tag_negotiated & (1<<reselection_id)) {
  1123. resume_offset = hostdata->pScript + Ent_GetReselectionWithTag;
  1124. } else {
  1125. resume_offset = hostdata->pScript + Ent_GetReselectionData;
  1126. }
  1127. } else if(dsps == A_COMPLETED_SELECTION_AS_TARGET) {
  1128. /* we've just disconnected from the bus, do nothing since
  1129.  * a return here will re-run the queued command slot
  1130.  * that may have been interrupted by the initial selection */
  1131. DEBUG((" SELECTION COMPLETEDn"));
  1132. } else if((dsps & 0xfffff0f0) == A_MSG_IN) { 
  1133. resume_offset = process_message(host, hostdata, SCp,
  1134. dsp, dsps);
  1135. } else if((dsps &  0xfffff000) == 0) {
  1136. __u8 i = (dsps & 0xf0) >> 4, j = (dsps & 0xf00) >> 8;
  1137. printk(KERN_ERR "scsi%d: (%d:%d), unhandled script condition %s %s at %04xn",
  1138.        host->host_no, pun, lun, NCR_700_condition[i],
  1139.        NCR_700_phase[j], dsp - hostdata->pScript);
  1140. if(SCp != NULL) {
  1141. print_command(SCp->cmnd);
  1142. if(SCp->use_sg) {
  1143. for(i = 0; i < SCp->use_sg + 1; i++) {
  1144. printk(KERN_INFO " SG[%d].length = %d, move_insn=%08x, addr %08xn", i, ((struct scatterlist *)SCp->buffer)[i].length, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].ins, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].pAddr);
  1145. }
  1146. }
  1147. }        
  1148. NCR_700_internal_bus_reset(host);
  1149. } else if((dsps & 0xfffff000) == A_DEBUG_INTERRUPT) {
  1150. printk(KERN_NOTICE "scsi%d (%d:%d) DEBUG INTERRUPT %d AT %08x[%04x], continuingn",
  1151.        host->host_no, pun, lun, dsps & 0xfff, dsp, dsp - hostdata->pScript);
  1152. resume_offset = dsp;
  1153. } else {
  1154. printk(KERN_ERR "scsi%d: (%d:%d), unidentified script interrupt 0x%x at %04xn",
  1155.        host->host_no, pun, lun, dsps, dsp - hostdata->pScript);
  1156. NCR_700_internal_bus_reset(host);
  1157. }
  1158. return resume_offset;
  1159. }
  1160. /* We run the 53c700 with selection interrupts always enabled.  This
  1161.  * means that the chip may be selected as soon as the bus frees.  On a
  1162.  * busy bus, this can be before the scripts engine finishes its
  1163.  * processing.  Therefore, part of the selection processing has to be
  1164.  * to find out what the scripts engine is doing and complete the
  1165.  * function if necessary (i.e. process the pending disconnect or save
  1166.  * the interrupted initial selection */
  1167. STATIC inline __u32
  1168. process_selection(struct Scsi_Host *host, __u32 dsp)
  1169. {
  1170. __u8 id = 0; /* Squash compiler warning */
  1171. int count = 0;
  1172. __u32 resume_offset = 0;
  1173. struct NCR_700_Host_Parameters *hostdata =
  1174. (struct NCR_700_Host_Parameters *)host->hostdata[0];
  1175. Scsi_Cmnd *SCp = hostdata->cmd;
  1176. __u8 sbcl;
  1177. for(count = 0; count < 5; count++) {
  1178. id = NCR_700_readb(host, hostdata->chip710 ?
  1179.    CTEST9_REG : SFBR_REG);
  1180. /* Take out our own ID */
  1181. id &= ~(1<<host->this_id);
  1182. if(id != 0) 
  1183. break;
  1184. udelay(5);
  1185. }
  1186. sbcl = NCR_700_readb(host, SBCL_REG);
  1187. if((sbcl & SBCL_IO) == 0) {
  1188. /* mark as having been selected rather than reselected */
  1189. id = 0xff;
  1190. } else {
  1191. /* convert to real ID */
  1192. hostdata->reselection_id = id = bitmap_to_number(id);
  1193. DEBUG(("scsi%d:  Reselected by %dn",
  1194.        host->host_no, id));
  1195. }
  1196. if(hostdata->state == NCR_700_HOST_BUSY && SCp != NULL) {
  1197. struct NCR_700_command_slot *slot =
  1198. (struct NCR_700_command_slot *)SCp->host_scribble;
  1199. DEBUG(("  ID %d WARNING: RESELECTION OF BUSY HOST, saving cmd %p, slot %p, addr %x [%04x], resume %x!n", id, hostdata->cmd, slot, dsp, dsp - hostdata->pScript, resume_offset));
  1200. switch(dsp - hostdata->pScript) {
  1201. case Ent_Disconnect1:
  1202. case Ent_Disconnect2:
  1203. save_for_reselection(hostdata, SCp, Ent_Disconnect2 + hostdata->pScript);
  1204. break;
  1205. case Ent_Disconnect3:
  1206. case Ent_Disconnect4:
  1207. save_for_reselection(hostdata, SCp, Ent_Disconnect4 + hostdata->pScript);
  1208. break;
  1209. case Ent_Disconnect5:
  1210. case Ent_Disconnect6:
  1211. save_for_reselection(hostdata, SCp, Ent_Disconnect6 + hostdata->pScript);
  1212. break;
  1213. case Ent_Disconnect7:
  1214. case Ent_Disconnect8:
  1215. save_for_reselection(hostdata, SCp, Ent_Disconnect8 + hostdata->pScript);
  1216. break;
  1217. case Ent_Finish1:
  1218. case Ent_Finish2:
  1219. process_script_interrupt(A_GOOD_STATUS_AFTER_STATUS, dsp, SCp, host, hostdata);
  1220. break;
  1221. default:
  1222. slot->state = NCR_700_SLOT_QUEUED;
  1223. break;
  1224. }
  1225. }
  1226. hostdata->state = NCR_700_HOST_BUSY;
  1227. hostdata->cmd = NULL;
  1228. /* clear any stale simple tag message */
  1229. hostdata->msgin[1] = 0;
  1230. NCR_700_dma_cache_wback_inv((unsigned long)hostdata->msgin, MSG_ARRAY_SIZE);
  1231. if(id == 0xff) {
  1232. /* Selected as target, Ignore */
  1233. resume_offset = hostdata->pScript + Ent_SelectedAsTarget;
  1234. } else if(hostdata->tag_negotiated & (1<<id)) {
  1235. resume_offset = hostdata->pScript + Ent_GetReselectionWithTag;
  1236. } else {
  1237. resume_offset = hostdata->pScript + Ent_GetReselectionData;
  1238. }
  1239. return resume_offset;
  1240. }
  1241. static inline void
  1242. NCR_700_clear_fifo(struct Scsi_Host *host) {
  1243. const struct NCR_700_Host_Parameters *hostdata
  1244. = (struct NCR_700_Host_Parameters *)host->hostdata[0];
  1245. if(hostdata->chip710) {
  1246. NCR_700_writeb(CLR_FIFO_710, host, CTEST8_REG);
  1247. } else {
  1248. NCR_700_writeb(CLR_FIFO, host, DFIFO_REG);
  1249. }
  1250. }
  1251. static inline void
  1252. NCR_700_flush_fifo(struct Scsi_Host *host) {
  1253. const struct NCR_700_Host_Parameters *hostdata
  1254. = (struct NCR_700_Host_Parameters *)host->hostdata[0];
  1255. if(hostdata->chip710) {
  1256. NCR_700_writeb(FLUSH_DMA_FIFO_710, host, CTEST8_REG);
  1257. udelay(10);
  1258. NCR_700_writeb(0, host, CTEST8_REG);
  1259. } else {
  1260. NCR_700_writeb(FLUSH_DMA_FIFO, host, DFIFO_REG);
  1261. udelay(10);
  1262. NCR_700_writeb(0, host, DFIFO_REG);
  1263. }
  1264. }
  1265. STATIC int
  1266. NCR_700_start_command(Scsi_Cmnd *SCp)
  1267. {
  1268. struct NCR_700_command_slot *slot =
  1269. (struct NCR_700_command_slot *)SCp->host_scribble;
  1270. struct NCR_700_Host_Parameters *hostdata =
  1271. (struct NCR_700_Host_Parameters *)SCp->host->hostdata[0];
  1272. unsigned long flags;
  1273. __u16 count = 1; /* for IDENTIFY message */
  1274. save_flags(flags);
  1275. cli();
  1276. if(hostdata->state != NCR_700_HOST_FREE) {
  1277. /* keep this inside the lock to close the race window where
  1278.  * the running command finishes on another CPU while we don't
  1279.  * change the state to queued on this one */
  1280. slot->state = NCR_700_SLOT_QUEUED;
  1281. restore_flags(flags);
  1282. DEBUG(("scsi%d: host busy, queueing command %p, slot %pn",
  1283.        SCp->host->host_no, slot->cmnd, slot));
  1284. return 0;
  1285. }
  1286. hostdata->state = NCR_700_HOST_BUSY;
  1287. hostdata->cmd = SCp;
  1288. slot->state = NCR_700_SLOT_BUSY;
  1289. /* keep interrupts disabled until we have the command correctly
  1290.  * set up so we cannot take a selection interrupt */
  1291. hostdata->msgout[0] = NCR_700_identify(SCp->cmnd[0] != REQUEST_SENSE,
  1292.        SCp->lun);
  1293. /* for INQUIRY or REQUEST_SENSE commands, we cannot be sure
  1294.  * if the negotiated transfer parameters still hold, so
  1295.  * always renegotiate them */
  1296. if(SCp->cmnd[0] == INQUIRY || SCp->cmnd[0] == REQUEST_SENSE) {
  1297. NCR_700_clear_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC);
  1298. }
  1299. /* REQUEST_SENSE is asking for contingent I_T_L(_Q) status.
  1300.  * If a contingent allegiance condition exists, the device
  1301.  * will refuse all tags, so send the request sense as untagged
  1302.  * */
  1303. if((hostdata->tag_negotiated & (1<<SCp->target))
  1304.    && (slot->tag != NCR_700_NO_TAG && SCp->cmnd[0] != REQUEST_SENSE)) {
  1305. hostdata->msgout[count++] = A_SIMPLE_TAG_MSG;
  1306. hostdata->msgout[count++] = slot->tag;
  1307. }
  1308. if(hostdata->fast &&
  1309.    NCR_700_is_flag_clear(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC)) {
  1310. memcpy(&hostdata->msgout[count], NCR_700_SDTR_msg,
  1311.        sizeof(NCR_700_SDTR_msg));
  1312. count += sizeof(NCR_700_SDTR_msg);
  1313. NCR_700_set_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION);
  1314. }
  1315. script_patch_16(hostdata->script, MessageCount, count);
  1316. script_patch_ID(hostdata->script,
  1317. Device_ID, 1<<SCp->target);
  1318. script_patch_32_abs(hostdata->script, CommandAddress, 
  1319.     slot->pCmd);
  1320. script_patch_16(hostdata->script, CommandCount, SCp->cmd_len);
  1321. /* finally plumb the beginning of the SG list into the script
  1322.  * */
  1323. script_patch_32_abs(hostdata->script, SGScriptStartAddress,
  1324.     to32bit(&slot->pSG[0].ins));
  1325. NCR_700_clear_fifo(SCp->host);
  1326. if(slot->resume_offset == 0)
  1327. slot->resume_offset = hostdata->pScript;
  1328. /* now perform all the writebacks and invalidates */
  1329. NCR_700_dma_cache_wback((unsigned long)hostdata->msgout, count);
  1330. NCR_700_dma_cache_inv((unsigned long)hostdata->msgin, MSG_ARRAY_SIZE);
  1331. NCR_700_dma_cache_wback((unsigned long)SCp->cmnd, SCp->cmd_len);
  1332. NCR_700_dma_cache_inv((unsigned long)hostdata->status, 1);
  1333. /* set the synchronous period/offset */
  1334. NCR_700_writeb(NCR_700_get_SXFER(SCp->device),
  1335.        SCp->host, SXFER_REG);
  1336. NCR_700_writel(slot->temp, SCp->host, TEMP_REG);
  1337. NCR_700_writel(slot->resume_offset, SCp->host, DSP_REG);
  1338. /* allow interrupts here so that if we're selected we can take
  1339.  * a selection interrupt.  The script start may not be
  1340.  * effective in this case, but the selection interrupt will
  1341.  * save our command in that case */
  1342. restore_flags(flags);
  1343. return 1;
  1344. }
  1345. void
  1346. NCR_700_intr(int irq, void *dev_id, struct pt_regs *regs)
  1347. {
  1348. struct Scsi_Host *host = (struct Scsi_Host *)dev_id;
  1349. struct NCR_700_Host_Parameters *hostdata =
  1350. (struct NCR_700_Host_Parameters *)host->hostdata[0];
  1351. __u8 istat;
  1352. __u32 resume_offset = 0;
  1353. __u8 pun = 0xff, lun = 0xff;
  1354. unsigned long flags;
  1355. /* Unfortunately, we have to take the io_request_lock here
  1356.  * rather than the host lock hostdata->lock because we're
  1357.  * looking to exclude queuecommand from messing with the
  1358.  * registers while we're processing the interrupt.  Since
  1359.  * queuecommand is called holding io_request_lock, and we have
  1360.  * to take io_request_lock before we call the command
  1361.  * scsi_done, we would get a deadlock if we took
  1362.  * hostdata->lock here and in queuecommand (because the order
  1363.  * of locking in queuecommand: 1) io_request_lock then 2)
  1364.  * hostdata->lock would be the reverse of taking it in this
  1365.  * routine */
  1366. spin_lock_irqsave(&io_request_lock, flags);
  1367. if((istat = NCR_700_readb(host, ISTAT_REG))
  1368.       & (SCSI_INT_PENDING | DMA_INT_PENDING)) {
  1369. __u32 dsps;
  1370. __u8 sstat0 = 0, dstat = 0;
  1371. __u32 dsp;
  1372. Scsi_Cmnd *SCp = hostdata->cmd;
  1373. enum NCR_700_Host_State state;
  1374. state = hostdata->state;
  1375. SCp = hostdata->cmd;
  1376. if(istat & SCSI_INT_PENDING) {
  1377. udelay(10);
  1378. sstat0 = NCR_700_readb(host, SSTAT0_REG);
  1379. }
  1380. if(istat & DMA_INT_PENDING) {
  1381. udelay(10);
  1382. dstat = NCR_700_readb(host, DSTAT_REG);
  1383. }
  1384. dsps = NCR_700_readl(host, DSPS_REG);
  1385. dsp = NCR_700_readl(host, DSP_REG);
  1386. DEBUG(("scsi%d: istat %02x sstat0 %02x dstat %02x dsp %04x[%08x] dsps 0x%xn",
  1387.        host->host_no, istat, sstat0, dstat,
  1388.        (dsp - (__u32)(hostdata->pScript))/4,
  1389.        dsp, dsps));
  1390. if(SCp != NULL) {
  1391. pun = SCp->target;
  1392. lun = SCp->lun;
  1393. }
  1394. if(sstat0 & SCSI_RESET_DETECTED) {
  1395. Scsi_Device *SDp;
  1396. int i;
  1397. hostdata->state = NCR_700_HOST_BUSY;
  1398. printk(KERN_ERR "scsi%d: Bus Reset detected, executing command %p, slot %p, dsp %08x[%04x]n",
  1399.        host->host_no, SCp, SCp == NULL ? NULL : SCp->host_scribble, dsp, dsp - hostdata->pScript);
  1400. /* clear all the negotiated parameters */
  1401. for(SDp = host->host_queue; SDp != NULL; SDp = SDp->next)
  1402. SDp->hostdata = 0;
  1403. /* clear all the slots and their pending commands */
  1404. for(i = 0; i < NCR_700_COMMAND_SLOTS_PER_HOST; i++) {
  1405. Scsi_Cmnd *SCp;
  1406. struct NCR_700_command_slot *slot =
  1407. &hostdata->slots[i];
  1408. if(slot->state == NCR_700_SLOT_FREE)
  1409. continue;
  1410. SCp = slot->cmnd;
  1411. printk(KERN_ERR " failing command because of reset, slot %p, cmnd %pn",
  1412.        slot, SCp);
  1413. free_slot(slot, hostdata);
  1414. SCp->host_scribble = NULL;
  1415. NCR_700_set_depth(SCp->device, 0);
  1416. /* NOTE: deadlock potential here: we
  1417.  * rely on mid-layer guarantees that
  1418.  * scsi_done won't try to issue the
  1419.  * command again otherwise we'll
  1420.  * deadlock on the
  1421.  * hostdata->state_lock */
  1422. SCp->result = DID_RESET << 16;
  1423. SCp->scsi_done(SCp);
  1424. }
  1425. mdelay(25);
  1426. NCR_700_chip_setup(host);
  1427. hostdata->state = NCR_700_HOST_FREE;
  1428. hostdata->cmd = NULL;
  1429. goto out_unlock;
  1430. } else if(sstat0 & SELECTION_TIMEOUT) {
  1431. DEBUG(("scsi%d: (%d:%d) selection timeoutn",
  1432.        host->host_no, pun, lun));
  1433. NCR_700_scsi_done(hostdata, SCp, DID_NO_CONNECT<<16);
  1434. } else if(sstat0 & PHASE_MISMATCH) {
  1435. struct NCR_700_command_slot *slot = (SCp == NULL) ? NULL :
  1436. (struct NCR_700_command_slot *)SCp->host_scribble;
  1437. if(dsp == Ent_SendMessage + 8 + hostdata->pScript) {
  1438. /* It wants to reply to some part of
  1439.  * our message */
  1440. #ifdef NCR_700_DEBUG
  1441. __u32 temp = NCR_700_readl(host, TEMP_REG);
  1442. int count = (hostdata->script[Ent_SendMessage/4] & 0xffffff) - ((NCR_700_readl(host, DBC_REG) & 0xffffff) + NCR_700_data_residual(host));
  1443. printk("scsi%d (%d:%d) PHASE MISMATCH IN SEND MESSAGE %d remain, return %p[%04x], phase %sn", host->host_no, pun, lun, count, (void *)temp, temp - hostdata->pScript, sbcl_to_string(NCR_700_readb(host, SBCL_REG)));
  1444. #endif
  1445. resume_offset = hostdata->pScript + Ent_SendMessagePhaseMismatch;
  1446. } else if(dsp >= to32bit(&slot->pSG[0].ins) &&
  1447.   dsp <= to32bit(&slot->pSG[NCR_700_SG_SEGMENTS].ins)) {
  1448. int data_transfer = NCR_700_readl(host, DBC_REG) & 0xffffff;
  1449. int SGcount = (dsp - to32bit(&slot->pSG[0].ins))/sizeof(struct NCR_700_SG_List);
  1450. int residual = NCR_700_data_residual(host);
  1451. int i;
  1452. #ifdef NCR_700_DEBUG
  1453. __u32 naddr = NCR_700_readl(host, DNAD_REG);
  1454. printk("scsi%d: (%d:%d) Expected phase mismatch in slot->SG[%d], transferred 0x%xn",
  1455.        host->host_no, pun, lun,
  1456.        SGcount, data_transfer);
  1457. print_command(SCp->cmnd);
  1458. if(residual) {
  1459. printk("scsi%d: (%d:%d) Expected phase mismatch in slot->SG[%d], transferred 0x%x, residual %dn",
  1460.        host->host_no, pun, lun,
  1461.        SGcount, data_transfer, residual);
  1462. }
  1463. #endif
  1464. data_transfer += residual;
  1465. if(data_transfer != 0) {
  1466. int count; 
  1467. __u32 pAddr;
  1468. SGcount--;
  1469. count = (bS_to_cpu(slot->SG[SGcount].ins) & 0x00ffffff);
  1470. DEBUG(("DATA TRANSFER MISMATCH, count = %d, transferred %dn", count, count-data_transfer));
  1471. slot->SG[SGcount].ins &= bS_to_host(0xff000000);
  1472. slot->SG[SGcount].ins |= bS_to_host(data_transfer);
  1473. pAddr = bS_to_cpu(slot->SG[SGcount].pAddr);
  1474. pAddr += (count - data_transfer);
  1475. #ifdef NCR_700_DEBUG
  1476. if(pAddr != naddr) {
  1477. printk("scsi%d (%d:%d) transfer mismatch pAddr=%lx, naddr=%lx, data_transfer=%d, residual=%dn", host->host_no, pun, lun, (unsigned long)pAddr, (unsigned long)naddr, data_transfer, residual);
  1478. }
  1479. #endif
  1480. slot->SG[SGcount].pAddr = bS_to_host(pAddr);
  1481. }
  1482. /* set the executed moves to nops */
  1483. for(i=0; i<SGcount; i++) {
  1484. slot->SG[i].ins = bS_to_host(SCRIPT_NOP);
  1485. slot->SG[i].pAddr = 0;
  1486. }
  1487. NCR_700_dma_cache_wback((unsigned long)slot->SG, sizeof(slot->SG));
  1488. /* and pretend we disconnected after
  1489.  * the command phase */
  1490. resume_offset = hostdata->pScript + Ent_MsgInDuringData;
  1491. /* make sure all the data is flushed */
  1492. NCR_700_flush_fifo(host);
  1493. } else {
  1494. __u8 sbcl = NCR_700_readb(host, SBCL_REG);
  1495. printk(KERN_ERR "scsi%d: (%d:%d) phase mismatch at %04x, phase %sn",
  1496.        host->host_no, pun, lun, dsp - hostdata->pScript, sbcl_to_string(sbcl));
  1497. NCR_700_internal_bus_reset(host);
  1498. }
  1499. } else if(sstat0 & SCSI_GROSS_ERROR) {
  1500. printk(KERN_ERR "scsi%d: (%d:%d) GROSS ERRORn",
  1501.        host->host_no, pun, lun);
  1502. NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
  1503. } else if(sstat0 & PARITY_ERROR) {
  1504. printk(KERN_ERR "scsi%d: (%d:%d) PARITY ERRORn",
  1505.        host->host_no, pun, lun);
  1506. NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
  1507. } else if(dstat & SCRIPT_INT_RECEIVED) {
  1508. DEBUG(("scsi%d: (%d:%d) ====>SCRIPT INTERRUPT<====n",
  1509.        host->host_no, pun, lun));
  1510. resume_offset = process_script_interrupt(dsps, dsp, SCp, host, hostdata);
  1511. } else if(dstat & (ILGL_INST_DETECTED)) {
  1512. printk(KERN_ERR "scsi%d: (%d:%d) Illegal Instruction detected at 0x%08x[0x%x]!!!n"
  1513.        "         Please email James.Bottomley@HansenPartnership.com with the detailsn",
  1514.        host->host_no, pun, lun,
  1515.        dsp, dsp - hostdata->pScript);
  1516. NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
  1517. } else if(dstat & (WATCH_DOG_INTERRUPT|ABORTED)) {
  1518. printk(KERN_ERR "scsi%d: (%d:%d) serious DMA problem, dstat=%02xn",
  1519.        host->host_no, pun, lun, dstat);
  1520. NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
  1521. }
  1522. /* NOTE: selection interrupt processing MUST occur
  1523.  * after script interrupt processing to correctly cope
  1524.  * with the case where we process a disconnect and
  1525.  * then get reselected before we process the
  1526.  * disconnection */
  1527. if(sstat0 & SELECTED) {
  1528. /* FIXME: It currently takes at least FOUR
  1529.  * interrupts to complete a command that
  1530.  * disconnects: one for the disconnect, one
  1531.  * for the reselection, one to get the
  1532.  * reselection data and one to complete the
  1533.  * command.  If we guess the reselected
  1534.  * command here and prepare it, we only need
  1535.  * to get a reselection data interrupt if we
  1536.  * guessed wrongly.  Since the interrupt
  1537.  * overhead is much greater than the command
  1538.  * setup, this would be an efficient
  1539.  * optimisation particularly as we probably
  1540.  * only have one outstanding command on a
  1541.  * target most of the time */
  1542. resume_offset = process_selection(host, dsp);
  1543. }
  1544. }
  1545. if(resume_offset) {
  1546. if(hostdata->state != NCR_700_HOST_BUSY) {
  1547. printk(KERN_ERR "scsi%d: Driver error: resume at 0x%08x [0x%04x] with non busy host!n",
  1548.        host->host_no, resume_offset, resume_offset - hostdata->pScript);
  1549. hostdata->state = NCR_700_HOST_BUSY;
  1550. }
  1551. DEBUG(("Attempting to resume at %xn", resume_offset));
  1552. NCR_700_clear_fifo(host);
  1553. NCR_700_writel(resume_offset, host, DSP_REG);
  1554. /* There is probably a technical no-no about this: If we're a
  1555.  * shared interrupt and we got this interrupt because the
  1556.  * other device needs servicing not us, we're still going to
  1557.  * check our queued commands here---of course, there shouldn't
  1558.  * be any outstanding.... */
  1559. if(hostdata->state == NCR_700_HOST_FREE) {
  1560. int i;
  1561. for(i = 0; i < NCR_700_COMMAND_SLOTS_PER_HOST; i++) {
  1562. /* fairness: always run the queue from the last
  1563.  * position we left off */
  1564. int j = (i + hostdata->saved_slot_position)
  1565. % NCR_700_COMMAND_SLOTS_PER_HOST;
  1566. if(hostdata->slots[j].state != NCR_700_SLOT_QUEUED)
  1567. continue;
  1568. if(NCR_700_start_command(hostdata->slots[j].cmnd)) {
  1569. DEBUG(("scsi%d: Issuing saved command slot %p, cmd %ptn",
  1570.        host->host_no, &hostdata->slots[j],
  1571.        hostdata->slots[j].cmnd));
  1572. hostdata->saved_slot_position = j + 1;
  1573. }
  1574. break;
  1575. }
  1576. }
  1577.  out_unlock:
  1578. spin_unlock_irqrestore(&io_request_lock, flags);
  1579. }
  1580. /* FIXME: Need to put some proc information in and plumb it
  1581.  * into the scsi proc system */
  1582. STATIC int
  1583. NCR_700_proc_directory_info(char *proc_buf, char **startp,
  1584.  off_t offset, int bytes_available,
  1585.  int host_no, int write)
  1586. {
  1587. static char buf[4096]; /* 1 page should be sufficient */
  1588. int len = 0;
  1589. struct Scsi_Host *host = scsi_hostlist;
  1590. struct NCR_700_Host_Parameters *hostdata;
  1591. Scsi_Device *SDp;
  1592. while(host != NULL && host->host_no != host_no)
  1593. host = host->next;
  1594. if(host == NULL)
  1595. return 0;
  1596. if(write) {
  1597. /* FIXME: Clear internal statistics here */
  1598. return 0;
  1599. }
  1600. hostdata = (struct NCR_700_Host_Parameters *)host->hostdata[0];
  1601. len += sprintf(&buf[len], "Total commands outstanding: %dn", hostdata->command_slot_count);
  1602. len += sprintf(&buf[len],"
  1603. Target Depth  Active  Next Tagn
  1604. ====== =====  ======  ========n");
  1605. for(SDp = host->host_queue; SDp != NULL; SDp = SDp->next) {
  1606. len += sprintf(&buf[len]," %2d:%2d   %4d    %4d      %4dn", SDp->id, SDp->lun, SDp->queue_depth, NCR_700_get_depth(SDp), SDp->current_tag);
  1607. }
  1608. if((len -= offset) <= 0)
  1609. return 0;
  1610. if(len > bytes_available)
  1611. len = bytes_available;
  1612. memcpy(proc_buf, buf + offset, len);
  1613. return len;
  1614. }
  1615. STATIC int
  1616. NCR_700_queuecommand(Scsi_Cmnd *SCp, void (*done)(Scsi_Cmnd *))
  1617. {
  1618. struct NCR_700_Host_Parameters *hostdata = 
  1619. (struct NCR_700_Host_Parameters *)SCp->host->hostdata[0];
  1620. __u32 move_ins;
  1621. int pci_direction;
  1622. struct NCR_700_command_slot *slot;
  1623. int hash;
  1624. if(hostdata->command_slot_count >= NCR_700_COMMAND_SLOTS_PER_HOST) {
  1625. /* We're over our allocation, this should never happen
  1626.  * since we report the max allocation to the mid layer */
  1627. printk(KERN_WARNING "scsi%d: Command depth has gone over queue depthn", SCp->host->host_no);
  1628. return 1;
  1629. }
  1630. if(NCR_700_get_depth(SCp->device) != 0 && !(hostdata->tag_negotiated & (1<<SCp->target))) {
  1631. DEBUG((KERN_ERR "scsi%d (%d:%d) has non zero depth %dn",
  1632.        SCp->host->host_no, SCp->target, SCp->lun,
  1633.        NCR_700_get_depth(SCp->device)));
  1634. return 1;
  1635. }
  1636. if(NCR_700_get_depth(SCp->device) >= NCR_700_MAX_TAGS) {
  1637. DEBUG((KERN_ERR "scsi%d (%d:%d) has max tag depth %dn",
  1638.        SCp->host->host_no, SCp->target, SCp->lun,
  1639.        NCR_700_get_depth(SCp->device)));
  1640. return 1;
  1641. }
  1642. NCR_700_set_depth(SCp->device, NCR_700_get_depth(SCp->device) + 1);
  1643. /* begin the command here */
  1644. /* no need to check for NULL, test for command_slot_cound above
  1645.  * ensures a slot is free */
  1646. slot = find_empty_slot(hostdata);
  1647. slot->cmnd = SCp;
  1648. SCp->scsi_done = done;
  1649. SCp->host_scribble = (unsigned char *)slot;
  1650. SCp->SCp.ptr = NULL;
  1651. SCp->SCp.buffer = NULL;
  1652. #ifdef NCR_700_DEBUG
  1653. printk("53c700: scsi%d, command ", SCp->host->host_no);
  1654. print_command(SCp->cmnd);
  1655. #endif
  1656. if(SCp->device->tagged_supported && !SCp->device->tagged_queue
  1657.    && (hostdata->tag_negotiated &(1<<SCp->target)) == 0
  1658.    && NCR_700_is_flag_clear(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING)) {
  1659. /* upper layer has indicated tags are supported.  We don't
  1660.  * necessarily believe it yet.
  1661.  *
  1662.  * NOTE: There is a danger here: the mid layer supports
  1663.  * tag queuing per LUN.  We only support it per PUN because
  1664.  * of potential reselection issues */
  1665. printk(KERN_INFO "scsi%d: (%d:%d) Enabling Tag Command Queuingn", SCp->device->host->host_no, SCp->target, SCp->lun);
  1666. hostdata->tag_negotiated |= (1<<SCp->target);
  1667. NCR_700_set_flag(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING);
  1668. SCp->device->tagged_queue = 1;
  1669. }
  1670. if(hostdata->tag_negotiated &(1<<SCp->target)) {
  1671. struct NCR_700_command_slot *old =
  1672. find_ITL_Nexus(hostdata, SCp->target, SCp->lun);
  1673. #ifdef NCR_700_TAG_DEBUG
  1674. struct NCR_700_command_slot *found;
  1675. #endif
  1676. if(old != NULL && old->tag == SCp->device->current_tag) {
  1677. /* On some badly starving drives, this can be
  1678.  * a frequent occurance, so print the message
  1679.  * only once */
  1680. if(NCR_700_is_flag_clear(SCp->device, NCR_700_DEV_TAG_STARVATION_WARNED)) {
  1681. printk(KERN_WARNING "scsi%d (%d:%d) Target is suffering from tag starvation.n", SCp->host->host_no, SCp->target, SCp->lun);
  1682. NCR_700_set_flag(SCp->device, NCR_700_DEV_TAG_STARVATION_WARNED);
  1683. }
  1684. return 1;
  1685. }
  1686. slot->tag = SCp->device->current_tag++;
  1687. #ifdef NCR_700_TAG_DEBUG
  1688. while((found = find_ITLQ_Nexus(hostdata, SCp->target, SCp->lun, slot->tag)) != NULL) {
  1689. printk("nn**ERROR** already using tag %d, but oldest is %dn", slot->tag, (old == NULL) ? -1 : old->tag);
  1690. printk("  FOUND = %p, tag = %d, pun = %d, lun = %dn",
  1691.        found, found->tag, found->cmnd->target, found->cmnd->lun);
  1692. slot->tag = SCp->device->current_tag++;
  1693. printk("   Tag list is: ");
  1694. while(old != NULL) {
  1695. if(old->cmnd->target == SCp->target &&
  1696.    old->cmnd->lun == SCp->lun)
  1697. printk("%d ", old->tag);
  1698. old = old->ITL_back;
  1699. }
  1700. printk("nn");
  1701. }
  1702. #endif
  1703. hash = hash_ITLQ(SCp->target, SCp->lun, slot->tag);
  1704. /* link into the ITLQ hash queues */
  1705. slot->ITLQ_forw = hostdata->ITLQ_Hash_forw[hash];
  1706. hostdata->ITLQ_Hash_forw[hash] = slot;
  1707. #ifdef NCR_700_TAG_DEBUG
  1708. if(slot->ITLQ_forw != NULL && slot->ITLQ_forw->ITLQ_back != NULL) {
  1709. printk(KERN_ERR "scsi%d (%d:%d) ITLQ_back is not NULL!!!!n", SCp->host->host_no, SCp->target, SCp->lun);
  1710. }
  1711. #endif
  1712. if(slot->ITLQ_forw != NULL)
  1713. slot->ITLQ_forw->ITLQ_back = slot;
  1714. else
  1715. hostdata->ITLQ_Hash_back[hash] = slot;
  1716. slot->ITLQ_back = NULL;
  1717. } else {
  1718. slot->tag = NCR_700_NO_TAG;
  1719. }
  1720. /* link into the ITL hash queues */
  1721. hash = hash_ITL(SCp->target, SCp->lun);
  1722. slot->ITL_forw = hostdata->ITL_Hash_forw[hash];
  1723. hostdata->ITL_Hash_forw[hash] = slot;
  1724. #ifdef NCR_700_TAG_DEBUG
  1725. if(slot->ITL_forw != NULL && slot->ITL_forw->ITL_back != NULL) {
  1726. printk(KERN_ERR "scsi%d (%d:%d) ITL_back is not NULL!!!!n",
  1727.        SCp->host->host_no, SCp->target, SCp->lun);
  1728. }
  1729. #endif
  1730. if(slot->ITL_forw != NULL)
  1731. slot->ITL_forw->ITL_back = slot;
  1732. else
  1733. hostdata->ITL_Hash_back[hash] = slot;
  1734. slot->ITL_back = NULL;
  1735. /* sanity check: some of the commands generated by the mid-layer
  1736.  * have an eccentric idea of their sc_data_direction */
  1737. if(!SCp->use_sg && !SCp->request_bufflen 
  1738.    && SCp->sc_data_direction != SCSI_DATA_NONE) {
  1739. #ifdef NCR_700_DEBUG
  1740. printk("53c700: Command");
  1741. print_command(SCp->cmnd);
  1742. printk("Has wrong data direction %dn", SCp->sc_data_direction);
  1743. #endif
  1744. SCp->sc_data_direction = SCSI_DATA_NONE;
  1745. }
  1746. switch (SCp->cmnd[0]) {
  1747. case REQUEST_SENSE:
  1748. /* clear the internal sense magic */
  1749. SCp->cmnd[6] = 0;
  1750. /* fall through */
  1751. default:
  1752. /* OK, get it from the command */
  1753. switch(SCp->sc_data_direction) {
  1754. case SCSI_DATA_UNKNOWN:
  1755. default:
  1756. printk(KERN_ERR "53c700: Unknown command for data direction ");
  1757. print_command(SCp->cmnd);
  1758. move_ins = 0;
  1759. break;
  1760. case SCSI_DATA_NONE:
  1761. move_ins = 0;
  1762. break;
  1763. case SCSI_DATA_READ:
  1764. move_ins = SCRIPT_MOVE_DATA_IN;
  1765. break;
  1766. case SCSI_DATA_WRITE:
  1767. move_ins = SCRIPT_MOVE_DATA_OUT;
  1768. break;
  1769. }
  1770. }
  1771. /* now build the scatter gather list */
  1772. pci_direction = scsi_to_pci_dma_dir(SCp->sc_data_direction);
  1773. if(move_ins != 0) {
  1774. int i;
  1775. int sg_count;
  1776. dma_addr_t vPtr = 0;
  1777. __u32 count = 0;
  1778. if(SCp->use_sg) {
  1779. sg_count = pci_map_sg(hostdata->pci_dev, SCp->buffer,
  1780.       SCp->use_sg, pci_direction);
  1781. } else {
  1782. vPtr = pci_map_single(hostdata->pci_dev,
  1783.       SCp->request_buffer, 
  1784.       SCp->request_bufflen,
  1785.       pci_direction);
  1786. count = SCp->request_bufflen;
  1787. slot->dma_handle = vPtr;
  1788. sg_count = 1;
  1789. }
  1790. for(i = 0; i < sg_count; i++) {
  1791. if(SCp->use_sg) {
  1792. struct scatterlist *sg = SCp->buffer;
  1793. vPtr = sg_dma_address(&sg[i]);
  1794. count = sg_dma_len(&sg[i]);
  1795. }
  1796. slot->SG[i].ins = bS_to_host(move_ins | count);
  1797. DEBUG((" scatter block %d: move %d[%08x] from 0x%lxn",
  1798.        i, count, slot->SG[i].ins, (unsigned long)vPtr));
  1799. slot->SG[i].pAddr = bS_to_host(vPtr);
  1800. }
  1801. slot->SG[i].ins = bS_to_host(SCRIPT_RETURN);
  1802. slot->SG[i].pAddr = 0;
  1803. NCR_700_dma_cache_wback((unsigned long)slot->SG, sizeof(slot->SG));
  1804. DEBUG((" SETTING %08lx to %xn",
  1805.        (&slot->pSG[i].ins), 
  1806.        slot->SG[i].ins));
  1807. }
  1808. slot->resume_offset = 0;
  1809. slot->pCmd = pci_map_single(hostdata->pci_dev, SCp->cmnd,
  1810.     sizeof(SCp->cmnd), PCI_DMA_TODEVICE);
  1811. NCR_700_start_command(SCp);
  1812. return 0;
  1813. }
  1814. STATIC int
  1815. NCR_700_abort(Scsi_Cmnd * SCp)
  1816. {
  1817. struct NCR_700_command_slot *slot;
  1818. struct NCR_700_Host_Parameters *hostdata = 
  1819. (struct NCR_700_Host_Parameters *)SCp->host->hostdata[0];
  1820. printk(KERN_INFO "scsi%d (%d:%d) New error handler wants to abort commandnt",
  1821.        SCp->host->host_no, SCp->target, SCp->lun);
  1822. print_command(SCp->cmnd);
  1823. slot = find_ITL_Nexus(hostdata, SCp->target, SCp->lun);
  1824. while(slot != NULL && slot->cmnd != SCp)
  1825. slot = slot->ITL_back;
  1826. if(slot == NULL)
  1827. /* no outstanding command to abort */
  1828. return SUCCESS;
  1829. if(SCp->cmnd[0] == TEST_UNIT_READY) {
  1830. /* FIXME: This is because of a problem in the new
  1831.  * error handler.  When it is in error recovery, it
  1832.  * will send a TUR to a device it thinks may still be
  1833.  * showing a problem.  If the TUR isn't responded to,
  1834.  * it will abort it and mark the device off line.
  1835.  * Unfortunately, it does no other error recovery, so
  1836.  * this would leave us with an outstanding command
  1837.  * occupying a slot.  Rather than allow this to
  1838.  * happen, we issue a bus reset to force all
  1839.  * outstanding commands to terminate here. */
  1840. NCR_700_internal_bus_reset(SCp->host);
  1841. /* still drop through and return failed */
  1842. }
  1843. return FAILED;
  1844. }
  1845. STATIC int
  1846. NCR_700_bus_reset(Scsi_Cmnd * SCp)
  1847. {
  1848. printk(KERN_INFO "scsi%d (%d:%d) New error handler wants BUS reset, cmd %pnt",
  1849.        SCp->host->host_no, SCp->target, SCp->lun, SCp);
  1850. print_command(SCp->cmnd);
  1851. NCR_700_internal_bus_reset(SCp->host);
  1852. return SUCCESS;
  1853. }
  1854. STATIC int
  1855. NCR_700_dev_reset(Scsi_Cmnd * SCp)
  1856. {
  1857. printk(KERN_INFO "scsi%d (%d:%d) New error handler wants device resetnt",
  1858.        SCp->host->host_no, SCp->target, SCp->lun);
  1859. print_command(SCp->cmnd);
  1860. return FAILED;
  1861. }
  1862. STATIC int
  1863. NCR_700_host_reset(Scsi_Cmnd * SCp)
  1864. {
  1865. printk(KERN_INFO "scsi%d (%d:%d) New error handler wants HOST resetnt",
  1866.        SCp->host->host_no, SCp->target, SCp->lun);
  1867. print_command(SCp->cmnd);
  1868. NCR_700_internal_bus_reset(SCp->host);
  1869. NCR_700_chip_reset(SCp->host);
  1870. return SUCCESS;
  1871. }
  1872. EXPORT_SYMBOL(NCR_700_detect);
  1873. EXPORT_SYMBOL(NCR_700_release);
  1874. EXPORT_SYMBOL(NCR_700_intr);