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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* cyberstorm.c: Driver for CyberStorm SCSI Controller.
  2.  *
  3.  * Copyright (C) 1996 Jesper Skov (jskov@cygnus.co.uk)
  4.  *
  5.  * The CyberStorm SCSI driver is based on David S. Miller's ESP driver
  6.  * for the Sparc computers. 
  7.  * 
  8.  * This work was made possible by Phase5 who willingly (and most generously)
  9.  * supported me with hardware and all the information I needed.
  10.  */
  11. /* TODO:
  12.  *
  13.  * 1) Figure out how to make a cleaner merge with the sparc driver with regard
  14.  *    to the caches and the Sparc MMU mapping.
  15.  * 2) Make as few routines required outside the generic driver. A lot of the
  16.  *    routines in this file used to be inline!
  17.  */
  18. #include <linux/module.h>
  19. #include <linux/init.h>
  20. #include <linux/kernel.h>
  21. #include <linux/delay.h>
  22. #include <linux/types.h>
  23. #include <linux/string.h>
  24. #include <linux/slab.h>
  25. #include <linux/blk.h>
  26. #include <linux/proc_fs.h>
  27. #include <linux/stat.h>
  28. #include "scsi.h"
  29. #include "hosts.h"
  30. #include "NCR53C9x.h"
  31. #include "cyberstorm.h"
  32. #include <linux/zorro.h>
  33. #include <asm/irq.h>
  34. #include <asm/amigaints.h>
  35. #include <asm/amigahw.h>
  36. #include <asm/pgtable.h>
  37. static int  dma_bytes_sent(struct NCR_ESP *esp, int fifo_count);
  38. static int  dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd *sp);
  39. static void dma_dump_state(struct NCR_ESP *esp);
  40. static void dma_init_read(struct NCR_ESP *esp, __u32 addr, int length);
  41. static void dma_init_write(struct NCR_ESP *esp, __u32 addr, int length);
  42. static void dma_ints_off(struct NCR_ESP *esp);
  43. static void dma_ints_on(struct NCR_ESP *esp);
  44. static int  dma_irq_p(struct NCR_ESP *esp);
  45. static void dma_led_off(struct NCR_ESP *esp);
  46. static void dma_led_on(struct NCR_ESP *esp);
  47. static int  dma_ports_p(struct NCR_ESP *esp);
  48. static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write);
  49. static unsigned char ctrl_data = 0; /* Keep backup of the stuff written
  50.  * to ctrl_reg. Always write a copy
  51.  * to this register when writing to
  52.  * the hardware register!
  53.  */
  54. static volatile unsigned char cmd_buffer[16];
  55. /* This is where all commands are put
  56.  * before they are transferred to the ESP chip
  57.  * via PIO.
  58.  */
  59. /***************************************************************** Detection */
  60. int __init cyber_esp_detect(Scsi_Host_Template *tpnt)
  61. {
  62. struct NCR_ESP *esp;
  63. struct zorro_dev *z = NULL;
  64. unsigned long address;
  65. while ((z = zorro_find_device(ZORRO_WILDCARD, z))) {
  66.     unsigned long board = z->resource.start;
  67.     if ((z->id == ZORRO_PROD_PHASE5_BLIZZARD_1220_CYBERSTORM ||
  68.  z->id == ZORRO_PROD_PHASE5_BLIZZARD_1230_II_FASTLANE_Z3_CYBERSCSI_CYBERSTORM060) &&
  69. request_mem_region(board+CYBER_ESP_ADDR,
  70.         sizeof(struct ESP_regs), "NCR53C9x")) {
  71. /* Figure out if this is a CyberStorm or really a 
  72.  * Fastlane/Blizzard Mk II by looking at the board size.
  73.  * CyberStorm maps 64kB
  74.  * (ZORRO_PROD_PHASE5_BLIZZARD_1220_CYBERSTORM does anyway)
  75.  */
  76. if(z->resource.end-board != 0xffff) {
  77. release_mem_region(board+CYBER_ESP_ADDR,
  78.    sizeof(struct ESP_regs));
  79. return 0;
  80. }
  81. esp = esp_allocate(tpnt, (void *)board+CYBER_ESP_ADDR);
  82. /* Do command transfer with programmed I/O */
  83. esp->do_pio_cmds = 1;
  84. /* Required functions */
  85. esp->dma_bytes_sent = &dma_bytes_sent;
  86. esp->dma_can_transfer = &dma_can_transfer;
  87. esp->dma_dump_state = &dma_dump_state;
  88. esp->dma_init_read = &dma_init_read;
  89. esp->dma_init_write = &dma_init_write;
  90. esp->dma_ints_off = &dma_ints_off;
  91. esp->dma_ints_on = &dma_ints_on;
  92. esp->dma_irq_p = &dma_irq_p;
  93. esp->dma_ports_p = &dma_ports_p;
  94. esp->dma_setup = &dma_setup;
  95. /* Optional functions */
  96. esp->dma_barrier = 0;
  97. esp->dma_drain = 0;
  98. esp->dma_invalidate = 0;
  99. esp->dma_irq_entry = 0;
  100. esp->dma_irq_exit = 0;
  101. esp->dma_led_on = &dma_led_on;
  102. esp->dma_led_off = &dma_led_off;
  103. esp->dma_poll = 0;
  104. esp->dma_reset = 0;
  105. /* SCSI chip speed */
  106. esp->cfreq = 40000000;
  107. /* The DMA registers on the CyberStorm are mapped
  108.  * relative to the device (i.e. in the same Zorro
  109.  * I/O block).
  110.  */
  111. address = (unsigned long)ZTWO_VADDR(board);
  112. esp->dregs = (void *)(address + CYBER_DMA_ADDR);
  113. /* ESP register base */
  114. esp->eregs = (struct ESP_regs *)(address + CYBER_ESP_ADDR);
  115. /* Set the command buffer */
  116. esp->esp_command = (volatile unsigned char*) cmd_buffer;
  117. esp->esp_command_dvma = virt_to_bus(cmd_buffer);
  118. esp->irq = IRQ_AMIGA_PORTS;
  119. request_irq(IRQ_AMIGA_PORTS, esp_intr, SA_SHIRQ,
  120.     "CyberStorm SCSI", esp_intr);
  121. /* Figure out our scsi ID on the bus */
  122. /* The DMA cond flag contains a hardcoded jumper bit
  123.  * which can be used to select host number 6 or 7.
  124.  * However, even though it may change, we use a hardcoded
  125.  * value of 7.
  126.  */
  127. esp->scsi_id = 7;
  128. /* We don't have a differential SCSI-bus. */
  129. esp->diff = 0;
  130. esp_initialize(esp);
  131. printk("ESP: Total of %d ESP hosts found, %d actually in use.n", nesps, esps_in_use);
  132. esps_running = esps_in_use;
  133. return esps_in_use;
  134.     }
  135. }
  136. return 0;
  137. }
  138. /************************************************************* DMA Functions */
  139. static int dma_bytes_sent(struct NCR_ESP *esp, int fifo_count)
  140. {
  141. /* Since the CyberStorm DMA is fully dedicated to the ESP chip,
  142.  * the number of bytes sent (to the ESP chip) equals the number
  143.  * of bytes in the FIFO - there is no buffering in the DMA controller.
  144.  * XXXX Do I read this right? It is from host to ESP, right?
  145.  */
  146. return fifo_count;
  147. }
  148. static int dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd *sp)
  149. {
  150. /* I don't think there's any limit on the CyberDMA. So we use what
  151.  * the ESP chip can handle (24 bit).
  152.  */
  153. unsigned long sz = sp->SCp.this_residual;
  154. if(sz > 0x1000000)
  155. sz = 0x1000000;
  156. return sz;
  157. }
  158. static void dma_dump_state(struct NCR_ESP *esp)
  159. {
  160. ESPLOG(("esp%d: dma -- cond_reg<%02x>n",
  161. esp->esp_id, ((struct cyber_dma_registers *)
  162.       (esp->dregs))->cond_reg));
  163. ESPLOG(("intreq:<%04x>, intena:<%04x>n",
  164. custom.intreqr, custom.intenar));
  165. }
  166. static void dma_init_read(struct NCR_ESP *esp, __u32 addr, int length)
  167. {
  168. struct cyber_dma_registers *dregs = 
  169. (struct cyber_dma_registers *) esp->dregs;
  170. cache_clear(addr, length);
  171. addr &= ~(1);
  172. dregs->dma_addr0 = (addr >> 24) & 0xff;
  173. dregs->dma_addr1 = (addr >> 16) & 0xff;
  174. dregs->dma_addr2 = (addr >>  8) & 0xff;
  175. dregs->dma_addr3 = (addr      ) & 0xff;
  176. ctrl_data &= ~(CYBER_DMA_WRITE);
  177. /* Check if physical address is outside Z2 space and of
  178.  * block length/block aligned in memory. If this is the
  179.  * case, enable 32 bit transfer. In all other cases, fall back
  180.  * to 16 bit transfer.
  181.  * Obviously 32 bit transfer should be enabled if the DMA address
  182.  * and length are 32 bit aligned. However, this leads to some
  183.  * strange behavior. Even 64 bit aligned addr/length fails.
  184.  * Until I've found a reason for this, 32 bit transfer is only
  185.  * used for full-block transfers (1kB).
  186.  * -jskov
  187.  */
  188. #if 0
  189. if((addr & 0x3fc) || length & 0x3ff || ((addr > 0x200000) &&
  190. (addr < 0xff0000)))
  191. ctrl_data &= ~(CYBER_DMA_Z3); /* Z2, do 16 bit DMA */
  192. else
  193. ctrl_data |= CYBER_DMA_Z3; /* CHIP/Z3, do 32 bit DMA */
  194. #else
  195. ctrl_data &= ~(CYBER_DMA_Z3); /* Z2, do 16 bit DMA */
  196. #endif
  197. dregs->ctrl_reg = ctrl_data;
  198. }
  199. static void dma_init_write(struct NCR_ESP *esp, __u32 addr, int length)
  200. {
  201. struct cyber_dma_registers *dregs = 
  202. (struct cyber_dma_registers *) esp->dregs;
  203. cache_push(addr, length);
  204. addr |= 1;
  205. dregs->dma_addr0 = (addr >> 24) & 0xff;
  206. dregs->dma_addr1 = (addr >> 16) & 0xff;
  207. dregs->dma_addr2 = (addr >>  8) & 0xff;
  208. dregs->dma_addr3 = (addr      ) & 0xff;
  209. ctrl_data |= CYBER_DMA_WRITE;
  210. /* See comment above */
  211. #if 0
  212. if((addr & 0x3fc) || length & 0x3ff || ((addr > 0x200000) &&
  213. (addr < 0xff0000)))
  214. ctrl_data &= ~(CYBER_DMA_Z3); /* Z2, do 16 bit DMA */
  215. else
  216. ctrl_data |= CYBER_DMA_Z3; /* CHIP/Z3, do 32 bit DMA */
  217. #else
  218. ctrl_data &= ~(CYBER_DMA_Z3); /* Z2, do 16 bit DMA */
  219. #endif
  220. dregs->ctrl_reg = ctrl_data;
  221. }
  222. static void dma_ints_off(struct NCR_ESP *esp)
  223. {
  224. disable_irq(esp->irq);
  225. }
  226. static void dma_ints_on(struct NCR_ESP *esp)
  227. {
  228. enable_irq(esp->irq);
  229. }
  230. static int dma_irq_p(struct NCR_ESP *esp)
  231. {
  232. /* It's important to check the DMA IRQ bit in the correct way! */
  233. return ((esp_read(esp->eregs->esp_status) & ESP_STAT_INTR) &&
  234. ((((struct cyber_dma_registers *)(esp->dregs))->cond_reg) &
  235.  CYBER_DMA_HNDL_INTR));
  236. }
  237. static void dma_led_off(struct NCR_ESP *esp)
  238. {
  239. ctrl_data &= ~CYBER_DMA_LED;
  240. ((struct cyber_dma_registers *)(esp->dregs))->ctrl_reg = ctrl_data;
  241. }
  242. static void dma_led_on(struct NCR_ESP *esp)
  243. {
  244. ctrl_data |= CYBER_DMA_LED;
  245. ((struct cyber_dma_registers *)(esp->dregs))->ctrl_reg = ctrl_data;
  246. }
  247. static int dma_ports_p(struct NCR_ESP *esp)
  248. {
  249. return ((custom.intenar) & IF_PORTS);
  250. }
  251. static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write)
  252. {
  253. /* On the Sparc, DMA_ST_WRITE means "move data from device to memory"
  254.  * so when (write) is true, it actually means READ!
  255.  */
  256. if(write){
  257. dma_init_read(esp, addr, count);
  258. } else {
  259. dma_init_write(esp, addr, count);
  260. }
  261. }
  262. #define HOSTS_C
  263. #include "cyberstorm.h"
  264. static Scsi_Host_Template driver_template = SCSI_CYBERSTORM;
  265. #include "scsi_module.c"
  266. int cyber_esp_release(struct Scsi_Host *instance)
  267. {
  268. #ifdef MODULE
  269. unsigned long address = (unsigned long)((struct NCR_ESP *)instance->hostdata)->edev;
  270. esp_deallocate((struct NCR_ESP *)instance->hostdata);
  271. esp_release();
  272. release_mem_region(address, sizeof(struct ESP_regs));
  273. free_irq(IRQ_AMIGA_PORTS, esp_intr);
  274. #endif
  275. return 1;
  276. }
  277. MODULE_LICENSE("GPL");