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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Device driver for the SYMBIOS/LSILOGIC 53C8XX and 53C1010 family 
  3.  * of PCI-SCSI IO processors.
  4.  *
  5.  * Copyright (C) 1999-2001  Gerard Roudier <groudier@free.fr>
  6.  *
  7.  * This driver is derived from the Linux sym53c8xx driver.
  8.  * Copyright (C) 1998-2000  Gerard Roudier
  9.  *
  10.  * The sym53c8xx driver is derived from the ncr53c8xx driver that had been 
  11.  * a port of the FreeBSD ncr driver to Linux-1.2.13.
  12.  *
  13.  * The original ncr driver has been written for 386bsd and FreeBSD by
  14.  *         Wolfgang Stanglmeier        <wolf@cologne.de>
  15.  *         Stefan Esser                <se@mi.Uni-Koeln.de>
  16.  * Copyright (C) 1994  Wolfgang Stanglmeier
  17.  *
  18.  * Other major contributions:
  19.  *
  20.  * NVRAM detection and reading.
  21.  * Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk>
  22.  *
  23.  *-----------------------------------------------------------------------------
  24.  *
  25.  * Redistribution and use in source and binary forms, with or without
  26.  * modification, are permitted provided that the following conditions
  27.  * are met:
  28.  * 1. Redistributions of source code must retain the above copyright
  29.  *    notice, this list of conditions and the following disclaimer.
  30.  * 2. The name of the author may not be used to endorse or promote products
  31.  *    derived from this software without specific prior written permission.
  32.  *
  33.  * Where this Software is combined with software released under the terms of 
  34.  * the GNU Public License ("GPL") and the terms of the GPL would require the 
  35.  * combined work to also be released under the terms of the GPL, the terms
  36.  * and conditions of this License will apply in addition to those of the
  37.  * GPL with the exception of any terms or conditions of this License that
  38.  * conflict with, or are expressly prohibited by, the GPL.
  39.  *
  40.  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
  41.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  42.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  43.  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
  44.  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  45.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  46.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  48.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  49.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  50.  * SUCH DAMAGE.
  51.  */
  52. #define SYM_GLUE_C
  53. #include <linux/module.h>
  54. #include "sym_glue.h"
  55. #define NAME53C "sym53c"
  56. #define NAME53C8XX "sym53c8xx"
  57. /*
  58.  *  Simple Wrapper to kernel PCI bus interface.
  59.  */
  60. typedef struct pci_dev *pcidev_t;
  61. #define PCIDEV_NULL (0)
  62. #define PciBusNumber(d) (d)->bus->number
  63. #define PciDeviceFn(d) (d)->devfn
  64. #define PciVendorId(d) (d)->vendor
  65. #define PciDeviceId(d) (d)->device
  66. #define PciIrqLine(d) (d)->irq
  67. static u_long __init
  68. pci_get_base_cookie(struct pci_dev *pdev, int index)
  69. {
  70. u_long base;
  71. #if LINUX_VERSION_CODE > LinuxVersionCode(2,3,12)
  72. base = pdev->resource[index].start;
  73. #else
  74. base = pdev->base_address[index];
  75. #if BITS_PER_LONG > 32
  76. if ((base & 0x7) == 0x4)
  77. base |= (((u_long)pdev->base_address[++index]) << 32);
  78. #endif
  79. #endif
  80. return (base & ~0x7ul);
  81. }
  82. static int __init
  83. pci_get_base_address(struct pci_dev *pdev, int index, u_long *base)
  84. {
  85. u32 tmp;
  86. #define PCI_BAR_OFFSET(index) (PCI_BASE_ADDRESS_0 + (index<<2))
  87. pci_read_config_dword(pdev, PCI_BAR_OFFSET(index), &tmp);
  88. *base = tmp;
  89. ++index;
  90. if ((tmp & 0x7) == 0x4) {
  91. #if BITS_PER_LONG > 32
  92. pci_read_config_dword(pdev, PCI_BAR_OFFSET(index), &tmp);
  93. *base |= (((u_long)tmp) << 32);
  94. #endif
  95. ++index;
  96. }
  97. return index;
  98. #undef PCI_BAR_OFFSET
  99. }
  100. #if LINUX_VERSION_CODE  < LinuxVersionCode(2,4,0)
  101. #define pci_enable_device(pdev) (0)
  102. #endif
  103. #if LINUX_VERSION_CODE  < LinuxVersionCode(2,4,4)
  104. #define scsi_set_pci_device(inst, pdev) do { ;} while (0)
  105. #endif
  106. /*
  107.  *  Insert a delay in micro-seconds and milli-seconds.
  108.  */
  109. void sym_udelay(int us) { udelay(us); }
  110. void sym_mdelay(int ms) { mdelay(ms); }
  111. /*
  112.  *  SMP threading.
  113.  *
  114.  *  The whole SCSI sub-system under Linux is basically single-threaded.
  115.  *  Everything, including low-level driver interrupt routine, happens 
  116.  *  with the `io_request_lock' held.
  117.  *  The sym53c8xx-1.x drivers series ran their interrupt code using a 
  118.  *  spin mutex per controller. This added complexity without improving 
  119.  *  scalability significantly. the sym-2 driver still use a spinlock 
  120.  *  per controller for safety, but basically runs with the damned 
  121.  *  io_request_lock held.
  122.  */
  123. spinlock_t sym53c8xx_lock = SPIN_LOCK_UNLOCKED;
  124. #define SYM_LOCK_DRIVER(flags)    spin_lock_irqsave(&sym53c8xx_lock, flags)
  125. #define SYM_UNLOCK_DRIVER(flags)  spin_unlock_irqrestore(&sym53c8xx_lock,flags)
  126. #define SYM_INIT_LOCK_HCB(np)     spin_lock_init(&np->s.smp_lock);
  127. #define SYM_LOCK_HCB(np, flags)   spin_lock_irqsave(&np->s.smp_lock, flags)
  128. #define SYM_UNLOCK_HCB(np, flags) spin_unlock_irqrestore(&np->s.smp_lock, flags)
  129. #define SYM_LOCK_SCSI(np, flags) 
  130. spin_lock_irqsave(&io_request_lock, flags)
  131. #define SYM_UNLOCK_SCSI(np, flags) 
  132. spin_unlock_irqrestore(&io_request_lock, flags)
  133. /* Ugly, but will make things easier if this locking will ever disappear */
  134. #define SYM_LOCK_SCSI_NOSAVE(np) spin_lock_irq(&io_request_lock)
  135. #define SYM_UNLOCK_SCSI_NORESTORE(np) spin_unlock_irq(&io_request_lock)
  136. /*
  137.  *  These simple macros limit expression involving 
  138.  *  kernel time values (jiffies) to some that have 
  139.  *  chance not to be too much incorrect. :-)
  140.  */
  141. #define ktime_get(o) (jiffies + (u_long) o)
  142. #define ktime_exp(b) ((long)(jiffies) - (long)(b) >= 0)
  143. #define ktime_dif(a, b) ((long)(a) - (long)(b))
  144. #define ktime_add(a, o) ((a) + (u_long)(o))
  145. #define ktime_sub(a, o) ((a) - (u_long)(o))
  146. /*
  147.  *  Wrappers to the generic memory allocator.
  148.  */
  149. void *sym_calloc(int size, char *name)
  150. {
  151. u_long flags;
  152. void *m;
  153. SYM_LOCK_DRIVER(flags);
  154. m = sym_calloc_unlocked(size, name);
  155. SYM_UNLOCK_DRIVER(flags);
  156. return m;
  157. }
  158. void sym_mfree(void *m, int size, char *name)
  159. {
  160. u_long flags;
  161. SYM_LOCK_DRIVER(flags);
  162. sym_mfree_unlocked(m, size, name);
  163. SYM_UNLOCK_DRIVER(flags);
  164. }
  165. #ifdef SYM_LINUX_DYNAMIC_DMA_MAPPING
  166. void *__sym_calloc_dma(m_pool_ident_t dev_dmat, int size, char *name)
  167. {
  168. u_long flags;
  169. void *m;
  170. SYM_LOCK_DRIVER(flags);
  171. m = __sym_calloc_dma_unlocked(dev_dmat, size, name);
  172. SYM_UNLOCK_DRIVER(flags);
  173. return m;
  174. }
  175. void __sym_mfree_dma(m_pool_ident_t dev_dmat, void *m, int size, char *name)
  176. {
  177. u_long flags;
  178. SYM_LOCK_DRIVER(flags);
  179. __sym_mfree_dma_unlocked(dev_dmat, m, size, name);
  180. SYM_UNLOCK_DRIVER(flags);
  181. }
  182. m_addr_t __vtobus(m_pool_ident_t dev_dmat, void *m)
  183. {
  184. u_long flags;
  185. m_addr_t b;
  186. SYM_LOCK_DRIVER(flags);
  187. b = __vtobus_unlocked(dev_dmat, m);
  188. SYM_UNLOCK_DRIVER(flags);
  189. return b;
  190. }
  191. #endif /* SYM_LINUX_DYNAMIC_DMA_MAPPING */
  192. /*
  193.  *  Map/unmap a PCI memory window.
  194.  */
  195. #ifndef SYM_OPT_NO_BUS_MEMORY_MAPPING
  196. static u_long __init pci_map_mem(u_long base, u_long size)
  197. {
  198. u_long page_base = ((u_long) base) & PAGE_MASK;
  199. u_long page_offs = ((u_long) base) - page_base;
  200. u_long page_remapped = (u_long) ioremap(page_base, page_offs+size);
  201. return page_remapped? (page_remapped + page_offs) : 0UL;
  202. }
  203. static void __init pci_unmap_mem(u_long vaddr, u_long size)
  204. {
  205. if (vaddr)
  206. iounmap((void *) (vaddr & PAGE_MASK));
  207. }
  208. #endif
  209. /*
  210.  *  Used to retrieve the host structure when the 
  211.  *  driver is called from the proc FS.
  212.  */
  213. static struct Scsi_Host *first_host = NULL;
  214. /*
  215.  *  /proc directory entry and proc_info.
  216.  */
  217. #if LINUX_VERSION_CODE < LinuxVersionCode(2,3,27)
  218. static struct proc_dir_entry proc_scsi_sym53c8xx = {
  219.     PROC_SCSI_SYM53C8XX, 9, NAME53C8XX,
  220.     S_IFDIR | S_IRUGO | S_IXUGO, 2
  221. };
  222. #endif
  223. /*
  224.  *  Transfer direction
  225.  *
  226.  *  Until some linux kernel version near 2.3.40, low-level scsi 
  227.  *  drivers were not told about data transfer direction.
  228.  */
  229. #if LINUX_VERSION_CODE > LinuxVersionCode(2, 3, 40)
  230. #define scsi_data_direction(cmd) (cmd->sc_data_direction)
  231. #else
  232. static __inline__ int scsi_data_direction(Scsi_Cmnd *cmd)
  233. {
  234. int direction;
  235. switch((int) cmd->cmnd[0]) {
  236. case 0x08:  /* READ(6) 08 */
  237. case 0x28:  /* READ(10) 28 */
  238. case 0xA8:  /* READ(12) A8 */
  239. direction = SCSI_DATA_READ;
  240. break;
  241. case 0x0A:  /* WRITE(6) 0A */
  242. case 0x2A:  /* WRITE(10) 2A */
  243. case 0xAA:  /* WRITE(12) AA */
  244. direction = SCSI_DATA_WRITE;
  245. break;
  246. default:
  247. direction = SCSI_DATA_UNKNOWN;
  248. break;
  249. }
  250. return direction;
  251. }
  252. #endif
  253. /*
  254.  *  Driver host data structure.
  255.  */
  256. struct host_data {
  257.      hcb_p ncb;
  258. };
  259. /*
  260.  * Some type that fit DMA addresses as seen from BUS.
  261.  */
  262. #ifndef SYM_LINUX_DYNAMIC_DMA_MAPPING
  263. typedef u_long bus_addr_t;
  264. #else
  265. #if SYM_CONF_DMA_ADDRESSING_MODE > 0
  266. typedef dma64_addr_t bus_addr_t;
  267. #else
  268. typedef dma_addr_t bus_addr_t;
  269. #endif
  270. #endif
  271. /*
  272.  *  Used by the eh thread to wait for command completion.
  273.  *  It is allocated on the eh thread stack.
  274.  */
  275. struct sym_eh_wait {
  276. struct semaphore sem;
  277. struct timer_list timer;
  278. void (*old_done)(Scsi_Cmnd *);
  279. int to_do;
  280. int timed_out;
  281. };
  282. /*
  283.  *  Driver private area in the SCSI command structure.
  284.  */
  285. struct sym_ucmd { /* Override the SCSI pointer structure */
  286. SYM_QUEHEAD link_cmdq; /* Must stay at offset ZERO */
  287. #ifdef SYM_LINUX_DYNAMIC_DMA_MAPPING
  288. bus_addr_t data_mapping;
  289. u_char data_mapped;
  290. #endif
  291. struct sym_eh_wait *eh_wait;
  292. };
  293. typedef struct sym_ucmd *ucmd_p;
  294. #define SYM_UCMD_PTR(cmd)  ((ucmd_p)(&(cmd)->SCp))
  295. #define SYM_SCMD_PTR(ucmd) sym_que_entry(ucmd, Scsi_Cmnd, SCp)
  296. #define SYM_SOFTC_PTR(cmd) (((struct host_data *)cmd->host->hostdata)->ncb)
  297. /*
  298.  *  Deal with DMA mapping/unmapping.
  299.  */
  300. #ifndef SYM_LINUX_DYNAMIC_DMA_MAPPING
  301. /* Linux versions prior to pci bus iommu kernel interface */
  302. #define __unmap_scsi_data(pdev, cmd) do {; } while (0)
  303. #define __map_scsi_single_data(pdev, cmd) (__vtobus(pdev,(cmd)->request_buffer))
  304. #define __map_scsi_sg_data(pdev, cmd) ((cmd)->use_sg)
  305. #define __sync_scsi_data(pdev, cmd) do {; } while (0)
  306. #define bus_sg_dma_address(sc) vtobus((sc)->address)
  307. #define bus_sg_dma_len(sc) ((sc)->length)
  308. #else /* Linux version with pci bus iommu kernel interface */
  309. #define bus_unmap_sg(pdev, sgptr, sgcnt, dir)
  310. pci_unmap_sg(pdev, sgptr, sgcnt, dir)
  311. #define bus_unmap_single(pdev, mapping, bufptr, dir)
  312. pci_unmap_single(pdev, mapping, bufptr, dir)
  313. #define bus_map_single(pdev, bufptr, bufsiz, dir)
  314. pci_map_single(pdev, bufptr, bufsiz, dir)
  315.  
  316. #define bus_map_sg(pdev, sgptr, sgcnt, dir)
  317. pci_map_sg(pdev, sgptr, sgcnt, dir)
  318. #define bus_dma_sync_sg(pdev, sgptr, sgcnt, dir)
  319. pci_dma_sync_sg(pdev, sgptr, sgcnt, dir)
  320. #define bus_dma_sync_single(pdev, mapping, bufsiz, dir)
  321. pci_dma_sync_single(pdev, mapping, bufsiz, dir)
  322. #define bus_sg_dma_address(sc) sg_dma_address(sc)
  323. #define bus_sg_dma_len(sc) sg_dma_len(sc)
  324. static void __unmap_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd)
  325. {
  326. int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
  327. switch(SYM_UCMD_PTR(cmd)->data_mapped) {
  328. case 2:
  329. bus_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
  330. break;
  331. case 1:
  332. bus_unmap_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
  333.  cmd->request_bufflen, dma_dir);
  334. break;
  335. }
  336. SYM_UCMD_PTR(cmd)->data_mapped = 0;
  337. }
  338. static bus_addr_t __map_scsi_single_data(pcidev_t pdev, Scsi_Cmnd *cmd)
  339. {
  340. bus_addr_t mapping;
  341. int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
  342. mapping = bus_map_single(pdev, cmd->request_buffer,
  343.  cmd->request_bufflen, dma_dir);
  344. if (mapping) {
  345. SYM_UCMD_PTR(cmd)->data_mapped  = 1;
  346. SYM_UCMD_PTR(cmd)->data_mapping = mapping;
  347. }
  348. return mapping;
  349. }
  350. static int __map_scsi_sg_data(pcidev_t pdev, Scsi_Cmnd *cmd)
  351. {
  352. int use_sg;
  353. int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
  354. use_sg = bus_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
  355. if (use_sg > 0) {
  356. SYM_UCMD_PTR(cmd)->data_mapped  = 2;
  357. SYM_UCMD_PTR(cmd)->data_mapping = use_sg;
  358. }
  359. return use_sg;
  360. }
  361. static void __sync_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd)
  362. {
  363. int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
  364. switch(SYM_UCMD_PTR(cmd)->data_mapped) {
  365. case 2:
  366. bus_dma_sync_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
  367. break;
  368. case 1:
  369. bus_dma_sync_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
  370.     cmd->request_bufflen, dma_dir);
  371. break;
  372. }
  373. }
  374. #endif /* SYM_LINUX_DYNAMIC_DMA_MAPPING */
  375. #define unmap_scsi_data(np, cmd)
  376. __unmap_scsi_data(np->s.device, cmd)
  377. #define map_scsi_single_data(np, cmd)
  378. __map_scsi_single_data(np->s.device, cmd)
  379. #define map_scsi_sg_data(np, cmd)
  380. __map_scsi_sg_data(np->s.device, cmd)
  381. #define sync_scsi_data(np, cmd)
  382. __sync_scsi_data(np->s.device, cmd)
  383. /*
  384.  *  Complete a pending CAM CCB.
  385.  */
  386. void sym_xpt_done(hcb_p np, Scsi_Cmnd *ccb)
  387. {
  388. sym_remque(&SYM_UCMD_PTR(ccb)->link_cmdq);
  389. unmap_scsi_data(np, ccb);
  390. ccb->scsi_done(ccb);
  391. }
  392. void sym_xpt_done2(hcb_p np, Scsi_Cmnd *ccb, int cam_status)
  393. {
  394. sym_set_cam_status(ccb, cam_status);
  395. sym_xpt_done(np, ccb);
  396. }
  397. /*
  398.  *  Print something that identifies the IO.
  399.  */
  400. void sym_print_addr (ccb_p cp)
  401. {
  402. Scsi_Cmnd *cmd = cp->cam_ccb;
  403. if (cmd)
  404. printf("%s:%d:%d:", sym_name(SYM_SOFTC_PTR(cmd)),
  405.        cmd->target,cmd->lun);
  406. }
  407. /*
  408.  *  Tell the SCSI layer about a BUS RESET.
  409.  */
  410. void sym_xpt_async_bus_reset(hcb_p np)
  411. {
  412. printf_notice("%s: SCSI BUS has been reset.n", sym_name(np));
  413. np->s.settle_time = ktime_get(sym_driver_setup.settle_delay * HZ);
  414. np->s.settle_time_valid = 1;
  415. if (sym_verbose >= 2)
  416. printf_info("%s: command processing suspended for %d secondsn",
  417.             sym_name(np), sym_driver_setup.settle_delay);
  418. }
  419. /*
  420.  *  Tell the SCSI layer about a BUS DEVICE RESET message sent.
  421.  */
  422. void sym_xpt_async_sent_bdr(hcb_p np, int target)
  423. {
  424. printf_notice("%s: TARGET %d has been reset.n", sym_name(np), target);
  425. }
  426. /*
  427.  *  Tell the SCSI layer about the new transfer parameters.
  428.  */
  429. void sym_xpt_async_nego_wide(hcb_p np, int target)
  430. {
  431. if (sym_verbose < 3)
  432. return;
  433. sym_announce_transfer_rate(np, target);
  434. }
  435. /*
  436.  *  Choose the more appropriate CAM status if 
  437.  *  the IO encountered an extended error.
  438.  */
  439. static int sym_xerr_cam_status(int cam_status, int x_status)
  440. {
  441. if (x_status) {
  442. if (x_status & XE_PARITY_ERR)
  443. cam_status = DID_PARITY;
  444. else if (x_status &(XE_EXTRA_DATA|XE_SODL_UNRUN|XE_SWIDE_OVRUN))
  445. cam_status = DID_ERROR;
  446. else if (x_status & XE_BAD_PHASE)
  447. cam_status = DID_ERROR;
  448. else
  449. cam_status = DID_ERROR;
  450. }
  451. return cam_status;
  452. }
  453. /*
  454.  *  Build CAM result for a failed or auto-sensed IO.
  455.  */
  456. void sym_set_cam_result_error(hcb_p np, ccb_p cp, int resid)
  457. {
  458. Scsi_Cmnd *csio = cp->cam_ccb;
  459. u_int cam_status, scsi_status, drv_status;
  460. drv_status  = 0;
  461. cam_status  = DID_OK;
  462. scsi_status = cp->ssss_status;
  463. if (cp->host_flags & HF_SENSE) {
  464. scsi_status = cp->sv_scsi_status;
  465. resid = cp->sv_resid;
  466. if (sym_verbose && cp->sv_xerr_status)
  467. sym_print_xerr(cp, cp->sv_xerr_status);
  468. if (cp->host_status == HS_COMPLETE &&
  469.     cp->ssss_status == S_GOOD &&
  470.     cp->xerr_status == 0) {
  471. cam_status = sym_xerr_cam_status(DID_OK,
  472.  cp->sv_xerr_status);
  473. drv_status = DRIVER_SENSE;
  474. /*
  475.  *  Bounce back the sense data to user.
  476.  */
  477. bzero(&csio->sense_buffer, sizeof(csio->sense_buffer));
  478. bcopy(cp->sns_bbuf, csio->sense_buffer,
  479.       MIN(sizeof(csio->sense_buffer),SYM_SNS_BBUF_LEN));
  480. #if 0
  481. /*
  482.  *  If the device reports a UNIT ATTENTION condition 
  483.  *  due to a RESET condition, we should consider all 
  484.  *  disconnect CCBs for this unit as aborted.
  485.  */
  486. if (1) {
  487. u_char *p;
  488. p  = (u_char *) csio->sense_data;
  489. if (p[0]==0x70 && p[2]==0x6 && p[12]==0x29)
  490. sym_clear_tasks(np, DID_ABORT,
  491. cp->target,cp->lun, -1);
  492. }
  493. #endif
  494. }
  495. else
  496. cam_status = DID_ERROR;
  497. }
  498. else if (cp->host_status == HS_COMPLETE)  /* Bad SCSI status */
  499. cam_status = DID_OK;
  500. else if (cp->host_status == HS_SEL_TIMEOUT) /* Selection timeout */
  501. cam_status = DID_NO_CONNECT;
  502. else if (cp->host_status == HS_UNEXPECTED) /* Unexpected BUS FREE*/
  503. cam_status = DID_ERROR;
  504. else { /* Extended error */
  505. if (sym_verbose) {
  506. PRINT_ADDR(cp);
  507. printf ("COMMAND FAILED (%x %x %x).n",
  508. cp->host_status, cp->ssss_status,
  509. cp->xerr_status);
  510. }
  511. /*
  512.  *  Set the most appropriate value for CAM status.
  513.  */
  514. cam_status = sym_xerr_cam_status(DID_ERROR, cp->xerr_status);
  515. }
  516. #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,99)
  517. csio->resid = resid;
  518. #endif
  519. csio->result = (drv_status << 24) + (cam_status << 16) + scsi_status;
  520. }
  521. /*
  522.  *  Called on successfull INQUIRY response.
  523.  */
  524. void sym_sniff_inquiry(hcb_p np, Scsi_Cmnd *cmd, int resid)
  525. {
  526. int retv;
  527. if (!cmd || cmd->use_sg)
  528. return;
  529. sync_scsi_data(np, cmd);
  530. retv = __sym_sniff_inquiry(np, cmd->target, cmd->lun,
  531.    (u_char *) cmd->request_buffer,
  532.    cmd->request_bufflen - resid);
  533. if (retv < 0)
  534. return;
  535. else if (retv)
  536. sym_update_trans_settings(np, &np->target[cmd->target]);
  537. }
  538. /*
  539.  *  Build the scatter/gather array for an I/O.
  540.  */
  541. static int sym_scatter_no_sglist(hcb_p np, ccb_p cp, Scsi_Cmnd *cmd)
  542. {
  543. struct sym_tblmove *data = &cp->phys.data[SYM_CONF_MAX_SG-1];
  544. int segment;
  545. cp->data_len = cmd->request_bufflen;
  546. if (cmd->request_bufflen) {
  547. bus_addr_t baddr = map_scsi_single_data(np, cmd);
  548. if (baddr) {
  549. sym_build_sge(np, data, baddr, cmd->request_bufflen);
  550. segment = 1;
  551. }
  552. else
  553. segment = -2;
  554. }
  555. else
  556. segment = 0;
  557. return segment;
  558. }
  559. static int sym_scatter(hcb_p np, ccb_p cp, Scsi_Cmnd *cmd)
  560. {
  561. int segment;
  562. int use_sg = (int) cmd->use_sg;
  563. cp->data_len = 0;
  564. if (!use_sg)
  565. segment = sym_scatter_no_sglist(np, cp, cmd);
  566. else if (use_sg > SYM_CONF_MAX_SG)
  567. segment = -1;
  568. else if ((use_sg = map_scsi_sg_data(np, cmd)) > 0) {
  569. struct scatterlist *scatter = (struct scatterlist *)cmd->buffer;
  570. struct sym_tblmove *data;
  571. data = &cp->phys.data[SYM_CONF_MAX_SG - use_sg];
  572. for (segment = 0; segment < use_sg; segment++) {
  573. bus_addr_t baddr = bus_sg_dma_address(&scatter[segment]);
  574. unsigned int len = bus_sg_dma_len(&scatter[segment]);
  575. sym_build_sge(np, &data[segment], baddr, len);
  576. cp->data_len += len;
  577. }
  578. }
  579. else
  580. segment = -2;
  581. return segment;
  582. }
  583. /*
  584.  *  Queue a SCSI command.
  585.  */
  586. static int sym_queue_command(hcb_p np, Scsi_Cmnd *ccb)
  587. {
  588. /* Scsi_Device        *device    = ccb->device; */
  589. tcb_p tp;
  590. lcb_p lp;
  591. ccb_p cp;
  592. int order;
  593. /*
  594.  *  Minimal checkings, so that we will not 
  595.  *  go outside our tables.
  596.  */
  597. if (ccb->target == np->myaddr ||
  598.     ccb->target >= SYM_CONF_MAX_TARGET ||
  599.     ccb->lun    >= SYM_CONF_MAX_LUN) {
  600. sym_xpt_done2(np, ccb, CAM_DEV_NOT_THERE);
  601. return 0;
  602.         }
  603. /*
  604.  *  Retreive the target descriptor.
  605.  */
  606. tp = &np->target[ccb->target];
  607. /*
  608.  *  Complete the 1st INQUIRY command with error 
  609.  *  condition if the device is flagged NOSCAN 
  610.  *  at BOOT in the NVRAM. This may speed up 
  611.  *  the boot and maintain coherency with BIOS 
  612.  *  device numbering. Clearing the flag allows 
  613.  *  user to rescan skipped devices later.
  614.  *  We also return error for devices not flagged 
  615.  *  for SCAN LUNS in the NVRAM since some mono-lun 
  616.  *  devices behave badly when asked for some non 
  617.  *  zero LUN. Btw, this is an absolute hack.:-)
  618.  */
  619. if (ccb->cmnd[0] == 0x12 || ccb->cmnd[0] == 0x0) {
  620. if ((tp->usrflags & SYM_SCAN_BOOT_DISABLED) ||
  621.     ((tp->usrflags & SYM_SCAN_LUNS_DISABLED) && 
  622.      ccb->lun != 0)) {
  623. tp->usrflags &= ~SYM_SCAN_BOOT_DISABLED;
  624. sym_xpt_done2(np, ccb, CAM_DEV_NOT_THERE);
  625. return 0;
  626. }
  627. }
  628. /*
  629.  *  Select tagged/untagged.
  630.  */
  631. lp = sym_lp(np, tp, ccb->lun);
  632. order = (lp && lp->s.reqtags) ? M_SIMPLE_TAG : 0;
  633. /*
  634.  *  Queue the SCSI IO.
  635.  */
  636. cp = sym_get_ccb(np, ccb->target, ccb->lun, order);
  637. if (!cp)
  638. return 1; /* Means resource shortage */
  639. (void) sym_queue_scsiio(np, ccb, cp);
  640. return 0;
  641. }
  642. /*
  643.  *  Setup buffers and pointers that address the CDB.
  644.  */
  645. static int __inline sym_setup_cdb(hcb_p np, Scsi_Cmnd *ccb, ccb_p cp)
  646. {
  647. u32 cmd_ba;
  648. int cmd_len;
  649. /*
  650.  *  CDB is 16 bytes max.
  651.  */
  652. if (ccb->cmd_len > sizeof(cp->cdb_buf)) {
  653. sym_set_cam_status(cp->cam_ccb, CAM_REQ_INVALID);
  654. return -1;
  655. }
  656. bcopy(ccb->cmnd, cp->cdb_buf, ccb->cmd_len);
  657. cmd_ba  = CCB_BA (cp, cdb_buf[0]);
  658. cmd_len = ccb->cmd_len;
  659. cp->phys.cmd.addr = cpu_to_scr(cmd_ba);
  660. cp->phys.cmd.size = cpu_to_scr(cmd_len);
  661. return 0;
  662. }
  663. /*
  664.  *  Setup pointers that address the data and start the I/O.
  665.  */
  666. int sym_setup_data_and_start(hcb_p np, Scsi_Cmnd *csio, ccb_p cp)
  667. {
  668. int dir;
  669. tcb_p tp = &np->target[cp->target];
  670. lcb_p lp = sym_lp(np, tp, cp->lun);
  671. /*
  672.  *  Build the CDB.
  673.  */
  674. if (sym_setup_cdb(np, csio, cp))
  675. goto out_abort;
  676. /*
  677.  *  No direction means no data.
  678.  */
  679. dir = scsi_data_direction(csio);
  680. if (dir != SCSI_DATA_NONE) {
  681. cp->segments = sym_scatter (np, cp, csio);
  682. if (cp->segments < 0) {
  683. if (cp->segments == -2)
  684. sym_set_cam_status(csio, CAM_RESRC_UNAVAIL);
  685. else
  686. sym_set_cam_status(csio, CAM_REQ_TOO_BIG);
  687. goto out_abort;
  688. }
  689. }
  690. else {
  691. cp->data_len = 0;
  692. cp->segments = 0;
  693. }
  694. /*
  695.  *  Set data pointers.
  696.  */
  697. sym_setup_data_pointers(np, cp, dir);
  698. /*
  699.  *  When `#ifed 1', the code below makes the driver 
  700.  *  panic on the first attempt to write to a SCSI device.
  701.  *  It is the first test we want to do after a driver 
  702.  *  change that does not seem obviously safe. :)
  703.  */
  704. #if 0
  705. switch (cp->cdb_buf[0]) {
  706. case 0x0A: case 0x2A: case 0xAA:
  707. panic("XXXXXXXXXXXXX WRITE NOT YET ALLOWED XXXXXXXXXXXXXXn");
  708. MDELAY(10000);
  709. break;
  710. default:
  711. break;
  712. }
  713. #endif
  714. /*
  715.  * activate this job.
  716.  */
  717. if (lp)
  718. sym_start_next_ccbs(np, lp, 2);
  719. else
  720. sym_put_start_queue(np, cp);
  721. return 0;
  722. out_abort:
  723. sym_free_ccb(np, cp);
  724. sym_xpt_done(np, csio);
  725. return 0;
  726. }
  727. /*
  728.  *  timer daemon.
  729.  *
  730.  *  Misused to keep the driver running when
  731.  *  interrupts are not configured correctly.
  732.  */
  733. static void sym_timer (hcb_p np)
  734. {
  735. u_long thistime = ktime_get(0);
  736. #if LINUX_VERSION_CODE < LinuxVersionCode(2, 4, 0)
  737. /*
  738.  *  If release process in progress, let's go
  739.  *  Set the release stage from 1 to 2 to synchronize
  740.  *  with the release process.
  741.  */
  742. if (np->s.release_stage) {
  743. if (np->s.release_stage == 1)
  744. np->s.release_stage = 2;
  745. return;
  746. }
  747. #endif
  748. /*
  749.  *  Restart the timer.
  750.  */
  751. #ifdef SYM_CONF_PCIQ_BROKEN_INTR
  752. np->s.timer.expires = ktime_get((HZ+99)/100);
  753. #else
  754. np->s.timer.expires = ktime_get(SYM_CONF_TIMER_INTERVAL);
  755. #endif
  756. add_timer(&np->s.timer);
  757. /*
  758.  *  If we are resetting the ncr, wait for settle_time before 
  759.  *  clearing it. Then command processing will be resumed.
  760.  */
  761. if (np->s.settle_time_valid) {
  762. if (ktime_dif(np->s.settle_time, thistime) <= 0){
  763. if (sym_verbose >= 2 )
  764. printk("%s: command processing resumedn",
  765.        sym_name(np));
  766. np->s.settle_time_valid = 0;
  767. }
  768. return;
  769. }
  770. /*
  771.  * Nothing to do for now, but that may come.
  772.  */
  773. if (np->s.lasttime + 4*HZ < thistime) {
  774. np->s.lasttime = thistime;
  775. }
  776. #ifdef SYM_CONF_PCIQ_MAY_MISS_COMPLETIONS
  777. /*
  778.  *  Some way-broken PCI bridges may lead to 
  779.  *  completions being lost when the clearing 
  780.  *  of the INTFLY flag by the CPU occurs 
  781.  *  concurrently with the chip raising this flag.
  782.  *  If this ever happen, lost completions will 
  783.  * be reaped here.
  784.  */
  785. sym_wakeup_done(np);
  786. #endif
  787. #ifdef SYM_CONF_PCIQ_BROKEN_INTR
  788. if (INB(nc_istat) & (INTF|SIP|DIP)) {
  789. /*
  790. ** Process pending interrupts.
  791. */
  792. if (DEBUG_FLAGS & DEBUG_TINY) printk ("{");
  793. sym_interrupt(np);
  794. if (DEBUG_FLAGS & DEBUG_TINY) printk ("}");
  795. }
  796. #endif /* SYM_CONF_PCIQ_BROKEN_INTR */
  797. }
  798. /*
  799.  *  PCI BUS error handler.
  800.  */
  801. void sym_log_bus_error(hcb_p np)
  802. {
  803. u_short pci_sts;
  804. pci_read_config_word(np->s.device, PCI_STATUS, &pci_sts);
  805. if (pci_sts & 0xf900) {
  806. pci_write_config_word(np->s.device, PCI_STATUS,
  807.                          pci_sts);
  808. printf("%s: PCI STATUS = 0x%04xn",
  809. sym_name(np), pci_sts & 0xf900);
  810. }
  811. }
  812. /*
  813.  *  Requeue awaiting commands.
  814.  */
  815. static void sym_requeue_awaiting_cmds(hcb_p np)
  816. {
  817. Scsi_Cmnd *cmd;
  818. ucmd_p ucp = SYM_UCMD_PTR(cmd);
  819. SYM_QUEHEAD tmp_cmdq;
  820. int sts;
  821. sym_que_move(&np->s.wait_cmdq, &tmp_cmdq);
  822. while ((ucp = (ucmd_p) sym_remque_head(&tmp_cmdq)) != 0) {
  823. sym_insque_tail(&ucp->link_cmdq, &np->s.busy_cmdq);
  824. cmd = SYM_SCMD_PTR(ucp);
  825. sts = sym_queue_command(np, cmd);
  826. if (sts) {
  827. sym_remque(&ucp->link_cmdq);
  828. sym_insque_head(&ucp->link_cmdq, &np->s.wait_cmdq);
  829. }
  830. }
  831. }
  832. /*
  833.  *  Linux entry point of the queuecommand() function
  834.  */
  835. int sym53c8xx_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
  836. {
  837. hcb_p  np  = SYM_SOFTC_PTR(cmd);
  838. ucmd_p ucp = SYM_UCMD_PTR(cmd);
  839. u_long flags;
  840. int sts = 0;
  841. cmd->scsi_done     = done;
  842. cmd->host_scribble = NULL;
  843. memset(ucp, 0, sizeof(*ucp));
  844. SYM_LOCK_HCB(np, flags);
  845. /*
  846.  *  Shorten our settle_time if needed for 
  847.  *  this command not to time out.
  848.  */
  849. if (np->s.settle_time_valid && cmd->timeout_per_command) {
  850. u_long tlimit = ktime_get(cmd->timeout_per_command);
  851. tlimit = ktime_sub(tlimit, SYM_CONF_TIMER_INTERVAL*2);
  852. if (ktime_dif(np->s.settle_time, tlimit) > 0) {
  853. np->s.settle_time = tlimit;
  854. }
  855. }
  856. if (np->s.settle_time_valid || !sym_que_empty(&np->s.wait_cmdq)) {
  857. sym_insque_tail(&ucp->link_cmdq, &np->s.wait_cmdq);
  858. goto out;
  859. }
  860. sym_insque_tail(&ucp->link_cmdq, &np->s.busy_cmdq);
  861. sts = sym_queue_command(np, cmd);
  862. if (sts) {
  863. sym_remque(&ucp->link_cmdq);
  864. sym_insque_tail(&ucp->link_cmdq, &np->s.wait_cmdq);
  865. }
  866. out:
  867. SYM_UNLOCK_HCB(np, flags);
  868. return 0;
  869. }
  870. /*
  871.  *  Linux entry point of the interrupt handler.
  872.  */
  873. static void sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs)
  874. {
  875. unsigned long flags;
  876. unsigned long flags1;
  877. hcb_p np = (hcb_p) dev_id;
  878. if (DEBUG_FLAGS & DEBUG_TINY) printf_debug ("[");
  879. SYM_LOCK_SCSI(np, flags1);
  880. SYM_LOCK_HCB(np, flags);
  881. sym_interrupt(np);
  882. if (!sym_que_empty(&np->s.wait_cmdq) && !np->s.settle_time_valid)
  883. sym_requeue_awaiting_cmds(np);
  884. SYM_UNLOCK_HCB(np, flags);
  885. SYM_UNLOCK_SCSI(np, flags1);
  886. if (DEBUG_FLAGS & DEBUG_TINY) printf_debug ("]n");
  887. }
  888. /*
  889.  *  Linux entry point of the timer handler
  890.  */
  891. static void sym53c8xx_timer(unsigned long npref)
  892. {
  893. hcb_p np = (hcb_p) npref;
  894. unsigned long flags;
  895. unsigned long flags1;
  896. SYM_LOCK_SCSI(np, flags1);
  897. SYM_LOCK_HCB(np, flags);
  898. sym_timer(np);
  899. if (!sym_que_empty(&np->s.wait_cmdq) && !np->s.settle_time_valid)
  900. sym_requeue_awaiting_cmds(np);
  901. SYM_UNLOCK_HCB(np, flags);
  902. SYM_UNLOCK_SCSI(np, flags1);
  903. }
  904. /*
  905.  *  What the eh thread wants us to perform.
  906.  */
  907. #define SYM_EH_ABORT 0
  908. #define SYM_EH_DEVICE_RESET 1
  909. #define SYM_EH_BUS_RESET 2
  910. #define SYM_EH_HOST_RESET 3
  911. /*
  912.  *  What we will do regarding the involved SCSI command.
  913.  */
  914. #define SYM_EH_DO_IGNORE 0
  915. #define SYM_EH_DO_COMPLETE 1
  916. #define SYM_EH_DO_WAIT 2
  917. /*
  918.  *  Our general completion handler.
  919.  */
  920. static void __sym_eh_done(Scsi_Cmnd *cmd, int timed_out)
  921. {
  922. struct sym_eh_wait *ep = SYM_UCMD_PTR(cmd)->eh_wait;
  923. if (!ep)
  924. return;
  925. /* Try to avoid a race here (not 100% safe) */
  926. if (!timed_out) {
  927. ep->timed_out = 0;
  928. if (ep->to_do == SYM_EH_DO_WAIT && !del_timer(&ep->timer))
  929. return;
  930. }
  931. /* Revert everything */
  932. SYM_UCMD_PTR(cmd)->eh_wait = 0;
  933. cmd->scsi_done = ep->old_done;
  934. /* Wake up the eh thread if it wants to sleep */
  935. if (ep->to_do == SYM_EH_DO_WAIT)
  936. up(&ep->sem);
  937. }
  938. /*
  939.  *  scsi_done() alias when error recovery is in progress. 
  940.  */
  941. static void sym_eh_done(Scsi_Cmnd *cmd) { __sym_eh_done(cmd, 0); }
  942. /*
  943.  *  Some timeout handler to avoid waiting too long.
  944.  */
  945. static void sym_eh_timeout(u_long p) { __sym_eh_done((Scsi_Cmnd *)p, 1); }
  946. /*
  947.  *  Generic method for our eh processing.
  948.  *  The 'op' argument tells what we have to do.
  949.  */
  950. static int sym_eh_handler(int op, char *opname, Scsi_Cmnd *cmd)
  951. {
  952. hcb_p np = SYM_SOFTC_PTR(cmd);
  953. unsigned long flags;
  954. SYM_QUEHEAD *qp;
  955. int to_do = SYM_EH_DO_IGNORE;
  956. int sts = -1;
  957. struct sym_eh_wait eh, *ep = &eh;
  958. char devname[20];
  959. sprintf(devname, "%s:%d:%d", sym_name(np), cmd->target, cmd->lun);
  960. printf_warning("%s: %s operation started.n", devname, opname);
  961. SYM_LOCK_HCB(np, flags);
  962. #if 0
  963. /* This one should be the result of some race, thus to ignore */
  964. if (cmd->serial_number != cmd->serial_number_at_timeout)
  965. goto prepare;
  966. #endif
  967. /* This one is not queued to the core driver -> to complete here */ 
  968. FOR_EACH_QUEUED_ELEMENT(&np->s.wait_cmdq, qp) {
  969. if (SYM_SCMD_PTR(qp) == cmd) {
  970. to_do = SYM_EH_DO_COMPLETE;
  971. goto prepare;
  972. }
  973. }
  974. /* This one is queued in some place -> to wait for completion */
  975. FOR_EACH_QUEUED_ELEMENT(&np->busy_ccbq, qp) {
  976. ccb_p cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
  977. if (cp->cam_ccb == cmd) {
  978. to_do = SYM_EH_DO_WAIT;
  979. goto prepare;
  980. }
  981. }
  982. prepare:
  983. /* Prepare stuff to either ignore, complete or wait for completion */
  984. switch(to_do) {
  985. default:
  986. case SYM_EH_DO_IGNORE:
  987. goto finish;
  988. break;
  989. case SYM_EH_DO_WAIT:
  990. #if LINUX_VERSION_CODE > LinuxVersionCode(2,3,0)
  991. init_MUTEX_LOCKED(&ep->sem);
  992. #else
  993. ep->sem = MUTEX_LOCKED;
  994. #endif
  995. /* fall through */
  996. case SYM_EH_DO_COMPLETE:
  997. ep->old_done = cmd->scsi_done;
  998. cmd->scsi_done = sym_eh_done;
  999. SYM_UCMD_PTR(cmd)->eh_wait = ep;
  1000. }
  1001. /* Try to proceed the operation we have been asked for */
  1002. sts = -1;
  1003. switch(op) {
  1004. case SYM_EH_ABORT:
  1005. sts = sym_abort_scsiio(np, cmd, 1);
  1006. break;
  1007. case SYM_EH_DEVICE_RESET:
  1008. sts = sym_reset_scsi_target(np, cmd->target);
  1009. break;
  1010. case SYM_EH_BUS_RESET:
  1011. sym_reset_scsi_bus(np, 1);
  1012. sts = 0;
  1013. break;
  1014. case SYM_EH_HOST_RESET:
  1015. sym_reset_scsi_bus(np, 0);
  1016. sym_start_up (np, 1);
  1017. sts = 0;
  1018. break;
  1019. default:
  1020. break;
  1021. }
  1022. /* On error, restore everything and cross fingers :) */
  1023. if (sts) {
  1024. SYM_UCMD_PTR(cmd)->eh_wait = 0;
  1025. cmd->scsi_done = ep->old_done;
  1026. to_do = SYM_EH_DO_IGNORE;
  1027. }
  1028. finish:
  1029. ep->to_do = to_do;
  1030. /* Complete the command with locks held as required by the driver */
  1031. if (to_do == SYM_EH_DO_COMPLETE)
  1032. sym_xpt_done2(np, cmd, CAM_REQ_ABORTED);
  1033. SYM_UNLOCK_HCB(np, flags);
  1034. /* Wait for completion with locks released, as required by kernel */
  1035. if (to_do == SYM_EH_DO_WAIT) {
  1036. init_timer(&ep->timer);
  1037. ep->timer.expires = jiffies + (5*HZ);
  1038. ep->timer.function = sym_eh_timeout;
  1039. ep->timer.data = (u_long)cmd;
  1040. ep->timed_out = 1; /* Be pessimistic for once :) */
  1041. add_timer(&ep->timer);
  1042. SYM_UNLOCK_SCSI_NORESTORE(np);
  1043. down(&ep->sem);
  1044. SYM_LOCK_SCSI_NOSAVE(np);
  1045. if (ep->timed_out)
  1046. sts = -2;
  1047. }
  1048. printf_warning("%s: %s operation %s.n", devname, opname,
  1049. sts==0?"complete":sts==-2?"timed-out":"failed");
  1050. return sts? SCSI_FAILED : SCSI_SUCCESS;
  1051. }
  1052. /*
  1053.  * Error handlers called from the eh thread (one thread per HBA).
  1054.  */
  1055. int sym53c8xx_eh_abort_handler(Scsi_Cmnd *cmd)
  1056. {
  1057. return sym_eh_handler(SYM_EH_ABORT, "ABORT", cmd);
  1058. }
  1059. int sym53c8xx_eh_device_reset_handler(Scsi_Cmnd *cmd)
  1060. {
  1061. return sym_eh_handler(SYM_EH_DEVICE_RESET, "DEVICE RESET", cmd);
  1062. }
  1063. int sym53c8xx_eh_bus_reset_handler(Scsi_Cmnd *cmd)
  1064. {
  1065. return sym_eh_handler(SYM_EH_BUS_RESET, "BUS RESET", cmd);
  1066. }
  1067. int sym53c8xx_eh_host_reset_handler(Scsi_Cmnd *cmd)
  1068. {
  1069. return sym_eh_handler(SYM_EH_HOST_RESET, "HOST RESET", cmd);
  1070. }
  1071. /*
  1072.  *  Tune device queuing depth, according to various limits.
  1073.  */
  1074. static void 
  1075. sym_tune_dev_queuing(hcb_p np, int target, int lun, u_short reqtags)
  1076. {
  1077. tcb_p tp = &np->target[target];
  1078. lcb_p lp = sym_lp(np, tp, lun);
  1079. u_short oldtags;
  1080. if (!lp)
  1081. return;
  1082. oldtags = lp->s.reqtags;
  1083. if (reqtags > lp->s.scdev_depth)
  1084. reqtags = lp->s.scdev_depth;
  1085. lp->started_limit = reqtags ? reqtags : 2;
  1086. lp->started_max   = 1;
  1087. lp->s.reqtags     = reqtags;
  1088. if (reqtags != oldtags) {
  1089. printf_info("%s:%d:%d: "
  1090.          "tagged command queuing %s, command queue depth %d.n",
  1091.           sym_name(np), target, lun,
  1092.           lp->s.reqtags ? "enabled" : "disabled",
  1093.             lp->started_limit);
  1094. }
  1095. }
  1096. #ifdef SYM_LINUX_BOOT_COMMAND_LINE_SUPPORT
  1097. /*
  1098.  *  Linux select queue depths function
  1099.  */
  1100. #define DEF_DEPTH (sym_driver_setup.max_tag)
  1101. #define ALL_TARGETS -2
  1102. #define NO_TARGET -1
  1103. #define ALL_LUNS -2
  1104. #define NO_LUN -1
  1105. static int device_queue_depth(hcb_p np, int target, int lun)
  1106. {
  1107. int c, h, t, u, v;
  1108. char *p = sym_driver_setup.tag_ctrl;
  1109. char *ep;
  1110. h = -1;
  1111. t = NO_TARGET;
  1112. u = NO_LUN;
  1113. while ((c = *p++) != 0) {
  1114. v = simple_strtoul(p, &ep, 0);
  1115. switch(c) {
  1116. case '/':
  1117. ++h;
  1118. t = ALL_TARGETS;
  1119. u = ALL_LUNS;
  1120. break;
  1121. case 't':
  1122. if (t != target)
  1123. t = (target == v) ? v : NO_TARGET;
  1124. u = ALL_LUNS;
  1125. break;
  1126. case 'u':
  1127. if (u != lun)
  1128. u = (lun == v) ? v : NO_LUN;
  1129. break;
  1130. case 'q':
  1131. if (h == np->s.unit &&
  1132. (t == ALL_TARGETS || t == target) &&
  1133. (u == ALL_LUNS    || u == lun))
  1134. return v;
  1135. break;
  1136. case '-':
  1137. t = ALL_TARGETS;
  1138. u = ALL_LUNS;
  1139. break;
  1140. default:
  1141. break;
  1142. }
  1143. p = ep;
  1144. }
  1145. return DEF_DEPTH;
  1146. }
  1147. #else
  1148. #define device_queue_depth(np, t, l) (sym_driver_setup.max_tag)
  1149. #endif /* SYM_LINUX_BOOT_COMMAND_LINE_SUPPORT */
  1150. /*
  1151.  * Linux entry point for device queue sizing.
  1152.  */
  1153. static void 
  1154. sym53c8xx_select_queue_depths(struct Scsi_Host *host, 
  1155.                               struct scsi_device *devlist)
  1156. {
  1157. struct scsi_device *device;
  1158. for (device = devlist; device; device = device->next) {
  1159. hcb_p np;
  1160. tcb_p tp;
  1161. lcb_p lp;
  1162. int reqtags;
  1163. if (device->host != host)
  1164. continue;
  1165. np = ((struct host_data *) host->hostdata)->ncb;
  1166. tp = &np->target[device->id];
  1167. /*
  1168.  *  Get user settings for transfer parameters.
  1169.  */
  1170. tp->inq_byte7_valid = (INQ7_SYNC|INQ7_WIDE16);
  1171. sym_update_trans_settings(np, tp);
  1172. /*
  1173.  *  Allocate the LCB if not yet.
  1174.  *  If it fail, we may well be in the sh*t. :)
  1175.  */
  1176. lp = sym_alloc_lcb(np, device->id, device->lun);
  1177. if (!lp) {
  1178. device->queue_depth = 1;
  1179. continue;
  1180. }
  1181. /*
  1182.  *  Get user flags.
  1183.  */
  1184. lp->curr_flags = lp->user_flags;
  1185. /*
  1186.  *  Select queue depth from driver setup.
  1187.  *  Donnot use more than configured by user.
  1188.  *  Use at least 2.
  1189.  *  Donnot use more than our maximum.
  1190.  */
  1191. reqtags = device_queue_depth(np, device->id, device->lun);
  1192. if (reqtags > tp->usrtags)
  1193. reqtags = tp->usrtags;
  1194. if (!device->tagged_supported)
  1195. reqtags = 0;
  1196. #if 1 /* Avoid to locally queue commands for no good reasons */
  1197. if (reqtags > SYM_CONF_MAX_TAG)
  1198. reqtags = SYM_CONF_MAX_TAG;
  1199. device->queue_depth = reqtags ? reqtags : 2;
  1200. #else
  1201. device->queue_depth = reqtags ? SYM_CONF_MAX_TAG : 2;
  1202. #endif
  1203. lp->s.scdev_depth = device->queue_depth;
  1204. sym_tune_dev_queuing(np, device->id, device->lun, reqtags);
  1205. }
  1206. }
  1207. /*
  1208.  *  Linux entry point for info() function
  1209.  */
  1210. const char *sym53c8xx_info (struct Scsi_Host *host)
  1211. {
  1212. return sym_driver_name();
  1213. }
  1214. #ifdef SYM_LINUX_PROC_INFO_SUPPORT
  1215. /*
  1216.  *  Proc file system stuff
  1217.  *
  1218.  *  A read operation returns adapter information.
  1219.  *  A write operation is a control command.
  1220.  *  The string is parsed in the driver code and the command is passed 
  1221.  *  to the sym_usercmd() function.
  1222.  */
  1223. #ifdef SYM_LINUX_USER_COMMAND_SUPPORT
  1224. struct sym_usrcmd {
  1225. u_long target;
  1226. u_long lun;
  1227. u_long data;
  1228. u_long cmd;
  1229. };
  1230. #define UC_SETSYNC      10
  1231. #define UC_SETTAGS 11
  1232. #define UC_SETDEBUG 12
  1233. #define UC_SETWIDE 14
  1234. #define UC_SETFLAG 15
  1235. #define UC_SETVERBOSE 17
  1236. #define UC_RESETDEV 18
  1237. #define UC_CLEARDEV 19
  1238. static void sym_exec_user_command (hcb_p np, struct sym_usrcmd *uc)
  1239. {
  1240. tcb_p tp;
  1241. int t, l;
  1242. switch (uc->cmd) {
  1243. case 0: return;
  1244. #ifdef SYM_LINUX_DEBUG_CONTROL_SUPPORT
  1245. case UC_SETDEBUG:
  1246. sym_debug_flags = uc->data;
  1247. break;
  1248. #endif
  1249. case UC_SETVERBOSE:
  1250. np->verbose = uc->data;
  1251. break;
  1252. default:
  1253. /*
  1254.  * We assume that other commands apply to targets.
  1255.  * This should always be the case and avoid the below 
  1256.  * 4 lines to be repeated 6 times.
  1257.  */
  1258. for (t = 0; t < SYM_CONF_MAX_TARGET; t++) {
  1259. if (!((uc->target >> t) & 1))
  1260. continue;
  1261. tp = &np->target[t];
  1262. switch (uc->cmd) {
  1263. case UC_SETSYNC:
  1264. if (!uc->data || uc->data >= 255) {
  1265. tp->tinfo.goal.options = 0;
  1266. tp->tinfo.goal.offset  = 0;
  1267. break;
  1268. }
  1269. if (uc->data <= 9 && np->minsync_dt) {
  1270. if (uc->data < np->minsync_dt)
  1271. uc->data = np->minsync_dt;
  1272. tp->tinfo.goal.options = PPR_OPT_DT;
  1273. tp->tinfo.goal.width   = 1;
  1274. tp->tinfo.goal.period = uc->data;
  1275. tp->tinfo.goal.offset = np->maxoffs_dt;
  1276. }
  1277. else {
  1278. if (uc->data < np->minsync)
  1279. uc->data = np->minsync;
  1280. tp->tinfo.goal.options = 0;
  1281. tp->tinfo.goal.period = uc->data;
  1282. tp->tinfo.goal.offset = np->maxoffs;
  1283. }
  1284. break;
  1285. case UC_SETWIDE:
  1286. tp->tinfo.goal.width = uc->data ? 1 : 0;
  1287. break;
  1288. case UC_SETTAGS:
  1289. for (l = 0; l < SYM_CONF_MAX_LUN; l++)
  1290. sym_tune_dev_queuing(np, t,l, uc->data);
  1291. break;
  1292. case UC_RESETDEV:
  1293. tp->to_reset = 1;
  1294. np->istat_sem = SEM;
  1295. OUTB (nc_istat, SIGP|SEM);
  1296. break;
  1297. case UC_CLEARDEV:
  1298. for (l = 0; l < SYM_CONF_MAX_LUN; l++) {
  1299. lcb_p lp = sym_lp(np, tp, l);
  1300. if (lp) lp->to_clear = 1;
  1301. }
  1302. np->istat_sem = SEM;
  1303. OUTB (nc_istat, SIGP|SEM);
  1304. break;
  1305. case UC_SETFLAG:
  1306. tp->usrflags = uc->data;
  1307. break;
  1308. }
  1309. }
  1310. break;
  1311. }
  1312. }
  1313. #define is_digit(c) ((c) >= '0' && (c) <= '9')
  1314. #define digit_to_bin(c) ((c) - '0')
  1315. #define is_space(c) ((c) == ' ' || (c) == 't')
  1316. static int skip_spaces(char *ptr, int len)
  1317. {
  1318. int cnt, c;
  1319. for (cnt = len; cnt > 0 && (c = *ptr++) && is_space(c); cnt--);
  1320. return (len - cnt);
  1321. }
  1322. static int get_int_arg(char *ptr, int len, u_long *pv)
  1323. {
  1324. int cnt, c;
  1325. u_long v;
  1326. for (v = 0, cnt = len; cnt > 0 && (c = *ptr++) && is_digit(c); cnt--) {
  1327. v = (v * 10) + digit_to_bin(c);
  1328. }
  1329. if (pv)
  1330. *pv = v;
  1331. return (len - cnt);
  1332. }
  1333. static int is_keyword(char *ptr, int len, char *verb)
  1334. {
  1335. int verb_len = strlen(verb);
  1336. if (len >= strlen(verb) && !memcmp(verb, ptr, verb_len))
  1337. return verb_len;
  1338. else
  1339. return 0;
  1340. }
  1341. #define SKIP_SPACES(min_spaces)
  1342. if ((arg_len = skip_spaces(ptr, len)) < (min_spaces))
  1343. return -EINVAL;
  1344. ptr += arg_len; len -= arg_len;
  1345. #define GET_INT_ARG(v)
  1346. if (!(arg_len = get_int_arg(ptr, len, &(v))))
  1347. return -EINVAL;
  1348. ptr += arg_len; len -= arg_len;
  1349. /*
  1350.  * Parse a control command
  1351.  */
  1352. static int sym_user_command(hcb_p np, char *buffer, int length)
  1353. {
  1354. char *ptr = buffer;
  1355. int len = length;
  1356. struct sym_usrcmd cmd, *uc = &cmd;
  1357. int arg_len;
  1358. u_long  target;
  1359. bzero(uc, sizeof(*uc));
  1360. if (len > 0 && ptr[len-1] == 'n')
  1361. --len;
  1362. if ((arg_len = is_keyword(ptr, len, "setsync")) != 0)
  1363. uc->cmd = UC_SETSYNC;
  1364. else if ((arg_len = is_keyword(ptr, len, "settags")) != 0)
  1365. uc->cmd = UC_SETTAGS;
  1366. else if ((arg_len = is_keyword(ptr, len, "setverbose")) != 0)
  1367. uc->cmd = UC_SETVERBOSE;
  1368. else if ((arg_len = is_keyword(ptr, len, "setwide")) != 0)
  1369. uc->cmd = UC_SETWIDE;
  1370. #ifdef SYM_LINUX_DEBUG_CONTROL_SUPPORT
  1371. else if ((arg_len = is_keyword(ptr, len, "setdebug")) != 0)
  1372. uc->cmd = UC_SETDEBUG;
  1373. #endif
  1374. else if ((arg_len = is_keyword(ptr, len, "setflag")) != 0)
  1375. uc->cmd = UC_SETFLAG;
  1376. else if ((arg_len = is_keyword(ptr, len, "resetdev")) != 0)
  1377. uc->cmd = UC_RESETDEV;
  1378. else if ((arg_len = is_keyword(ptr, len, "cleardev")) != 0)
  1379. uc->cmd = UC_CLEARDEV;
  1380. else
  1381. arg_len = 0;
  1382. #ifdef DEBUG_PROC_INFO
  1383. printk("sym_user_command: arg_len=%d, cmd=%ldn", arg_len, uc->cmd);
  1384. #endif
  1385. if (!arg_len)
  1386. return -EINVAL;
  1387. ptr += arg_len; len -= arg_len;
  1388. switch(uc->cmd) {
  1389. case UC_SETSYNC:
  1390. case UC_SETTAGS:
  1391. case UC_SETWIDE:
  1392. case UC_SETFLAG:
  1393. case UC_RESETDEV:
  1394. case UC_CLEARDEV:
  1395. SKIP_SPACES(1);
  1396. if ((arg_len = is_keyword(ptr, len, "all")) != 0) {
  1397. ptr += arg_len; len -= arg_len;
  1398. uc->target = ~0;
  1399. } else {
  1400. GET_INT_ARG(target);
  1401. uc->target = (1<<target);
  1402. #ifdef DEBUG_PROC_INFO
  1403. printk("sym_user_command: target=%ldn", target);
  1404. #endif
  1405. }
  1406. break;
  1407. }
  1408. switch(uc->cmd) {
  1409. case UC_SETVERBOSE:
  1410. case UC_SETSYNC:
  1411. case UC_SETTAGS:
  1412. case UC_SETWIDE:
  1413. SKIP_SPACES(1);
  1414. GET_INT_ARG(uc->data);
  1415. #ifdef DEBUG_PROC_INFO
  1416. printk("sym_user_command: data=%ldn", uc->data);
  1417. #endif
  1418. break;
  1419. #ifdef SYM_LINUX_DEBUG_CONTROL_SUPPORT
  1420. case UC_SETDEBUG:
  1421. while (len > 0) {
  1422. SKIP_SPACES(1);
  1423. if ((arg_len = is_keyword(ptr, len, "alloc")))
  1424. uc->data |= DEBUG_ALLOC;
  1425. else if ((arg_len = is_keyword(ptr, len, "phase")))
  1426. uc->data |= DEBUG_PHASE;
  1427. else if ((arg_len = is_keyword(ptr, len, "queue")))
  1428. uc->data |= DEBUG_QUEUE;
  1429. else if ((arg_len = is_keyword(ptr, len, "result")))
  1430. uc->data |= DEBUG_RESULT;
  1431. else if ((arg_len = is_keyword(ptr, len, "scatter")))
  1432. uc->data |= DEBUG_SCATTER;
  1433. else if ((arg_len = is_keyword(ptr, len, "script")))
  1434. uc->data |= DEBUG_SCRIPT;
  1435. else if ((arg_len = is_keyword(ptr, len, "tiny")))
  1436. uc->data |= DEBUG_TINY;
  1437. else if ((arg_len = is_keyword(ptr, len, "timing")))
  1438. uc->data |= DEBUG_TIMING;
  1439. else if ((arg_len = is_keyword(ptr, len, "nego")))
  1440. uc->data |= DEBUG_NEGO;
  1441. else if ((arg_len = is_keyword(ptr, len, "tags")))
  1442. uc->data |= DEBUG_TAGS;
  1443. else if ((arg_len = is_keyword(ptr, len, "pointer")))
  1444. uc->data |= DEBUG_POINTER;
  1445. else
  1446. return -EINVAL;
  1447. ptr += arg_len; len -= arg_len;
  1448. }
  1449. #ifdef DEBUG_PROC_INFO
  1450. printk("sym_user_command: data=%ldn", uc->data);
  1451. #endif
  1452. break;
  1453. #endif /* SYM_LINUX_DEBUG_CONTROL_SUPPORT */
  1454. case UC_SETFLAG:
  1455. while (len > 0) {
  1456. SKIP_SPACES(1);
  1457. if ((arg_len = is_keyword(ptr, len, "no_disc")))
  1458. uc->data &= ~SYM_DISC_ENABLED;
  1459. else
  1460. return -EINVAL;
  1461. ptr += arg_len; len -= arg_len;
  1462. }
  1463. break;
  1464. default:
  1465. break;
  1466. }
  1467. if (len)
  1468. return -EINVAL;
  1469. else {
  1470. long flags;
  1471. SYM_LOCK_HCB(np, flags);
  1472. sym_exec_user_command (np, uc);
  1473. SYM_UNLOCK_HCB(np, flags);
  1474. }
  1475. return length;
  1476. }
  1477. #endif /* SYM_LINUX_USER_COMMAND_SUPPORT */
  1478. #ifdef SYM_LINUX_USER_INFO_SUPPORT
  1479. /*
  1480.  *  Informations through the proc file system.
  1481.  */
  1482. struct info_str {
  1483. char *buffer;
  1484. int length;
  1485. int offset;
  1486. int pos;
  1487. };
  1488. static void copy_mem_info(struct info_str *info, char *data, int len)
  1489. {
  1490. if (info->pos + len > info->length)
  1491. len = info->length - info->pos;
  1492. if (info->pos + len < info->offset) {
  1493. info->pos += len;
  1494. return;
  1495. }
  1496. if (info->pos < info->offset) {
  1497. data += (info->offset - info->pos);
  1498. len  -= (info->offset - info->pos);
  1499. }
  1500. if (len > 0) {
  1501. memcpy(info->buffer + info->pos, data, len);
  1502. info->pos += len;
  1503. }
  1504. }
  1505. static int copy_info(struct info_str *info, char *fmt, ...)
  1506. {
  1507. va_list args;
  1508. char buf[81];
  1509. int len;
  1510. va_start(args, fmt);
  1511. len = vsprintf(buf, fmt, args);
  1512. va_end(args);
  1513. copy_mem_info(info, buf, len);
  1514. return len;
  1515. }
  1516. /*
  1517.  *  Copy formatted information into the input buffer.
  1518.  */
  1519. static int sym_host_info(hcb_p np, char *ptr, off_t offset, int len)
  1520. {
  1521. struct info_str info;
  1522. info.buffer = ptr;
  1523. info.length = len;
  1524. info.offset = offset;
  1525. info.pos = 0;
  1526. copy_info(&info, "Chip " NAME53C "%s, device id 0x%x, "
  1527.  "revision id 0x%xn",
  1528.  np->s.chip_name, np->device_id, np->revision_id);
  1529. copy_info(&info, "On PCI bus %d, device %d, function %d, "
  1530. #ifdef __sparc__
  1531. "IRQ %sn",
  1532. #else
  1533. "IRQ %dn",
  1534. #endif
  1535. np->s.bus, (np->s.device_fn & 0xf8) >> 3, np->s.device_fn & 7,
  1536. #ifdef __sparc__
  1537. __irq_itoa(np->s.irq));
  1538. #else
  1539. (int) np->s.irq);
  1540. #endif
  1541. copy_info(&info, "Min. period factor %d, %s SCSI BUS%sn",
  1542.  (int) (np->minsync_dt ? np->minsync_dt : np->minsync),
  1543.  np->maxwide ? "Wide" : "Narrow",
  1544.  np->minsync_dt ? ", DT capable" : "");
  1545. copy_info(&info, "Max. started commands %d, "
  1546.  "max. commands per LUN %dn",
  1547.  SYM_CONF_MAX_START, SYM_CONF_MAX_TAG);
  1548. return info.pos > info.offset? info.pos - info.offset : 0;
  1549. }
  1550. #endif /* SYM_LINUX_USER_INFO_SUPPORT */
  1551. /*
  1552.  *  Entry point of the scsi proc fs of the driver.
  1553.  *  - func = 0 means read  (returns adapter infos)
  1554.  *  - func = 1 means write (not yet merget from sym53c8xx)
  1555.  */
  1556. static int sym53c8xx_proc_info(char *buffer, char **start, off_t offset,
  1557. int length, int hostno, int func)
  1558. {
  1559. struct Scsi_Host *host;
  1560. struct host_data *host_data;
  1561. hcb_p np = 0;
  1562. int retv;
  1563. for (host = first_host; host; host = host->next) {
  1564. if (host->hostt != first_host->hostt)
  1565. continue;
  1566. if (host->host_no == hostno) {
  1567. host_data = (struct host_data *) host->hostdata;
  1568. np = host_data->ncb;
  1569. break;
  1570. }
  1571. }
  1572. if (!np)
  1573. return -EINVAL;
  1574. if (func) {
  1575. #ifdef SYM_LINUX_USER_COMMAND_SUPPORT
  1576. retv = sym_user_command(np, buffer, length);
  1577. #else
  1578. retv = -EINVAL;
  1579. #endif
  1580. }
  1581. else {
  1582. if (start)
  1583. *start = buffer;
  1584. #ifdef SYM_LINUX_USER_INFO_SUPPORT
  1585. retv = sym_host_info(np, buffer, offset, length);
  1586. #else
  1587. retv = -EINVAL;
  1588. #endif
  1589. }
  1590. return retv;
  1591. }
  1592. #endif /* SYM_LINUX_PROC_INFO_SUPPORT */
  1593. /*
  1594.  * Free controller resources.
  1595.  */
  1596. static void sym_free_resources(hcb_p np)
  1597. {
  1598. /*
  1599.  *  Free O/S specific resources.
  1600.  */
  1601. if (np->s.irq)
  1602. free_irq(np->s.irq, np);
  1603. if (np->s.io_port)
  1604. release_region(np->s.io_port, np->s.io_ws);
  1605. #ifndef SYM_OPT_NO_BUS_MEMORY_MAPPING
  1606. if (np->s.mmio_va)
  1607. pci_unmap_mem(np->s.mmio_va, np->s.io_ws);
  1608. if (np->s.ram_va)
  1609. pci_unmap_mem(np->s.ram_va, np->ram_ws);
  1610. #endif
  1611. /*
  1612.  *  Free O/S independant resources.
  1613.  */
  1614. sym_hcb_free(np);
  1615. sym_mfree_dma(np, sizeof(*np), "HCB");
  1616. }
  1617. /*
  1618.  *  Ask/tell the system about DMA addressing.
  1619.  */
  1620. #ifdef SYM_LINUX_DYNAMIC_DMA_MAPPING
  1621. static int sym_setup_bus_dma_mask(hcb_p np)
  1622. {
  1623. #if LINUX_VERSION_CODE < LinuxVersionCode(2,4,3)
  1624. if (!pci_dma_supported(np->s.device, 0xffffffffUL))
  1625. goto out_err32;
  1626. #else
  1627. #if   SYM_CONF_DMA_ADDRESSING_MODE == 0
  1628. if (pci_set_dma_mask(np->s.device, 0xffffffffUL))
  1629. goto out_err32;
  1630. #else
  1631. #if   SYM_CONF_DMA_ADDRESSING_MODE == 1
  1632. #define PciDmaMask 0xffffffffff
  1633. #elif SYM_CONF_DMA_ADDRESSING_MODE == 2
  1634. #define PciDmaMask 0xffffffffffffffff
  1635. #endif
  1636. if (np->features & FE_DAC) {
  1637. if (!pci_set_dma_mask(np->s.device, PciDmaMask)) {
  1638. np->use_dac = 1;
  1639. printf_info("%s: using 64 bit DMA addressingn",
  1640. sym_name(np));
  1641. }
  1642. else {
  1643. if (pci_set_dma_mask(np->s.device, 0xffffffffUL))
  1644. goto out_err32;
  1645. }
  1646. }
  1647. #undef PciDmaMask
  1648. #endif
  1649. #endif
  1650. return 0;
  1651. out_err32:
  1652. printf_warning("%s: 32 BIT DMA ADDRESSING NOT SUPPORTEDn",
  1653. sym_name(np));
  1654. return -1;
  1655. }
  1656. #endif /* SYM_LINUX_DYNAMIC_DMA_MAPPING */
  1657. /*
  1658.  *  Host attach and initialisations.
  1659.  *
  1660.  *  Allocate host data and ncb structure.
  1661.  *  Request IO region and remap MMIO region.
  1662.  *  Do chip initialization.
  1663.  *  If all is OK, install interrupt handling and
  1664.  *  start the timer daemon.
  1665.  */
  1666. static int __init 
  1667. sym_attach (Scsi_Host_Template *tpnt, int unit, sym_device *dev)
  1668. {
  1669.         struct host_data *host_data;
  1670. hcb_p np = 0;
  1671.         struct Scsi_Host *instance = 0;
  1672. u_long flags = 0;
  1673. sym_nvram *nvram = dev->nvram;
  1674. struct sym_fw *fw;
  1675. printk(KERN_INFO
  1676. "sym%d: <%s> rev 0x%x on pci bus %d device %d function %d "
  1677. #ifdef __sparc__
  1678. "irq %sn",
  1679. #else
  1680. "irq %dn",
  1681. #endif
  1682. unit, dev->chip.name, dev->chip.revision_id,
  1683. dev->s.bus, (dev->s.device_fn & 0xf8) >> 3,
  1684. dev->s.device_fn & 7,
  1685. #ifdef __sparc__
  1686. __irq_itoa(dev->s.irq));
  1687. #else
  1688. dev->s.irq);
  1689. #endif
  1690. /*
  1691.  *  Get the firmware for this chip.
  1692.  */
  1693. fw = sym_find_firmware(&dev->chip);
  1694. if (!fw)
  1695. goto attach_failed;
  1696. /*
  1697.  * Allocate host_data structure
  1698.  */
  1699.         if (!(instance = scsi_register(tpnt, sizeof(*host_data))))
  1700.         goto attach_failed;
  1701. host_data = (struct host_data *) instance->hostdata;
  1702. /*
  1703.  *  Allocate immediately the host control block, 
  1704.  *  since we are only expecting to succeed. :)
  1705.  *  We keep track in the HCB of all the resources that 
  1706.  *  are to be released on error.
  1707.  */
  1708. #ifdef SYM_LINUX_DYNAMIC_DMA_MAPPING
  1709. np = __sym_calloc_dma(dev->pdev, sizeof(*np), "HCB");
  1710. if (np) {
  1711. np->s.device = dev->pdev;
  1712. np->bus_dmat = dev->pdev; /* Result in 1 DMA pool per HBA */
  1713. }
  1714. else
  1715. goto attach_failed;
  1716. #else
  1717. np = sym_calloc_dma(sizeof(*np), "HCB");
  1718. if (!np)
  1719. goto attach_failed;
  1720. #endif
  1721. host_data->ncb = np;
  1722. SYM_INIT_LOCK_HCB(np);
  1723. /*
  1724.  *  Copy some useful infos to the HCB.
  1725.  */
  1726. np->hcb_ba = vtobus(np);
  1727. np->verbose = sym_driver_setup.verbose;
  1728. np->s.device = dev->pdev;
  1729. np->s.unit = unit;
  1730. np->device_id = dev->chip.device_id;
  1731. np->revision_id = dev->chip.revision_id;
  1732. np->s.bus = dev->s.bus;
  1733. np->s.device_fn = dev->s.device_fn;
  1734. np->features = dev->chip.features;
  1735. np->clock_divn = dev->chip.nr_divisor;
  1736. np->maxoffs = dev->chip.offset_max;
  1737. np->maxburst = dev->chip.burst_max;
  1738. np->myaddr = dev->host_id;
  1739. /*
  1740.  *  Edit its name.
  1741.  */
  1742. strncpy(np->s.chip_name, dev->chip.name, sizeof(np->s.chip_name)-1);
  1743. sprintf(np->s.inst_name, "sym%d", np->s.unit);
  1744. /*
  1745.  *  Ask/tell the system about DMA addressing.
  1746.  */
  1747. #ifdef SYM_LINUX_DYNAMIC_DMA_MAPPING
  1748. if (sym_setup_bus_dma_mask(np))
  1749. goto attach_failed;
  1750. #endif
  1751. /*
  1752.  *  Try to map the controller chip to
  1753.  *  virtual and physical memory.
  1754.  */
  1755. np->mmio_ba = (u32)dev->s.base;
  1756. np->s.io_ws = (np->features & FE_IO256)? 256 : 128;
  1757. #ifndef SYM_CONF_IOMAPPED
  1758. np->s.mmio_va = pci_map_mem(dev->s.base_c, np->s.io_ws);
  1759. if (!np->s.mmio_va) {
  1760. printf_err("%s: can't map PCI MMIO regionn", sym_name(np));
  1761. goto attach_failed;
  1762. }
  1763. else if (sym_verbose > 1)
  1764. printf_info("%s: using memory mapped IOn", sym_name(np));
  1765. #endif /* !defined SYM_CONF_IOMAPPED */
  1766. /*
  1767.  *  Try to map the controller chip into iospace.
  1768.  */
  1769. if (dev->s.io_port) {
  1770. request_region(dev->s.io_port, np->s.io_ws, NAME53C8XX);
  1771. np->s.io_port = dev->s.io_port;
  1772. }
  1773. /*
  1774.  *  Map on-chip RAM if present and supported.
  1775.  */
  1776. if (!(np->features & FE_RAM))
  1777. dev->s.base_2 = 0;
  1778. if (dev->s.base_2) {
  1779. np->ram_ba = (u32)dev->s.base_2;
  1780. if (np->features & FE_RAM8K)
  1781. np->ram_ws = 8192;
  1782. else
  1783. np->ram_ws = 4096;
  1784. #ifndef SYM_OPT_NO_BUS_MEMORY_MAPPING
  1785. np->s.ram_va = pci_map_mem(dev->s.base_2_c, np->ram_ws);
  1786. if (!np->s.ram_va) {
  1787. printf_err("%s: can't map PCI MEMORY regionn",
  1788.        sym_name(np));
  1789. goto attach_failed;
  1790. }
  1791. #endif
  1792. }
  1793. /*
  1794.  *  Perform O/S independant stuff.
  1795.  */
  1796. if (sym_hcb_attach(np, fw, nvram))
  1797. goto attach_failed;
  1798. /*
  1799.  *  Install the interrupt handler.
  1800.  *  If we synchonize the C code with SCRIPTS on interrupt, 
  1801.  *  we donnot want to share the INTR line at all.
  1802.  */
  1803. if (request_irq(dev->s.irq, sym53c8xx_intr, SA_SHIRQ,
  1804. NAME53C8XX, np)) {
  1805. printf_err("%s: request irq %d failuren",
  1806. sym_name(np), dev->s.irq);
  1807. goto attach_failed;
  1808. }
  1809. np->s.irq = dev->s.irq;
  1810. /*
  1811.  *  After SCSI devices have been opened, we cannot
  1812.  *  reset the bus safely, so we do it here.
  1813.  */
  1814. SYM_LOCK_HCB(np, flags);
  1815. if (sym_reset_scsi_bus(np, 0)) {
  1816. printf_err("%s: FATAL ERROR: CHECK SCSI BUS - CABLES, "
  1817.            "TERMINATION, DEVICE POWER etc.!n", sym_name(np));
  1818. SYM_UNLOCK_HCB(np, flags);
  1819. goto attach_failed;
  1820. }
  1821. /*
  1822.  *  Initialize some queue headers.
  1823.  */
  1824. sym_que_init(&np->s.wait_cmdq);
  1825. sym_que_init(&np->s.busy_cmdq);
  1826. /*
  1827.  *  Start the SCRIPTS.
  1828.  */
  1829. sym_start_up (np, 1);
  1830. /*
  1831.  *  Start the timer daemon
  1832.  */
  1833. init_timer(&np->s.timer);
  1834. np->s.timer.data     = (unsigned long) np;
  1835. np->s.timer.function = sym53c8xx_timer;
  1836. np->s.lasttime=0;
  1837. sym_timer (np);
  1838. /*
  1839.  *  Done.
  1840.  */
  1841.         if (!first_host)
  1842.          first_host = instance;
  1843. /*
  1844.  *  Fill Linux host instance structure
  1845.  *  and return success.
  1846.  */
  1847. instance->max_channel = 0;
  1848. instance->this_id = np->myaddr;
  1849. instance->max_id = np->maxwide ? 16 : 8;
  1850. instance->max_lun = SYM_CONF_MAX_LUN;
  1851. #ifndef SYM_CONF_IOMAPPED
  1852. #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,29)
  1853. instance->base = (unsigned long) np->s.mmio_va;
  1854. #else
  1855. instance->base = (char *) np->s.mmio_va;
  1856. #endif
  1857. #endif
  1858. instance->irq = np->s.irq;
  1859. instance->unique_id = np->s.io_port;
  1860. instance->io_port = np->s.io_port;
  1861. instance->n_io_port = np->s.io_ws;
  1862. instance->dma_channel = 0;
  1863. instance->cmd_per_lun = SYM_CONF_MAX_TAG;
  1864. instance->can_queue = (SYM_CONF_MAX_START-2);
  1865. instance->sg_tablesize = SYM_CONF_MAX_SG;
  1866. #if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0)
  1867. instance->max_cmd_len = 16;
  1868. #endif
  1869. instance->select_queue_depths = sym53c8xx_select_queue_depths;
  1870. instance->highmem_io = 1;
  1871. SYM_UNLOCK_HCB(np, flags);
  1872. scsi_set_pci_device(instance, dev->pdev);
  1873. /*
  1874.  *  Now let the generic SCSI driver
  1875.  *  look for the SCSI devices on the bus ..
  1876.  */
  1877. return 0;
  1878. attach_failed:
  1879. if (!instance) return -1;
  1880. printf_info("%s: giving up ...n", sym_name(np));
  1881. if (np)
  1882. sym_free_resources(np);
  1883. scsi_unregister(instance);
  1884.         return -1;
  1885.  }
  1886. /*
  1887.  *    Detect and try to read SYMBIOS and TEKRAM NVRAM.
  1888.  */
  1889. #if SYM_CONF_NVRAM_SUPPORT
  1890. static void __init sym_get_nvram(sym_device *devp, sym_nvram *nvp)
  1891. {
  1892. if (!nvp)
  1893. return;
  1894. devp->nvram = nvp;
  1895. devp->device_id = devp->chip.device_id;
  1896. nvp->type = 0;
  1897. /*
  1898.  *  Get access to chip IO registers
  1899.  */
  1900. #ifdef SYM_CONF_IOMAPPED
  1901. request_region(devp->s.io_port, 128, NAME53C8XX);
  1902. #else
  1903. devp->s.mmio_va = pci_map_mem(devp->s.base_c, 128);
  1904. if (!devp->s.mmio_va)
  1905. return;
  1906. #endif
  1907. /*
  1908.  *  Try to read SYMBIOS|TEKRAM nvram.
  1909.  */
  1910. (void) sym_read_nvram(devp, nvp);
  1911. /*
  1912.  *  Release access to chip IO registers
  1913.  */
  1914. #ifdef SYM_CONF_IOMAPPED
  1915. release_region(devp->s.io_port, 128);
  1916. #else
  1917. pci_unmap_mem((u_long) devp->s.mmio_va, 128ul);
  1918. #endif
  1919. }
  1920. #endif /* SYM_CONF_NVRAM_SUPPORT */
  1921. /*
  1922.  *  Driver setup from the boot command line
  1923.  */
  1924. #ifdef SYM_LINUX_BOOT_COMMAND_LINE_SUPPORT
  1925. static struct sym_driver_setup
  1926. sym_driver_safe_setup __initdata = SYM_LINUX_DRIVER_SAFE_SETUP;
  1927. #ifdef MODULE
  1928. char *sym53c8xx = 0; /* command line passed by insmod */
  1929. MODULE_PARM(sym53c8xx, "s");
  1930. #endif
  1931. static void __init sym53c8xx_print_driver_setup(void)
  1932. {
  1933. printf_info (NAME53C8XX ": setup="
  1934. "mpar:%d,spar:%d,tags:%d,sync:%d,burst:%d,"
  1935. "led:%d,wide:%d,diff:%d,irqm:%d, buschk:%dn",
  1936. sym_driver_setup.pci_parity,
  1937. sym_driver_setup.scsi_parity,
  1938. sym_driver_setup.max_tag,
  1939. sym_driver_setup.min_sync,
  1940. sym_driver_setup.burst_order,
  1941. sym_driver_setup.scsi_led,
  1942. sym_driver_setup.max_wide,
  1943. sym_driver_setup.scsi_diff,
  1944. sym_driver_setup.irq_mode,
  1945. sym_driver_setup.scsi_bus_check);
  1946. printf_info (NAME53C8XX ": setup="
  1947. "hostid:%d,offs:%d,luns:%d,pcifix:%d,revprob:%d,"
  1948. "verb:%d,debug:0x%x,setlle_delay:%dn",
  1949. sym_driver_setup.host_id,
  1950. sym_driver_setup.max_offs,
  1951. sym_driver_setup.max_lun,
  1952. sym_driver_setup.pci_fix_up,
  1953. sym_driver_setup.reverse_probe,
  1954. sym_driver_setup.verbose,
  1955. sym_driver_setup.debug,
  1956. sym_driver_setup.settle_delay);
  1957. #ifdef DEBUG_2_0_X
  1958. MDELAY(5000);
  1959. #endif
  1960. };
  1961. #define OPT_PCI_PARITY 1
  1962. #define OPT_SCSI_PARITY 2
  1963. #define OPT_MAX_TAG 3
  1964. #define OPT_MIN_SYNC 4
  1965. #define OPT_BURST_ORDER 5
  1966. #define OPT_SCSI_LED 6
  1967. #define OPT_MAX_WIDE 7
  1968. #define OPT_SCSI_DIFF 8
  1969. #define OPT_IRQ_MODE 9
  1970. #define OPT_SCSI_BUS_CHECK 10
  1971. #define OPT_HOST_ID 11
  1972. #define OPT_MAX_OFFS 12
  1973. #define OPT_MAX_LUN 13
  1974. #define OPT_PCI_FIX_UP 14
  1975. #define OPT_REVERSE_PROBE 15
  1976. #define OPT_VERBOSE 16
  1977. #define OPT_DEBUG 17
  1978. #define OPT_SETTLE_DELAY 18
  1979. #define OPT_USE_NVRAM 19
  1980. #define OPT_EXCLUDE 20
  1981. #define OPT_SAFE_SETUP 21
  1982. static char setup_token[] __initdata =
  1983. "mpar:" "spar:"
  1984. "tags:" "sync:"
  1985. "burst:" "led:"
  1986. "wide:" "diff:"
  1987. "irqm:" "buschk:"
  1988. "hostid:" "offset:"
  1989. "luns:" "pcifix:"
  1990. "revprob:" "verb:"
  1991. "debug:" "settle:"
  1992. "nvram:" "excl:"
  1993. "safe:"
  1994. ;
  1995. #ifdef MODULE
  1996. #define ARG_SEP ' '
  1997. #else
  1998. #define ARG_SEP ','
  1999. #endif
  2000. static int __init get_setup_token(char *p)
  2001. {
  2002. char *cur = setup_token;
  2003. char *pc;
  2004. int i = 0;
  2005. while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {
  2006. ++pc;
  2007. ++i;
  2008. if (!strncmp(p, cur, pc - cur))
  2009. return i;
  2010. cur = pc;
  2011. }
  2012. return 0;
  2013. }
  2014. #endif /* SYM_LINUX_BOOT_COMMAND_LINE_SUPPORT */
  2015. int __init sym53c8xx_setup(char *str)
  2016. {
  2017. #ifdef SYM_LINUX_BOOT_COMMAND_LINE_SUPPORT
  2018. char *cur = str;
  2019. char *pc, *pv;
  2020. unsigned long val;
  2021. int i,  c;
  2022. int xi = 0;
  2023. while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {
  2024. char *pe;
  2025. val = 0;
  2026. pv = pc;
  2027. c = *++pv;
  2028. if (c == 'n')
  2029. val = 0;
  2030. else if (c == 'y')
  2031. val = 1;
  2032. else
  2033. val = (int) simple_strtoul(pv, &pe, 0);
  2034. switch (get_setup_token(cur)) {
  2035. case OPT_MAX_TAG:
  2036. sym_driver_setup.max_tag = val;
  2037. if (!(pe && *pe == '/'))
  2038. break;
  2039. i = 0;
  2040. while (*pe && *pe != ARG_SEP && 
  2041. i < sizeof(sym_driver_setup.tag_ctrl)-1) {
  2042. sym_driver_setup.tag_ctrl[i++] = *pe++;
  2043. }
  2044. sym_driver_setup.tag_ctrl[i] = '';
  2045. break;
  2046. case OPT_SAFE_SETUP:
  2047. memcpy(&sym_driver_setup, &sym_driver_safe_setup,
  2048. sizeof(sym_driver_setup));
  2049. break;
  2050. case OPT_EXCLUDE:
  2051. if (xi < 8)
  2052. sym_driver_setup.excludes[xi++] = val;
  2053. break;
  2054. #define __SIMPLE_OPTION(NAME, name) 
  2055. case OPT_ ## NAME :
  2056. sym_driver_setup.name = val;
  2057. break;
  2058. __SIMPLE_OPTION(PCI_PARITY, pci_parity)
  2059. __SIMPLE_OPTION(SCSI_PARITY, scsi_parity)
  2060. __SIMPLE_OPTION(MIN_SYNC, min_sync)
  2061. __SIMPLE_OPTION(BURST_ORDER, burst_order)
  2062. __SIMPLE_OPTION(SCSI_LED, scsi_led)
  2063. __SIMPLE_OPTION(MAX_WIDE, max_wide)
  2064. __SIMPLE_OPTION(SCSI_DIFF, scsi_diff)
  2065. __SIMPLE_OPTION(IRQ_MODE, irq_mode)
  2066. __SIMPLE_OPTION(SCSI_BUS_CHECK, scsi_bus_check)
  2067. __SIMPLE_OPTION(HOST_ID, host_id)
  2068. __SIMPLE_OPTION(MAX_OFFS, max_offs)
  2069. __SIMPLE_OPTION(MAX_LUN, max_lun)
  2070. __SIMPLE_OPTION(PCI_FIX_UP, pci_fix_up)
  2071. __SIMPLE_OPTION(REVERSE_PROBE, reverse_probe)
  2072. __SIMPLE_OPTION(VERBOSE, verbose)
  2073. __SIMPLE_OPTION(DEBUG, debug)
  2074. __SIMPLE_OPTION(SETTLE_DELAY, settle_delay)
  2075. __SIMPLE_OPTION(USE_NVRAM, use_nvram)
  2076. #undef __SIMPLE_OPTION
  2077. default:
  2078. printk("sym53c8xx_setup: unexpected boot option '%.*s' ignoredn", (int)(pc-cur+1), cur);
  2079. break;
  2080. }
  2081. if ((cur = strchr(cur, ARG_SEP)) != NULL)
  2082. ++cur;
  2083. }
  2084. #endif /* SYM_LINUX_BOOT_COMMAND_LINE_SUPPORT */
  2085. return 1;
  2086. }
  2087. #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,13)
  2088. #ifndef MODULE
  2089. __setup("sym53c8xx=", sym53c8xx_setup);
  2090. #endif
  2091. #endif
  2092. #ifdef SYM_CONF_PQS_PDS_SUPPORT
  2093. /*
  2094.  *  Detect all NCR PQS/PDS boards and keep track of their bus nr.
  2095.  *
  2096.  *  The NCR PQS or PDS card is constructed as a DEC bridge
  2097.  *  behind which sit a proprietary NCR memory controller and
  2098.  *  four or two 53c875s as separate devices.  In its usual mode
  2099.  *  of operation, the 875s are slaved to the memory controller
  2100.  *  for all transfers.  We can tell if an 875 is part of a
  2101.  *  PQS/PDS or not since if it is, it will be on the same bus
  2102.  *  as the memory controller.  To operate with the Linux
  2103.  *  driver, the memory controller is disabled and the 875s
  2104.  *  freed to function independently.  The only wrinkle is that
  2105.  *  the preset SCSI ID (which may be zero) must be read in from
  2106.  *  a special configuration space register of the 875
  2107.  */
  2108. #ifndef SYM_CONF_MAX_PQS_BUS
  2109. #define SYM_CONF_MAX_PQS_BUS 16
  2110. #endif
  2111. static int pqs_bus[SYM_CONF_MAX_PQS_BUS] __initdata = { 0 };
  2112. static void __init sym_detect_pqs_pds(void)
  2113. {
  2114. short index;
  2115. pcidev_t dev = PCIDEV_NULL;
  2116. for(index=0; index < SYM_CONF_MAX_PQS_BUS; index++) {
  2117. u_char tmp;
  2118. dev = pci_find_device(0x101a, 0x0009, dev);
  2119. if (dev == PCIDEV_NULL) {
  2120. pqs_bus[index] = -1;
  2121. break;
  2122. }
  2123. printf_info(NAME53C8XX ": NCR PQS/PDS memory controller detected on bus %dn", PciBusNumber(dev));
  2124. pci_read_config_byte(dev, 0x44, &tmp);
  2125. /* bit 1: allow individual 875 configuration */
  2126. tmp |= 0x2;
  2127. pci_write_config_byte(dev, 0x44, tmp);
  2128. pci_read_config_byte(dev, 0x45, &tmp);
  2129. /* bit 2: drive individual 875 interrupts to the bus */
  2130. tmp |= 0x4;
  2131. pci_write_config_byte(dev, 0x45, tmp);
  2132. pqs_bus[index] = PciBusNumber(dev);
  2133. }
  2134. }
  2135. #endif /* SYM_CONF_PQS_PDS_SUPPORT */
  2136. /*
  2137.  *  Read and check the PCI configuration for any detected NCR 
  2138.  *  boards and save data for attaching after all boards have 
  2139.  *  been detected.
  2140.  */
  2141. static int __init
  2142. sym53c8xx_pci_init(Scsi_Host_Template *tpnt, pcidev_t pdev, sym_device *device)
  2143. {
  2144. u_short vendor_id, device_id, command, status_reg;
  2145. u_char cache_line_size;
  2146. u_char suggested_cache_line_size = 0;
  2147. u_char pci_fix_up = SYM_SETUP_PCI_FIX_UP;
  2148. u_char revision;
  2149. u_int irq;
  2150. u_long base, base_2, base_io; 
  2151. u_long base_c, base_2_c, io_port; 
  2152. int i;
  2153. sym_chip *chip;
  2154. /* Choose some short name for this device */
  2155. sprintf(device->s.inst_name, "sym.%d.%d.%d",
  2156. PciBusNumber(pdev),
  2157. (int) (PciDeviceFn(pdev) & 0xf8) >> 3,
  2158. (int) (PciDeviceFn(pdev) & 7));
  2159. /*
  2160.  *  Read needed minimal info from the PCI config space.
  2161.  */
  2162. vendor_id = PciVendorId(pdev);
  2163. device_id = PciDeviceId(pdev);
  2164. irq   = PciIrqLine(pdev);
  2165. i = pci_get_base_address(pdev, 0, &base_io);
  2166. io_port = pci_get_base_cookie(pdev, 0);
  2167. base_c = pci_get_base_cookie(pdev, i);
  2168. i = pci_get_base_address(pdev, i, &base);
  2169. base_2_c = pci_get_base_cookie(pdev, i);
  2170. (void) pci_get_base_address(pdev, i, &base_2);
  2171. io_port &= PCI_BASE_ADDRESS_IO_MASK;
  2172. base &= PCI_BASE_ADDRESS_MEM_MASK;
  2173. base_2 &= PCI_BASE_ADDRESS_MEM_MASK;
  2174. pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);
  2175. /*
  2176.  *  If user excluded this chip, donnot initialize it.
  2177.  */
  2178. if (base_io) {
  2179. for (i = 0 ; i < 8 ; i++) {
  2180. if (sym_driver_setup.excludes[i] == base_io)
  2181. return -1;
  2182. }
  2183. }
  2184. /*
  2185.  *  Leave here if another driver attached the chip.
  2186.  */
  2187. if (io_port && check_region (io_port, 128)) {
  2188. printf_info("%s: IO region 0x%lx[0..127] is in usen",
  2189.             sym_name(device), (long) io_port);
  2190. return -1;
  2191. }
  2192. /*
  2193.  *  Check if the chip is supported.
  2194.  */
  2195. chip = sym_lookup_pci_chip_table(device_id, revision);
  2196. if (!chip) {
  2197. printf_info("%s: device not supportedn", sym_name(device));
  2198. return -1;
  2199. }
  2200. /*
  2201.  *  Check if the chip has been assigned resources we need.
  2202.  */
  2203. #ifdef SYM_CONF_IOMAPPED
  2204. if (!io_port) {
  2205. printf_info("%s: IO base address disabled.n",
  2206.             sym_name(device));
  2207. return -1;
  2208. }
  2209. #else
  2210. if (!base) {
  2211. printf_info("%s: MMIO base address disabled.n",
  2212.             sym_name(device));
  2213. return -1;
  2214. }
  2215. #endif
  2216. /*
  2217.  *  Ignore Symbios chips controlled by various RAID controllers.
  2218.  *  These controllers set value 0x52414944 at RAM end - 16.
  2219.  */
  2220. #if defined(__i386__) && !defined(SYM_OPT_NO_BUS_MEMORY_MAPPING)
  2221. if (base_2_c) {
  2222. unsigned int ram_size, ram_val;
  2223. u_long ram_ptr;
  2224. if (chip->features & FE_RAM8K)
  2225. ram_size = 8192;
  2226. else
  2227. ram_size = 4096;
  2228. ram_ptr = pci_map_mem(base_2_c, ram_size);
  2229. if (ram_ptr) {
  2230. ram_val = readl_raw(ram_ptr + ram_size - 16);
  2231. pci_unmap_mem(ram_ptr, ram_size);
  2232. if (ram_val == 0x52414944) {
  2233. printf_info("%s: not initializing, "
  2234.             "driven by RAID controller.n",
  2235.             sym_name(device));
  2236. return -1;
  2237. }
  2238. }
  2239. }
  2240. #endif /* i386 and PCI MEMORY accessible */
  2241. /*
  2242.  *  Copy the chip description to our device structure, 
  2243.  *  so we can make it match the actual device and options.
  2244.  */
  2245. bcopy(chip, &device->chip, sizeof(device->chip));
  2246. device->chip.revision_id = revision;
  2247. /*
  2248.  *  Read additionnal info from the configuration space.
  2249.  */
  2250. pci_read_config_word(pdev, PCI_COMMAND, &command);
  2251. pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cache_line_size);
  2252. /*
  2253.  * Enable missing capabilities in the PCI COMMAND register.
  2254.  */
  2255. #ifdef SYM_CONF_IOMAPPED
  2256. #define PCI_COMMAND_BITS_TO_ENABLE (PCI_COMMAND_IO | 
  2257. PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_PARITY)
  2258. #else
  2259. #define PCI_COMMAND_BITS_TO_ENABLE 
  2260. (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_PARITY)
  2261. #endif
  2262. if ((command & PCI_COMMAND_BITS_TO_ENABLE)
  2263.     != PCI_COMMAND_BITS_TO_ENABLE) {
  2264. printf_info("%s: setting%s%s%s%s...n", sym_name(device),
  2265. (command & PCI_COMMAND_IO)     ? "" : " PCI_COMMAND_IO",
  2266. (command & PCI_COMMAND_MEMORY) ? "" : " PCI_COMMAND_MEMORY",
  2267. (command & PCI_COMMAND_MASTER) ? "" : " PCI_COMMAND_MASTER",
  2268. (command & PCI_COMMAND_PARITY) ? "" : " PCI_COMMAND_PARITY");
  2269. command |= PCI_COMMAND_BITS_TO_ENABLE;
  2270. pci_write_config_word(pdev, PCI_COMMAND, command);
  2271. }
  2272. #undef PCI_COMMAND_BITS_TO_ENABLE
  2273. /*
  2274.  *  If cache line size is not configured, suggest
  2275.  *  a value for well known CPUs.
  2276.  */
  2277. #if defined(__i386__) && !defined(MODULE)
  2278. if (!cache_line_size && boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) {
  2279. switch(boot_cpu_data.x86) {
  2280. case 4: suggested_cache_line_size = 4;   break;
  2281. case 6: if (boot_cpu_data.x86_model > 8) break;
  2282. case 5: suggested_cache_line_size = 8;   break;
  2283. }
  2284. }
  2285. #endif /* __i386__ */
  2286. /*
  2287.  *  Some features are required to be enabled in order to 
  2288.  *  work around some chip problems. :) ;)
  2289.  *  (ITEM 12 of a DEL about the 896 I haven't yet).
  2290.  *  We must ensure the chip will use WRITE AND INVALIDATE.
  2291.  *  The revision number limit is for now arbitrary.
  2292.  */
  2293. if (device_id == PCI_DEVICE_ID_NCR_53C896 && revision < 0x4) {
  2294. chip->features |= (FE_WRIE | FE_CLSE);
  2295. pci_fix_up |=  3; /* Force appropriate PCI fix-up */
  2296. }
  2297. #ifdef SYM_CONF_PCI_FIX_UP
  2298. /*
  2299.  *  Try to fix up PCI config according to wished features.
  2300.  */
  2301. if ((pci_fix_up & 1) && (chip->features & FE_CLSE) && 
  2302.     !cache_line_size && suggested_cache_line_size) {
  2303. cache_line_size = suggested_cache_line_size;
  2304. pci_write_config_byte(pdev,
  2305.       PCI_CACHE_LINE_SIZE, cache_line_size);
  2306. printf_info("%s: PCI_CACHE_LINE_SIZE set to %d.n",
  2307.             sym_name(device), cache_line_size);
  2308. }
  2309. if ((pci_fix_up & 2) && cache_line_size &&
  2310.     (chip->features & FE_WRIE) && !(command & PCI_COMMAND_INVALIDATE)) {
  2311. printf_info("%s: setting PCI_COMMAND_INVALIDATE.n",
  2312.             sym_name(device));
  2313. command |= PCI_COMMAND_INVALIDATE;
  2314. pci_write_config_word(pdev, PCI_COMMAND, command);
  2315. }
  2316. #endif /* SYM_CONF_PCI_FIX_UP */
  2317. /*
  2318.  *  Work around for errant bit in 895A. The 66Mhz
  2319.  *  capable bit is set erroneously. Clear this bit.
  2320.  *  (Item 1 DEL 533)
  2321.  *
  2322.  *  Make sure Config space and Features agree.
  2323.  *
  2324.  *  Recall: writes are not normal to status register -
  2325.  *  write a 1 to clear and a 0 to leave unchanged.
  2326.  *  Can only reset bits.
  2327.  */
  2328. pci_read_config_word(pdev, PCI_STATUS, &status_reg);
  2329. if (chip->features & FE_66MHZ) {
  2330. if (!(status_reg & PCI_STATUS_66MHZ))
  2331. chip->features &= ~FE_66MHZ;
  2332. }
  2333. else {
  2334. if (status_reg & PCI_STATUS_66MHZ) {
  2335. status_reg = PCI_STATUS_66MHZ;
  2336. pci_write_config_word(pdev, PCI_STATUS, status_reg);
  2337. pci_read_config_word(pdev, PCI_STATUS, &status_reg);
  2338. }
  2339. }
  2340.   /*
  2341.  *  Initialise device structure with items required by sym_attach.
  2342.  */
  2343. device->pdev = pdev;
  2344. device->s.bus = PciBusNumber(pdev);
  2345. device->s.device_fn = PciDeviceFn(pdev);
  2346. device->s.base = base;
  2347. device->s.base_2 = base_2;
  2348. device->s.base_c = base_c;
  2349. device->s.base_2_c = base_2_c;
  2350. device->s.io_port = io_port;
  2351. device->s.irq = irq;
  2352. device->attach_done = 0;
  2353. return 0;
  2354. }
  2355. /*
  2356.  *  List of supported NCR chip ids
  2357.  */
  2358. static u_short sym_chip_ids[] __initdata = {
  2359. PCI_ID_SYM53C810,
  2360. PCI_ID_SYM53C815,
  2361. PCI_ID_SYM53C825,
  2362. PCI_ID_SYM53C860,
  2363. PCI_ID_SYM53C875,
  2364. PCI_ID_SYM53C875_2,
  2365. PCI_ID_SYM53C885,
  2366. PCI_ID_SYM53C875A,
  2367. PCI_ID_SYM53C895,
  2368. PCI_ID_SYM53C896,
  2369. PCI_ID_SYM53C895A,
  2370. PCI_ID_LSI53C1510D,
  2371.   PCI_ID_LSI53C1010,
  2372.   PCI_ID_LSI53C1010_2
  2373. };
  2374. /*
  2375.  *  Detect all 53c8xx hosts and then attach them.
  2376.  *
  2377.  *  If we are using NVRAM, once all hosts are detected, we need to 
  2378.  *  check any NVRAM for boot order in case detect and boot order 
  2379.  *  differ and attach them using the order in the NVRAM.
  2380.  *
  2381.  *  If no NVRAM is found or data appears invalid attach boards in 
  2382.  *  the order they are detected.
  2383.  */
  2384. int __init sym53c8xx_detect(Scsi_Host_Template *tpnt)
  2385. {
  2386. pcidev_t pcidev;
  2387. int i, j, chips, hosts, count;
  2388. int attach_count = 0;
  2389. sym_device *devtbl, *devp;
  2390. sym_nvram  nvram;
  2391. #if SYM_CONF_NVRAM_SUPPORT
  2392. sym_nvram  nvram0, *nvp;
  2393. #endif
  2394. /*
  2395.  *  PCI is required.
  2396.  */
  2397. if (!pci_present())
  2398. return 0;
  2399. /*
  2400.  *    Initialize driver general stuff.
  2401.  */
  2402. #ifdef SYM_LINUX_PROC_INFO_SUPPORT
  2403. #if LINUX_VERSION_CODE < LinuxVersionCode(2,3,27)
  2404.      tpnt->proc_dir  = &proc_scsi_sym53c8xx;
  2405. #else
  2406.      tpnt->proc_name = NAME53C8XX;
  2407. #endif
  2408.      tpnt->proc_info = sym53c8xx_proc_info;
  2409. #endif
  2410. #ifdef SYM_LINUX_BOOT_COMMAND_LINE_SUPPORT
  2411. #ifdef MODULE
  2412. if (sym53c8xx)
  2413. sym53c8xx_setup(sym53c8xx);
  2414. #endif
  2415. #ifdef SYM_LINUX_DEBUG_CONTROL_SUPPORT
  2416. sym_debug_flags = sym_driver_setup.debug;
  2417. #endif
  2418. if (boot_verbose >= 2)
  2419. sym53c8xx_print_driver_setup();
  2420. #endif /* SYM_LINUX_BOOT_COMMAND_LINE_SUPPORT */
  2421. /*
  2422.  *  Allocate the device table since we donnot want to 
  2423.  *  overflow the kernel stack.
  2424.  *  1 x 4K PAGE is enough for more than 40 devices for i386.
  2425.  */
  2426. devtbl = sym_calloc(PAGE_SIZE, "DEVTBL");
  2427. if (!devtbl)
  2428. return 0;
  2429. /*
  2430.  *  Detect all NCR PQS/PDS memory controllers.
  2431.  */
  2432. #ifdef SYM_CONF_PQS_PDS_SUPPORT
  2433. sym_detect_pqs_pds();
  2434. #endif
  2435. /* 
  2436.  *  Detect all 53c8xx hosts.
  2437.  *  Save the first Symbios NVRAM content if any 
  2438.  *  for the boot order.
  2439.  */
  2440. chips = sizeof(sym_chip_ids) / sizeof(sym_chip_ids[0]);
  2441. hosts = PAGE_SIZE / sizeof(*devtbl);
  2442. #if SYM_CONF_NVRAM_SUPPORT
  2443. nvp = (sym_driver_setup.use_nvram & 0x1) ? &nvram0 : 0;
  2444. #endif
  2445. j = 0;
  2446. count = 0;
  2447. pcidev = PCIDEV_NULL;
  2448. while (1) {
  2449. char *msg = "";
  2450. if (count >= hosts)
  2451. break;
  2452. if (j >= chips)
  2453. break;
  2454. i = sym_driver_setup.reverse_probe ? chips - 1 - j : j;
  2455. pcidev = pci_find_device(PCI_VENDOR_ID_NCR, sym_chip_ids[i],
  2456.  pcidev);
  2457. if (pcidev == PCIDEV_NULL) {
  2458. ++j;
  2459. continue;
  2460. }
  2461. /* This one is guaranteed by AC to do nothing :-) */
  2462. if (pci_enable_device(pcidev))
  2463. continue;
  2464. /* Some HW as the HP LH4 may report twice PCI devices */
  2465. for (i = 0; i < count ; i++) {
  2466. if (devtbl[i].s.bus       == PciBusNumber(pcidev) && 
  2467.     devtbl[i].s.device_fn == PciDeviceFn(pcidev))
  2468. break;
  2469. }
  2470. if (i != count) /* Ignore this device if we already have it */
  2471. continue;
  2472. devp = &devtbl[count];
  2473. devp->host_id = SYM_SETUP_HOST_ID;
  2474. devp->attach_done = 0;
  2475. if (sym53c8xx_pci_init(tpnt, pcidev, devp)) {
  2476. continue;
  2477. }
  2478. ++count;
  2479. #if SYM_CONF_NVRAM_SUPPORT
  2480. if (nvp) {
  2481. sym_get_nvram(devp, nvp);
  2482. switch(nvp->type) {
  2483. case SYM_SYMBIOS_NVRAM:
  2484. /*
  2485.  *   Switch to the other nvram buffer, so that 
  2486.  *   nvram0 will contain the first Symbios 
  2487.  *   format NVRAM content with boot order.
  2488.  */
  2489. nvp = &nvram;
  2490. msg = "with Symbios NVRAM";
  2491. break;
  2492. case SYM_TEKRAM_NVRAM:
  2493. msg = "with Tekram NVRAM";
  2494. break;
  2495. }
  2496. }
  2497. #endif
  2498. #ifdef SYM_CONF_PQS_PDS_SUPPORT
  2499. /*
  2500.  *  Match the BUS number for PQS/PDS devices.
  2501.  *  Read the SCSI ID from a special register mapped
  2502.  *  into the configuration space of the individual
  2503.  *  875s.  This register is set up by the PQS bios
  2504.  */
  2505. for(i = 0; i < SYM_CONF_MAX_PQS_BUS && pqs_bus[i] != -1; i++) {
  2506. u_char tmp;
  2507. if (pqs_bus[i] == PciBusNumber(pcidev)) {
  2508. pci_read_config_byte(pcidev, 0x84, &tmp);
  2509. devp->pqs_pds = 1;
  2510. devp->host_id = tmp;
  2511. break;
  2512. }
  2513. }
  2514. if (devp->pqs_pds)
  2515. msg = "(NCR PQS/PDS)";
  2516. #endif
  2517. if (boot_verbose)
  2518. printf_info("%s: 53c%s detected %sn",
  2519.             sym_name(devp), devp->chip.name, msg);
  2520. }
  2521. /*
  2522.  *  If we have found a SYMBIOS NVRAM, use first the NVRAM boot 
  2523.  *  sequence as device boot order.
  2524.  *  check devices in the boot record against devices detected. 
  2525.  *  attach devices if we find a match. boot table records that 
  2526.  *  do not match any detected devices will be ignored. 
  2527.  *  devices that do not match any boot table will not be attached
  2528.  *  here but will attempt to be attached during the device table 
  2529.  *  rescan.
  2530.  */
  2531. #if SYM_CONF_NVRAM_SUPPORT
  2532. if (!nvp || nvram0.type != SYM_SYMBIOS_NVRAM)
  2533. goto next;
  2534. for (i = 0; i < 4; i++) {
  2535. Symbios_host *h = &nvram0.data.Symbios.host[i];
  2536. for (j = 0 ; j < count ; j++) {
  2537. devp = &devtbl[j];
  2538. if (h->device_fn != devp->s.device_fn ||
  2539.     h->bus_nr  != devp->s.bus  ||
  2540.     h->device_id != devp->chip.device_id)
  2541. continue;
  2542. if (devp->attach_done)
  2543. continue;
  2544. if (h->flags & SYMBIOS_INIT_SCAN_AT_BOOT) {
  2545. sym_get_nvram(devp, nvp);
  2546. if (!sym_attach (tpnt, attach_count, devp))
  2547. attach_count++;
  2548. }
  2549. else if (!(sym_driver_setup.use_nvram & 0x80))
  2550. printf_info(
  2551.       "%s: 53c%s state OFF thus not attachedn",
  2552.       sym_name(devp), devp->chip.name);
  2553. else
  2554. continue;
  2555. devp->attach_done = 1;
  2556. break;
  2557. }
  2558. }
  2559. next:
  2560. #endif
  2561. /* 
  2562.  *  Rescan device list to make sure all boards attached.
  2563.  *  Devices without boot records will not be attached yet
  2564.  *  so try to attach them here.
  2565.  */
  2566. for (i= 0; i < count; i++) {
  2567. devp = &devtbl[i];
  2568. if (!devp->attach_done) {
  2569. devp->nvram = &nvram;
  2570. nvram.type = 0;
  2571. #if SYM_CONF_NVRAM_SUPPORT
  2572. sym_get_nvram(devp, nvp);
  2573. #endif
  2574. if (!sym_attach (tpnt, attach_count, devp))
  2575. attach_count++;
  2576. }
  2577. }
  2578. sym_mfree(devtbl, PAGE_SIZE, "DEVTBL");
  2579. return attach_count;
  2580. }
  2581. #ifdef MODULE
  2582. /*
  2583.  *  Linux release module stuff.
  2584.  *
  2585.  *  Called before unloading the module.
  2586.  *  Detach the host.
  2587.  *  We have to free resources and halt the NCR chip.
  2588.  *
  2589.  */
  2590. static int sym_detach(hcb_p np)
  2591. {
  2592. printk("%s: detaching ...n", sym_name(np));
  2593. /*
  2594.  *  Try to delete the timer.
  2595.  *  In the unlikely situation where this failed,
  2596.  *  try to synchronize with the timer handler.
  2597.  */
  2598. #if LINUX_VERSION_CODE < LinuxVersionCode(2, 4, 0)
  2599. np->s.release_stage = 1;
  2600. if (!del_timer(&np->s.timer)) {
  2601. int i = 1000;
  2602. int k = 1;
  2603. while (1) {
  2604. u_long flags;
  2605. SYM_LOCK_HCB(np, flags);
  2606. k = np->s.release_stage;
  2607. SYM_UNLOCK_HCB(np, flags);
  2608. if (k == 2 || !--i)
  2609. break;
  2610. MDELAY(5);
  2611. }
  2612. if (!i)
  2613. printk("%s: failed to kill timer!n", sym_name(np));
  2614. }
  2615. np->s.release_stage = 2;
  2616. #else
  2617. (void)del_timer_sync(&np->s.timer);
  2618. #endif
  2619. /*
  2620.  *  Reset NCR chip.
  2621.  *  We should use sym_soft_reset(), but we donnot want to do 
  2622.  *  so, since we may not be safe if interrupts occur.
  2623.  */
  2624. printk("%s: resetting chipn", sym_name(np));
  2625. OUTB (nc_istat, SRST);
  2626. UDELAY (10);
  2627. OUTB (nc_istat, 0);
  2628. /*
  2629.  *  Free host resources
  2630.  */
  2631. sym_free_resources(np);
  2632. return 1;
  2633. }
  2634. int sym53c8xx_release(struct Scsi_Host *host)
  2635. {
  2636.      sym_detach(((struct host_data *) host->hostdata)->ncb);
  2637.      return 0;
  2638. }
  2639. #endif /* MODULE */
  2640. /*
  2641.  * For bigots to keep silent. :)
  2642.  */
  2643. #ifdef MODULE_LICENSE
  2644. MODULE_LICENSE("Dual BSD/GPL");
  2645. #endif
  2646. /*
  2647.  * Driver host template.
  2648.  */
  2649. #if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0)
  2650. static
  2651. #endif
  2652. #if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) || defined(MODULE)
  2653. Scsi_Host_Template driver_template = SYM53C8XX;
  2654. #include "../scsi_module.c"
  2655. #endif