pas16.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /*
  2. * This driver adapted from Drew Eckhardt's Trantor T128 driver
  3. *
  4. * Copyright 1993, Drew Eckhardt
  5. * Visionary Computing
  6. * (Unix and Linux consulting and custom programming)
  7. * drew@colorado.edu
  8. * +1 (303) 666-5836
  9. *
  10. * ( Based on T128 - DISTRIBUTION RELEASE 3. )
  11. *
  12. * Modified to work with the Pro Audio Spectrum/Studio 16
  13. * by John Weidman.
  14. *
  15. *
  16. * For more information, please consult
  17. *
  18. * Media Vision
  19. * (510) 770-8600
  20. * (800) 348-7116
  21. *
  22. * and
  23. *
  24. * NCR 5380 Family
  25. * SCSI Protocol Controller
  26. * Databook
  27. *
  28. * NCR Microelectronics
  29. * 1635 Aeroplaza Drive
  30. * Colorado Springs, CO 80916
  31. * 1+ (719) 578-3400
  32. * 1+ (800) 334-5454
  33. */
  34. #ifndef PAS16_H
  35. #define PAS16_H
  36. #define PAS16_PUBLIC_RELEASE 3
  37. #define PDEBUG_INIT 0x1
  38. #define PDEBUG_TRANSFER 0x2
  39. #define PAS16_DEFAULT_BASE_1 0x388
  40. #define PAS16_DEFAULT_BASE_2 0x384
  41. #define PAS16_DEFAULT_BASE_3 0x38c
  42. #define PAS16_DEFAULT_BASE_4 0x288
  43. #define PAS16_DEFAULT_BOARD_1_IRQ 10
  44. #define PAS16_DEFAULT_BOARD_2_IRQ 12
  45. #define PAS16_DEFAULT_BOARD_3_IRQ 14
  46. #define PAS16_DEFAULT_BOARD_4_IRQ 15
  47. /*
  48. * The Pro Audio Spectrum boards are I/O mapped. They use a Zilog 5380
  49. * SCSI controller, which is the equivalent of NCR's 5380. "Pseudo-DMA"
  50. * architecture is used, where a PAL drives the DMA signals on the 5380
  51. * allowing fast, blind transfers with proper handshaking.
  52. */
  53. /* The Time-out Counter register is used to safe-guard against a stuck
  54. * bus (in the case of RDY driven handshake) or a stuck byte (if 16-Bit
  55. * DMA conversion is used). The counter uses a 28.224MHz clock
  56. * divided by 14 as its clock source. In the case of a stuck byte in
  57. * the holding register, an interrupt is generated (and mixed with the
  58. * one with the drive) using the CD-ROM interrupt pointer.
  59. */
  60. #define P_TIMEOUT_COUNTER_REG 0x4000
  61. #define P_TC_DISABLE 0x80 /* Set to 0 to enable timeout int. */
  62. /* Bits D6-D0 contain timeout count */
  63. #define P_TIMEOUT_STATUS_REG_OFFSET 0x4001
  64. #define P_TS_TIM 0x80 /* check timeout status */
  65. /* Bits D6-D4 N/U */
  66. #define P_TS_ARM_DRQ_INT 0x08 /* Arm DRQ Int. When set high,
  67. * the next rising edge will
  68. * cause a CD-ROM interrupt.
  69. * When set low, the interrupt
  70. * will be cleared. There is
  71. * no status available for
  72. * this interrupt.
  73. */
  74. #define P_TS_ENABLE_TO_ERR_INTERRUPT /* Enable timeout error int. */
  75. #define P_TS_ENABLE_WAIT /* Enable Wait */
  76. #define P_TS_CT 0x01 /* clear timeout. Note: writing
  77. * to this register clears the
  78. * timeout error int. or status
  79. */
  80. /*
  81. * The data register reads/writes to/from the 5380 in pseudo-DMA mode
  82. */
  83. #define P_DATA_REG_OFFSET 0x5c00 /* rw */
  84. #define P_STATUS_REG_OFFSET 0x5c01 /* ro */
  85. #define P_ST_RDY 0x80 /* 5380 DDRQ Status */
  86. #define P_IRQ_STATUS 0x5c03
  87. #define P_IS_IRQ 0x80 /* DIRQ status */
  88. #define PCB_CONFIG 0x803
  89. #define MASTER_ADDRESS_PTR 0x9a01 /* Fixed position - no relo */
  90. #define SYS_CONFIG_4 0x8003
  91. #define WAIT_STATE 0xbc00
  92. #define OPERATION_MODE_1 0xec03
  93. #define IO_CONFIG_3 0xf002
  94. #ifndef ASM
  95. static int pas16_abort(Scsi_Cmnd *);
  96. static int pas16_biosparam(struct scsi_device *, struct block_device *,
  97. sector_t, int*);
  98. static int pas16_detect(struct scsi_host_template *);
  99. static int pas16_queue_command(struct Scsi_Host *, struct scsi_cmnd *);
  100. static int pas16_bus_reset(Scsi_Cmnd *);
  101. #ifndef CMD_PER_LUN
  102. #define CMD_PER_LUN 2
  103. #endif
  104. #ifndef CAN_QUEUE
  105. #define CAN_QUEUE 32
  106. #endif
  107. #ifndef HOSTS_C
  108. #define NCR5380_implementation_fields \
  109. volatile unsigned short io_port
  110. #define NCR5380_local_declare() \
  111. volatile unsigned short io_port
  112. #define NCR5380_setup(instance) \
  113. io_port = (instance)->io_port
  114. #define PAS16_io_port(reg) ( io_port + pas16_offset[(reg)] )
  115. #if !(PDEBUG & PDEBUG_TRANSFER)
  116. #define NCR5380_read(reg) ( inb(PAS16_io_port(reg)) )
  117. #define NCR5380_write(reg, value) ( outb((value),PAS16_io_port(reg)) )
  118. #else
  119. #define NCR5380_read(reg) \
  120. (((unsigned char) printk("scsi%d : read register %d at io_port %04x\n"\
  121. , instance->hostno, (reg), PAS16_io_port(reg))), inb( PAS16_io_port(reg)) )
  122. #define NCR5380_write(reg, value) \
  123. (printk("scsi%d : write %02x to register %d at io_port %04x\n", \
  124. instance->hostno, (value), (reg), PAS16_io_port(reg)), \
  125. outb( (value),PAS16_io_port(reg) ) )
  126. #endif
  127. #define NCR5380_intr pas16_intr
  128. #define do_NCR5380_intr do_pas16_intr
  129. #define NCR5380_queue_command pas16_queue_command
  130. #define NCR5380_abort pas16_abort
  131. #define NCR5380_bus_reset pas16_bus_reset
  132. #define NCR5380_proc_info pas16_proc_info
  133. /* 15 14 12 10 7 5 3
  134. 1101 0100 1010 1000 */
  135. #define PAS16_IRQS 0xd4a8
  136. #endif /* else def HOSTS_C */
  137. #endif /* ndef ASM */
  138. #endif /* PAS16_H */