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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * dec_esp.c: Driver for SCSI chips on IOASIC based TURBOchannel DECstations
  3.  *            and TURBOchannel PMAZ-A cards
  4.  *
  5.  * TURBOchannel changes by Harald Koerfgen
  6.  * PMAZ-A support by David Airlie
  7.  *
  8.  * based on jazz_esp.c:
  9.  * Copyright (C) 1997 Thomas Bogendoerfer (tsbogend@alpha.franken.de)
  10.  *
  11.  * jazz_esp is based on David S. Miller's ESP driver and cyber_esp
  12.  *
  13.  * 20000819 - Small PMAZ-AA fixes by Florian Lohoff <flo@rfc822.org>
  14.  *            Be warned the PMAZ-AA works currently as a single card.
  15.  *            Dont try to put multiple cards in one machine - They are
  16.  *            both detected but it may crash under high load garbling your
  17.  *            data.
  18.  * 20001005 - Initialization fixes for 2.4.0-test9
  19.  *    Florian Lohoff <flo@rfc822.org>
  20.  */
  21. #include <linux/kernel.h>
  22. #include <linux/delay.h>
  23. #include <linux/types.h>
  24. #include <linux/string.h>
  25. #include <linux/slab.h>
  26. #include <linux/blk.h>
  27. #include <linux/proc_fs.h>
  28. #include <linux/stat.h>
  29. #include "scsi.h"
  30. #include "hosts.h"
  31. #include "NCR53C9x.h"
  32. #include "dec_esp.h"
  33. #include <asm/irq.h>
  34. #include <asm/jazz.h>
  35. #include <asm/jazzdma.h>
  36. #include <asm/dma.h>
  37. #include <asm/pgtable.h>
  38. #include <asm/dec/tc.h>
  39. #include <asm/dec/interrupts.h>
  40. #include <asm/dec/ioasic_addrs.h>
  41. #include <asm/dec/ioasic_ints.h>
  42. #include <asm/dec/machtype.h>
  43. #include <asm/system.h>
  44. /*
  45.  * Once upon a time the pmaz code used to be working but
  46.  * it hasn't been maintained for quite some time.
  47.  * It isn't working anymore but I'll leave here as a
  48.  * starting point. #define this an be prepared for tons
  49.  * of warnings and errors :)
  50.  */
  51. static int  dma_bytes_sent(struct NCR_ESP *esp, int fifo_count);
  52. static void dma_drain(struct NCR_ESP *esp);
  53. static int  dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd * sp);
  54. static void dma_dump_state(struct NCR_ESP *esp);
  55. static void dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length);
  56. static void dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length);
  57. static void dma_ints_off(struct NCR_ESP *esp);
  58. static void dma_ints_on(struct NCR_ESP *esp);
  59. static int  dma_irq_p(struct NCR_ESP *esp);
  60. static int  dma_ports_p(struct NCR_ESP *esp);
  61. static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write);
  62. static void dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp);
  63. static void dma_mmu_get_scsi_sgl(struct NCR_ESP *esp, Scsi_Cmnd * sp);
  64. static void dma_advance_sg(Scsi_Cmnd * sp);
  65. static void pmaz_dma_drain(struct NCR_ESP *esp);
  66. static void pmaz_dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length);
  67. static void pmaz_dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length);
  68. static void pmaz_dma_ints_off(struct NCR_ESP *esp);
  69. static void pmaz_dma_ints_on(struct NCR_ESP *esp);
  70. static void pmaz_dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write);
  71. static void pmaz_dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp);
  72. #define TC_ESP_RAM_SIZE 0x20000
  73. #define ESP_TGT_DMA_SIZE ((TC_ESP_RAM_SIZE/7) & ~(sizeof(int)-1))
  74. #define ESP_NCMD 7
  75. #define TC_ESP_DMAR_MASK  0x1ffff
  76. #define TC_ESP_DMAR_WRITE 0x80000000
  77. #define TC_ESP_DMA_ADDR(x) ((unsigned)(x) & TC_ESP_DMAR_MASK)
  78. __u32 esp_virt_buffer;
  79. int scsi_current_length;
  80. volatile unsigned char cmd_buffer[16];
  81. volatile unsigned char pmaz_cmd_buffer[16];
  82. /* This is where all commands are put
  83.  * before they are trasfered to the ESP chip
  84.  * via PIO.
  85.  */
  86. volatile unsigned long *scsi_dma_ptr;
  87. volatile unsigned long *scsi_next_ptr;
  88. volatile unsigned long *scsi_scr;
  89. volatile unsigned long *ioasic_ssr;
  90. volatile unsigned long *scsi_sdr0;
  91. volatile unsigned long *scsi_sdr1;
  92. static void scsi_dma_merr_int(int, void *, struct pt_regs *);
  93. static void scsi_dma_err_int(int, void *, struct pt_regs *);
  94. static void scsi_dma_int(int, void *, struct pt_regs *);
  95. static Scsi_Host_Template driver_template = SCSI_DEC_ESP;
  96. #include "scsi_module.c"
  97. /***************************************************************** Detection */
  98. int dec_esp_detect(Scsi_Host_Template * tpnt)
  99. {
  100. struct NCR_ESP *esp;
  101. struct ConfigDev *esp_dev;
  102. int slot;
  103. unsigned long mem_start;
  104. if (IOASIC) {
  105. esp_dev = 0;
  106. esp = esp_allocate(tpnt, (void *) esp_dev);
  107. scsi_dma_ptr = (unsigned long *) (system_base + IOCTL + SCSI_DMA_P);
  108. scsi_next_ptr = (unsigned long *) (system_base + IOCTL + SCSI_DMA_BP);
  109. scsi_scr = (unsigned long *) (system_base + IOCTL + SCSI_SCR);
  110. ioasic_ssr = (unsigned long *) (system_base + IOCTL + SSR);
  111. scsi_sdr0 = (unsigned long *) (system_base + IOCTL + SCSI_SDR0);
  112. scsi_sdr1 = (unsigned long *) (system_base + IOCTL + SCSI_SDR1);
  113. /* Do command transfer with programmed I/O */
  114. esp->do_pio_cmds = 1;
  115. /* Required functions */
  116. esp->dma_bytes_sent = &dma_bytes_sent;
  117. esp->dma_can_transfer = &dma_can_transfer;
  118. esp->dma_dump_state = &dma_dump_state;
  119. esp->dma_init_read = &dma_init_read;
  120. esp->dma_init_write = &dma_init_write;
  121. esp->dma_ints_off = &dma_ints_off;
  122. esp->dma_ints_on = &dma_ints_on;
  123. esp->dma_irq_p = &dma_irq_p;
  124. esp->dma_ports_p = &dma_ports_p;
  125. esp->dma_setup = &dma_setup;
  126. /* Optional functions */
  127. esp->dma_barrier = 0;
  128. esp->dma_drain = &dma_drain;
  129. esp->dma_invalidate = 0;
  130. esp->dma_irq_entry = 0;
  131. esp->dma_irq_exit = 0;
  132. esp->dma_poll = 0;
  133. esp->dma_reset = 0;
  134. esp->dma_led_off = 0;
  135. esp->dma_led_on = 0;
  136. /* virtual DMA functions */
  137. esp->dma_mmu_get_scsi_one = &dma_mmu_get_scsi_one;
  138. esp->dma_mmu_get_scsi_sgl = &dma_mmu_get_scsi_sgl;
  139. esp->dma_mmu_release_scsi_one = 0;
  140. esp->dma_mmu_release_scsi_sgl = 0;
  141. esp->dma_advance_sg = &dma_advance_sg;
  142. /* SCSI chip speed */
  143. esp->cfreq = 25000000;
  144. /*
  145.  * we don't give the address of DMA channel, but the number
  146.  * of DMA channel, so we can use the jazz DMA functions
  147.  *
  148.  */
  149. esp->dregs = JAZZ_SCSI_DMA;
  150. /* ESP register base */
  151. esp->eregs = (struct ESP_regs *) (system_base + SCSI);
  152. /* Set the command buffer */
  153. esp->esp_command = (volatile unsigned char *) cmd_buffer;
  154. /* get virtual dma address for command buffer */
  155. esp->esp_command_dvma = (__u32) KSEG1ADDR((volatile unsigned char *) cmd_buffer);
  156. esp->irq = dec_interrupt[DEC_IRQ_ASC];
  157. esp->scsi_id = 7;
  158. /* Check for differential SCSI-bus */
  159. esp->diff = 0;
  160. esp_initialize(esp);
  161. if (request_irq(esp->irq, esp_intr, SA_INTERRUPT, 
  162. "ncr53c94", NULL))
  163. goto err_dealloc;
  164. if (request_irq(dec_interrupt[DEC_IRQ_ASC_MERR],
  165. scsi_dma_merr_int, SA_INTERRUPT, 
  166. "ncr53c94 error", NULL))
  167. goto err_free_irq;
  168. if (request_irq(dec_interrupt[DEC_IRQ_ASC_ERR],
  169. scsi_dma_err_int, SA_INTERRUPT, 
  170. "ncr53c94 overrun", NULL))
  171. goto err_free_irq_merr;
  172. if (request_irq(dec_interrupt[DEC_IRQ_ASC_DMA],
  173. scsi_dma_int, SA_INTERRUPT, 
  174. "ncr53c94 dma", NULL))
  175. goto err_free_irq_err;
  176.  
  177. }
  178. if (TURBOCHANNEL) {
  179. while ((slot = search_tc_card("PMAZ-AA")) >= 0) {
  180. claim_tc_card(slot);
  181. esp_dev = 0;
  182. esp = esp_allocate(tpnt, (void *) esp_dev);
  183. mem_start = get_tc_base_addr(slot);
  184. /* Store base addr into esp struct */
  185. esp->slot = mem_start;
  186. esp->dregs = 0;
  187. esp->eregs = (struct ESP_regs *) (mem_start + DEC_SCSI_SREG);
  188. esp->do_pio_cmds = 1;
  189. /* Set the command buffer */
  190. esp->esp_command = (volatile unsigned char *) pmaz_cmd_buffer;
  191. /* get virtual dma address for command buffer */
  192. esp->esp_command_dvma = (__u32) KSEG0ADDR((volatile unsigned char *) pmaz_cmd_buffer);
  193. esp->cfreq = get_tc_speed();
  194. esp->irq = get_tc_irq_nr(slot);
  195. /* Required functions */
  196. esp->dma_bytes_sent = &dma_bytes_sent;
  197. esp->dma_can_transfer = &dma_can_transfer;
  198. esp->dma_dump_state = &dma_dump_state;
  199. esp->dma_init_read = &pmaz_dma_init_read;
  200. esp->dma_init_write = &pmaz_dma_init_write;
  201. esp->dma_ints_off = &pmaz_dma_ints_off;
  202. esp->dma_ints_on = &pmaz_dma_ints_on;
  203. esp->dma_irq_p = &dma_irq_p;
  204. esp->dma_ports_p = &dma_ports_p;
  205. esp->dma_setup = &pmaz_dma_setup;
  206. /* Optional functions */
  207. esp->dma_barrier = 0;
  208. esp->dma_drain = &pmaz_dma_drain;
  209. esp->dma_invalidate = 0;
  210. esp->dma_irq_entry = 0;
  211. esp->dma_irq_exit = 0;
  212. esp->dma_poll = 0;
  213. esp->dma_reset = 0;
  214. esp->dma_led_off = 0;
  215. esp->dma_led_on = 0;
  216. esp->dma_mmu_get_scsi_one = pmaz_dma_mmu_get_scsi_one;
  217. esp->dma_mmu_get_scsi_sgl = 0;
  218. esp->dma_mmu_release_scsi_one = 0;
  219. esp->dma_mmu_release_scsi_sgl = 0;
  220. esp->dma_advance_sg = 0;
  221.   if (request_irq(esp->irq, esp_intr, SA_INTERRUPT, 
  222.    "PMAZ_AA", NULL)) {
  223.   esp_deallocate(esp);
  224.   release_tc_card(slot);
  225.   continue;
  226.   }
  227. esp->scsi_id = 7;
  228. esp->diff = 0;
  229. esp_initialize(esp);
  230. }
  231. }
  232. if(nesps) {
  233. printk("ESP: Total of %d ESP hosts found, %d actually in use.n", nesps, esps_in_use);
  234. esps_running = esps_in_use;
  235. return esps_in_use;
  236. }
  237. return 0;
  238. err_free_irq_err:
  239. free_irq(dec_interrupt[DEC_IRQ_ASC_ERR], scsi_dma_err_int);
  240. err_free_irq_merr:
  241. free_irq(dec_interrupt[DEC_IRQ_ASC_MERR], scsi_dma_merr_int);
  242. err_free_irq:
  243. free_irq(esp->irq, esp_intr);
  244. err_dealloc:
  245. esp_deallocate(esp);
  246. return 0;
  247. }
  248. /************************************************************* DMA Functions */
  249. static void scsi_dma_merr_int(int irq, void *dev_id, struct pt_regs *regs)
  250. {
  251. printk("Got unexpected SCSI DMA Interrupt! < ");
  252. printk("SCSI_DMA_MEMRDERR ");
  253. printk(">n");
  254. }
  255. static void scsi_dma_err_int(int irq, void *dev_id, struct pt_regs *regs)
  256. {
  257. /* empty */
  258. }
  259. static void scsi_dma_int(int irq, void *dev_id, struct pt_regs *regs)
  260. {
  261. /* next page */
  262. *scsi_next_ptr = ((*scsi_dma_ptr + PAGE_SIZE) & PAGE_MASK) << 3;
  263. fast_iob();
  264. }
  265. static int dma_bytes_sent(struct NCR_ESP *esp, int fifo_count)
  266. {
  267.     return fifo_count;
  268. }
  269. static void dma_drain(struct NCR_ESP *esp)
  270. {
  271. unsigned long nw = *scsi_scr;
  272. unsigned short *p = KSEG1ADDR((unsigned short *) ((*scsi_dma_ptr) >> 3));
  273.     /*
  274.  * Is there something in the dma buffers left?
  275.      */
  276. if (nw) {
  277. switch (nw) {
  278. case 1:
  279. *p = (unsigned short) *scsi_sdr0;
  280. break;
  281. case 2:
  282. *p++ = (unsigned short) (*scsi_sdr0);
  283. *p = (unsigned short) ((*scsi_sdr0) >> 16);
  284. break;
  285. case 3:
  286. *p++ = (unsigned short) (*scsi_sdr0);
  287. *p++ = (unsigned short) ((*scsi_sdr0) >> 16);
  288. *p = (unsigned short) (*scsi_sdr1);
  289. break;
  290. default:
  291. printk("Strange: %d words in dma buffer leftn", (int) nw);
  292. break;
  293. }
  294. }
  295. }
  296. static int dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd * sp)
  297. {
  298. return sp->SCp.this_residual;;
  299. }
  300. static void dma_dump_state(struct NCR_ESP *esp)
  301. {
  302. /*
  303.     ESPLOG(("esp%d: dma -- enable <%08x> residue <%08xn",
  304.     esp->esp_id, vdma_get_enable((int)esp->dregs), vdma_get_resdiue((int)esp->dregs)));
  305.  */
  306. }
  307. static void dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length)
  308. {
  309. if (vaddress & 3)
  310. panic("dec_efs.c: unable to handle partial word transfers, yet...");
  311. dma_cache_wback_inv((unsigned long) phys_to_virt(vaddress), length);
  312. *ioasic_ssr &= ~SCSI_DMA_EN;
  313. *scsi_scr = 0;
  314. *scsi_dma_ptr = vaddress << 3;
  315. /* prepare for next page */
  316. *scsi_next_ptr = ((vaddress + PAGE_SIZE) & PAGE_MASK) << 3;
  317. *ioasic_ssr |= (SCSI_DMA_DIR | SCSI_DMA_EN);
  318. fast_iob();
  319. }
  320. static void dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length)
  321. {
  322. if (vaddress & 3)
  323. panic("dec_efs.c: unable to handle partial word transfers, yet...");
  324. dma_cache_wback_inv((unsigned long) phys_to_virt(vaddress), length);
  325. *ioasic_ssr &= ~(SCSI_DMA_DIR | SCSI_DMA_EN);
  326. *scsi_scr = 0;
  327. *scsi_dma_ptr = vaddress << 3;
  328. /* prepare for next page */
  329. *scsi_next_ptr = ((vaddress + PAGE_SIZE) & PAGE_MASK) << 3;
  330. *ioasic_ssr |= SCSI_DMA_EN;
  331. fast_iob();
  332. }
  333. static void dma_ints_off(struct NCR_ESP *esp)
  334. {
  335. disable_irq(dec_interrupt[DEC_IRQ_ASC_DMA]);
  336. }
  337. static void dma_ints_on(struct NCR_ESP *esp)
  338. {
  339. enable_irq(dec_interrupt[DEC_IRQ_ASC_DMA]);
  340. }
  341. static int dma_irq_p(struct NCR_ESP *esp)
  342. {
  343.     return (esp->eregs->esp_status & ESP_STAT_INTR);
  344. }
  345. static int dma_ports_p(struct NCR_ESP *esp)
  346. {
  347. /*
  348.  * FIXME: what's this good for?
  349.  */
  350. return 1;
  351. }
  352. static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write)
  353. {
  354.     /*
  355.      * On the Sparc, DMA_ST_WRITE means "move data from device to memory"
  356.      * so when (write) is true, it actually means READ!
  357.      */
  358. if (write) {
  359. dma_init_read(esp, addr, count);
  360.     } else {
  361. dma_init_write(esp, addr, count);
  362.     }
  363. }
  364. /*
  365.  * These aren't used yet
  366.  */
  367. static void dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp)
  368. {
  369. sp->SCp.have_data_in = PHYSADDR(sp->SCp.buffer);
  370. sp->SCp.ptr = (char *) ((unsigned long) sp->SCp.have_data_in);
  371. }
  372. static void dma_mmu_get_scsi_sgl(struct NCR_ESP *esp, Scsi_Cmnd * sp)
  373. {
  374.     int sz = sp->SCp.buffers_residual;
  375.     struct mmu_sglist *sg = (struct mmu_sglist *) sp->SCp.buffer;
  376.     while (sz >= 0) {
  377. sg[sz].dvma_addr = PHYSADDR(sg[sz].addr);
  378. sz--;
  379.     }
  380. sp->SCp.ptr = (char *) ((unsigned long) sp->SCp.buffer->dma_address);
  381. }
  382. static void dma_advance_sg(Scsi_Cmnd * sp)
  383. {
  384. sp->SCp.ptr = (char *) ((unsigned long) sp->SCp.buffer->dma_address);
  385. }
  386. static void pmaz_dma_drain(struct NCR_ESP *esp)
  387. {
  388. memcpy((void *) (KSEG0ADDR(esp_virt_buffer)),
  389. (void *) ( esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE),
  390. scsi_current_length);
  391. }
  392. static void pmaz_dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length)
  393. {
  394. volatile int *dmareg = (volatile int *) (esp->slot + DEC_SCSI_DMAREG);
  395. if (length > ESP_TGT_DMA_SIZE)
  396. length = ESP_TGT_DMA_SIZE;
  397. *dmareg = TC_ESP_DMA_ADDR(esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE);
  398. iob();
  399. esp_virt_buffer = vaddress;
  400. scsi_current_length = length;
  401. }
  402. static void pmaz_dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length)
  403. {
  404. volatile int *dmareg = (volatile int *) ( esp->slot + DEC_SCSI_DMAREG );
  405. memcpy((void *) (esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE),
  406. KSEG0ADDR((void *) vaddress), length);
  407. *dmareg = TC_ESP_DMAR_WRITE | 
  408. TC_ESP_DMA_ADDR(esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE);
  409. iob();
  410. }
  411. static void pmaz_dma_ints_off(struct NCR_ESP *esp)
  412. {
  413. }
  414. static void pmaz_dma_ints_on(struct NCR_ESP *esp)
  415. {
  416. }
  417. static void pmaz_dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write)
  418. {
  419. /*
  420.  * On the Sparc, DMA_ST_WRITE means "move data from device to memory"
  421.  * so when (write) is true, it actually means READ!
  422.  */
  423. if (write) {
  424. pmaz_dma_init_read(esp, addr, count);
  425. } else {
  426. pmaz_dma_init_write(esp, addr, count);
  427. }
  428. }
  429. static void pmaz_dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp)
  430. {
  431. sp->SCp.have_data_in = (int) sp->SCp.ptr =
  432.     (char *) KSEG0ADDR((sp->request_buffer));
  433. }