cvmeSqsys1.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* cvmeSqsys1.c - Cyclone Squall sys-1 module library */
  2. /* Copyright 1984-1993 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01a,03mar93,ccc  created.
  8. */
  9. /*
  10. DESCRIPTION
  11. This library contains routines to manipulate the Cyclone Squall sys-1
  12. module.  This library addresses initialization, plus the SCSI and
  13. LANCE ethernet functions of the Squall sys-1.
  14. */
  15. /* memory configuration table entries for SQSYS1 (82596 ethernet) */
  16. #define SQSYS1_MCON_C (UINT32) 0x00100002
  17. #define SQSYS1_MCON_D (UINT32) 0x00000000
  18. /*******************************************************************************
  19. *
  20. * sysSquallInit - initialize the Cyclone Squall sys-1 module hardware
  21. *
  22. * RETURNS: N/A
  23. *
  24. * NOMANUAL
  25. */
  26. void sysSquallInit (void)
  27.     {
  28.     }
  29. /******************************************************************************
  30. *
  31. * sys596Init - performs any additional board specific 82596 device init
  32. *
  33. * Set up the control table entries for the SQSYS1 Squall module.  In addition,
  34. * save these parameters in the Cyclone NVRAM area.
  35. *
  36. * NOMANUAL
  37. */
  38. void sys596Init
  39.     (
  40.     volatile int unit           /* ignored */
  41.     )
  42.     {
  43.     sysSquallCtrlTableSetup (SQSYS1_MCON_C, SQSYS1_MCON_D,
  44.      CVME960_VEC_XINT3, CVME960_VEC_XINT4,
  45.      LEVEL_TRIG, EDGE_TRIG);
  46.     sysSquallRamSet (SQSYS1_MCON_C, SQSYS1_MCON_D,
  47.      CVME960_VEC_XINT3, CVME960_VEC_XINT4,
  48.      LEVEL_TRIG, EDGE_TRIG);
  49.     }
  50. /******************************************************************************
  51. *
  52. * sys596Port - writes a command to the 82596 device PORT location
  53. *
  54. * There are 4 commands the device handles.
  55. *
  56. * NOMANUAL
  57. */
  58. void sys596Port
  59.     (
  60.     volatile int unit,  /* ignored */
  61.     int cmd,            /* the command to write */
  62.     UINT32 addr         /* address or NULL if PORT_RESET command */
  63.     )
  64.     {
  65.     volatile UINT32 *port;
  66.     port = (volatile UINT32 *) CVME960_EI_PORT;
  67.     *port = (cmd & 0x3) | (addr & 0xfffffffc);  /* requires two accesses */
  68.     *port = (cmd & 0x3) | (addr & 0xfffffffc);
  69.     }
  70. /******************************************************************************
  71. *
  72. * sys596ChanAtn - assert the Channel Attention signal to the 82596 device
  73. *
  74. * NOMANUAL
  75. */
  76. void sys596ChanAtn
  77.     (
  78.     volatile int unit /* ignored */
  79.     )
  80.     {
  81.     *CVME960_EI_CA = 1; /* write to the addr; data is ignored */
  82.     }
  83. /******************************************************************************
  84. *
  85. * sys596IntAck - acknowlege interrupts from the 82596 device
  86. *
  87. * Since the interrupts from the 82596 are falling-edge detected,
  88. * there is no need to acknowlege them.
  89. *
  90. * NOMANUAL
  91. */
  92. void sys596IntAck
  93.     (
  94.     volatile int unit    /* ignored */
  95.     )
  96.     {
  97.     }
  98. /******************************************************************************
  99. *
  100. * sys596IntEnable - enable interrupts from the 82596 device
  101. *
  102. * Enables 82596 Ethernet controller interrupts by setting the
  103. * appropriate bit in the 960's IMSK register.
  104. *
  105. * NOMANUAL
  106. */
  107. void sys596IntEnable
  108.     (
  109.     volatile int unit    /* ignored */
  110.     )
  111.     {
  112.     vxIMRSet (CVME960_MASK_XINT4);
  113.     }
  114. /******************************************************************************
  115. *
  116. * sys596IntDisable - disable interrupts from the 82596 device
  117. *
  118. * Disables 82596 Ethernet controller interrupts by clearing the
  119. * appropriate bit in the 960's IMSK register.
  120. *
  121. * NOMANUAL
  122. */
  123. void sys596IntDisable
  124.     (
  125.     volatile int unit    /* ignored */
  126.     )
  127.     {
  128.     vxIMRClear (CVME960_MASK_XINT4);
  129.     }
  130. #ifdef INCLUDE_SCSI
  131. /******************************************************************************
  132. *
  133. * sysScsiBusReset - assert the RST line on the SCSI bus
  134. *
  135. * This routine asserts the RST line on the SCSI bus, which causes all
  136. * connected devices to return to a quiescent state.
  137. *
  138. * RETURNS: N/A
  139. */
  140. void sysScsiBusReset
  141.     (
  142.     FAST WD_33C93_SCSI_CTRL *pSbic /* ptr to SBIC info */
  143.     )
  144.     {
  145.     unsigned long oldLevel; /* To restore interrupt mask */
  146.     unsigned long ix; /* To restore interrupt mask */
  147.     oldLevel = intLock (); /* Get current irq mask */
  148.     /* Toggle the reset line, delaying a bit in between */
  149.     *SCSI_BUS_RESET_CTRL = ASSERT_SCSI_BUS_RESET;
  150.     /* This is ~30ms at 33 Mhz.  SCSI spec says RST must be low > 25us.
  151.      * We can't use task delay, as it causes rescheduling, and the
  152.      * reset interrupt will be re-enabled.
  153.      */
  154.     for (ix = 0; ix < 250000; ix++) ;
  155.     *SCSI_BUS_RESET_CTRL = DEASSERT_SCSI_BUS_RESET;
  156.     /* Clear flag bit to stop reset interrupt to CPU */
  157.     *SCSI_BUS_RESET_CTRL = CLEAR_SCSI_RESET_IRQ;
  158.     vxIPNDClear (CVME960_MASK_XINT3);
  159.     intUnlock (oldLevel); /* Restore original mask */
  160.     }
  161. /******************************************************************************
  162. *
  163. * sysScsiIntr - interrupt handler for xint3 interrupts
  164. *
  165. * This routine is the interrupt handler for the xint3 interrupt from the
  166. * SQSYS1 squall module.  This interrupt can come from three sources:
  167. * the Western Digital 33C93 INTRQ pin, the SCSI bus reset interrupt
  168. * (signalled when the SCSI bus is reset), and the squall module SCC.
  169. * This routine examines the squall's status register to determine the
  170. * source of the interrupt, and then handles it appropriately.
  171. *
  172. * RETURNS: N/A
  173. */
  174. LOCAL void sysScsiIntr
  175.     (
  176.     WD_33C93_SCSI_CTRL *pSysScsiCtrl
  177.     )
  178.     {
  179.     /* Read squall xint3 status register */
  180.     FAST unsigned char status = *SQ_STATUS_REG;
  181.     if (!(status & (1 << SCC_IRQ_BIT)))
  182. logMsg ("Unexpected SCC interrupt!n");
  183.     if (!(status & (1 << SCSI_IRQ_BIT)))
  184. sbicIntr (pSysScsiCtrl);
  185.     if (!(status & (1 << SCSI_BUS_RESET_BIT)))
  186. logMsg ("Unexpected SCSI bus reset!n");
  187.     vxIPNDClear (CVME960_MASK_XINT3);
  188.     }
  189. /******************************************************************************
  190. *
  191. * sysScsiInit - initialize a Western Digital SBIC
  192. *
  193. * This routine creates and initializes an SBIC structure, enabling use of the
  194. * on-board SCSI port. It also connects the proper interrupt service routine
  195. * to the desired vector, and enables the interrupt at the desired level.
  196. *
  197. * RETURNS: OK, or ERROR if the SBIC structure cannot be connected, or the
  198. * controller cannot be initialized.
  199. */
  200. STATUS sysScsiInit (void)
  201.     {
  202.     if ((pSysScsiCtrl =
  203. (SCSI_CTRL *) wd33c93CtrlCreate (CVME960_SBIC_BASE_ADRS,
  204.  CVME960_SBIC_REG_OFFSET,
  205.  CVME960_SBIC_CLK_PERIOD,
  206.  CVME960_SBIC_DEV_TYPE,
  207.  (FUNCPTR) sysScsiBusReset,
  208.  (FUNCPTR) NULL,
  209.  (FUNCPTR) NULL
  210. )) == NULL)
  211. {
  212. return (ERROR);
  213. }
  214.     /* connect the SCSI controller's interrupt service routine */
  215.     if (intConnect ((VOIDFUNCPTR *) CVME960_VEC_XINT3, sysScsiIntr,
  216.     (int) pSysScsiCtrl) == ERROR)
  217. {
  218. return (ERROR);
  219. }
  220.     /* enable the SBIC interrupt */
  221.     vxIPNDClear (CVME960_MASK_XINT3);
  222.     vxIMRSet (CVME960_MASK_XINT3); /* Re-enable xint3 irq's */
  223.     /* initialize SCSI controller with default parameters (user tunable) */
  224.     if (wd33c93CtrlInit ((WD_33C93_SCSI_CTRL *) pSysScsiCtrl,
  225.  SCSI_DEF_CTRL_BUS_ID,
  226.  SCSI_DEF_SELECT_TIMEOUT,
  227.  NONE) == ERROR)
  228. {
  229. return (ERROR);
  230. }
  231.     return (OK);
  232.     }
  233. #endif /* INCLUDE_SCSI */