summaryrefslogtreecommitdiff
path: root/sys/dev/hfa/fore_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/hfa/fore_init.c')
-rw-r--r--sys/dev/hfa/fore_init.c380
1 files changed, 0 insertions, 380 deletions
diff --git a/sys/dev/hfa/fore_init.c b/sys/dev/hfa/fore_init.c
deleted file mode 100644
index ccaed3f0e085..000000000000
--- a/sys/dev/hfa/fore_init.c
+++ /dev/null
@@ -1,380 +0,0 @@
-/*-
- *
- * ===================================
- * HARP | Host ATM Research Platform
- * ===================================
- *
- *
- * This Host ATM Research Platform ("HARP") file (the "Software") is
- * made available by Network Computing Services, Inc. ("NetworkCS")
- * "AS IS". NetworkCS does not provide maintenance, improvements or
- * support of any kind.
- *
- * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
- * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
- * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
- * In no event shall NetworkCS be responsible for any damages, including
- * but not limited to consequential damages, arising from or relating to
- * any use of the Software or related support.
- *
- * Copyright 1994-1998 Network Computing Services, Inc.
- *
- * Copies of this Software may be made, however, the above copyright
- * notice must be reproduced on all copies.
- *
- * @(#) $FreeBSD$
- *
- */
-
-/*
- * FORE Systems 200-Series Adapter Support
- * ---------------------------------------
- *
- * Cell Processor (CP) initialization routines
- *
- */
-
-#include <sys/param.h>
-#include <sys/kernel.h>
-#include <sys/systm.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/syslog.h>
-#include <vm/vm.h>
-#include <vm/pmap.h>
-#include <net/if.h>
-#include <netatm/port.h>
-#include <netatm/queue.h>
-#include <netatm/atm.h>
-#include <netatm/atm_sys.h>
-#include <netatm/atm_sap.h>
-#include <netatm/atm_cm.h>
-#include <netatm/atm_if.h>
-#include <netatm/atm_stack.h>
-#include <netatm/atm_pcb.h>
-#include <netatm/atm_var.h>
-#include <dev/pci/pcivar.h>
-#include <dev/hfa/fore.h>
-#include <dev/hfa/fore_aali.h>
-#include <dev/hfa/fore_slave.h>
-#include <dev/hfa/fore_stats.h>
-#include <dev/hfa/fore_var.h>
-#include <dev/hfa/fore_include.h>
-
-#ifndef lint
-__RCSID("@(#) $FreeBSD$");
-#endif
-
-
-/*
- * Local functions
- */
-static void fore_get_prom(Fore_unit *);
-
-
-/*
- * Begin CP Initialization
- *
- * This function will poll for the successful downloading and starting of
- * the CP microcode program. After the microcode is running, we will allocate
- * any needed kernel memory (must do it in non-interrupt mode), build the CP
- * queue configurations and issue an Initialize command to the CP.
- *
- * Arguments:
- * fup pointer to device unit structure
- *
- * Returns:
- * none
- */
-void
-fore_initialize(fup)
- Fore_unit *fup;
-{
- Aali *aap;
- Init_parms *inp;
- caddr_t errmsg;
- u_long vers;
- u_int c, wait;
-#define MAX_WAIT 100
-
- /*
- * Must wait until firmware has been downloaded and is running
- */
- if (CP_READ(fup->fu_mon->mon_bstat) != BOOT_RUNNING) {
-
- /*
- * Try again later
- */
- fup->fu_thandle =
- timeout((KTimeout_ret(*)(void *))fore_initialize,
- (void *)fup, hz);
- return;
- } else
- callout_handle_init(&fup->fu_thandle);
-
- /*
- * Allocate queues and whatever else is needed
- */
- if (fore_xmit_allocate(fup)) {
- errmsg = "transmit queue allocation";
- goto failed;
- }
- if (fore_recv_allocate(fup)) {
- errmsg = "receive queue allocation";
- goto failed;
- }
- if (fore_buf_allocate(fup)) {
- errmsg = "buffer supply queue allocation";
- goto failed;
- }
- if (fore_cmd_allocate(fup)) {
- errmsg = "command queue allocation";
- goto failed;
- }
-
- /*
- * CP microcode is downloaded - locate shared memory interface
- */
- aap = (Aali *)(fup->fu_ram + CP_READ(fup->fu_mon->mon_appl));
- fup->fu_aali = aap;
-
- /*
- * Pick out any interesting info from the microcode
- */
- vers = CP_READ(aap->aali_ucode_ver);
- if (vers < FORE_MIN_UCODE) {
- errmsg = "unsupported microcode version";
- goto failed;
- }
- snprintf(fup->fu_config.ac_firm_vers,
- sizeof(fup->fu_config.ac_firm_vers), "%ld.%ld.%ld",
- (vers >> 16) & 0xff, (vers >> 8) & 0xff, vers & 0xff);
-
- if (((vers >> 16) & 0xff) == 4)
- fup->fu_ft4 = 1;
- else
- fup->fu_ft4 = 0;
-
-#ifdef notdef
- /*
- * Turn on CP debugging
- */
- aap->aali_hostlog = 1;
-#endif
-
- /*
- * Build the initialization block
- */
- inp = &aap->aali_init;
- inp->init_numvcc = CP_WRITE(FORE_MAX_VCC);
- inp->init_cmd_elem = CP_WRITE(CMD_QUELEN);
- inp->init_xmit_elem = CP_WRITE(XMIT_QUELEN);
- inp->init_recv_elem = CP_WRITE(RECV_QUELEN);
- inp->init_recv_ext = CP_WRITE(RECV_EXTRA_SEGS);
- inp->init_xmit_ext = CP_WRITE(XMIT_EXTRA_SEGS);
- inp->init_buf1s.bfs_quelen = CP_WRITE(BUF1_SM_QUELEN);
- inp->init_buf1s.bfs_bufsize = CP_WRITE(BUF1_SM_SIZE);
- inp->init_buf1s.bfs_cppool = CP_WRITE(BUF1_SM_CPPOOL);
- inp->init_buf1s.bfs_entsize = CP_WRITE(BUF1_SM_ENTSIZE);
- inp->init_buf1l.bfs_quelen = CP_WRITE(BUF1_LG_QUELEN);
- inp->init_buf1l.bfs_bufsize = CP_WRITE(BUF1_LG_SIZE);
- inp->init_buf1l.bfs_cppool = CP_WRITE(BUF1_LG_CPPOOL);
- inp->init_buf1l.bfs_entsize = CP_WRITE(BUF1_LG_ENTSIZE);
- inp->init_buf2s.bfs_quelen = CP_WRITE(0);
- inp->init_buf2s.bfs_bufsize = CP_WRITE(0);
- inp->init_buf2s.bfs_cppool = CP_WRITE(0);
- inp->init_buf2s.bfs_entsize = CP_WRITE(0);
- inp->init_buf2l.bfs_quelen = CP_WRITE(0);
- inp->init_buf2l.bfs_bufsize = CP_WRITE(0);
- inp->init_buf2l.bfs_cppool = CP_WRITE(0);
- inp->init_buf2l.bfs_entsize = CP_WRITE(0);
-
- /*
- * Enable device interrupts
- */
- aap->aali_intr_ena = CP_WRITE(1);
-
- /*
- * Issue the Initialize command to the CP and wait for
- * the CP to interrupt to signal completion
- */
- inp->init_status = CP_WRITE(QSTAT_PENDING);
-
- if (!fup->fu_ft4) {
- inp->init_cmd = CP_WRITE(CMD_INIT | CMD_INTR_REQ);
- return;
- }
- inp->init_cmd = CP_WRITE(CMD_INIT);
-
- /*
- * With the ForeThought 4.X image it appears that we need to
- * busy wait on the initializisation command to complete.
- * Otherwise the command queue address (the first word
- * of the queue structure) will be mangled.
- */
- c = 0;
- for (wait = 0; wait < MAX_WAIT; wait++) {
- c = CP_READ(inp->init_status);
- if (c & QSTAT_COMPLETED)
- break;
- DELAY(1000);
- }
- if (c & QSTAT_ERROR) {
- log(LOG_ERR, "fore initialization failed: intf=%s%d, "
- "hbeat=0x%lx\n", fup->fu_pif.pif_name,
- fup->fu_pif.pif_unit, (u_long)CP_READ(aap->aali_heartbeat));
- fore_interface_free(fup);
- return;
- }
- if (!(c & QSTAT_COMPLETED)) {
- log(LOG_ERR, "fore initialization timed out: intf=%s%d, "
- "hbeat=0x%lx\n", fup->fu_pif.pif_name, fup->fu_pif.pif_unit,
- (u_long)CP_READ(aap->aali_heartbeat));
- fore_interface_free(fup);
- return;
- }
- fore_initialize_complete(fup);
- return;
-
-failed:
- /*
- * Initialization failure
- */
- fore_interface_free(fup);
- log(LOG_ERR, "fore initialization failed: intf=%s%d, err=%s\n",
- fup->fu_pif.pif_name, fup->fu_pif.pif_unit, errmsg);
- return;
-}
-
-
-/*
- * Complete CP Initialization
- *
- * Called after the CP has successfully completed processing of the
- * Initialize command. We will now finish off our part of the
- * initialization process by setting up all the host-based queue
- * management structures.
- *
- * Called at interrupt level.
- *
- * Arguments:
- * fup pointer to device unit structure
- *
- * Returns:
- * none
- */
-void
-fore_initialize_complete(fup)
- Fore_unit *fup;
-{
- Aali *aap = fup->fu_aali;
-
- /*
- * Log an initialization failure
- */
- if (CP_READ(aap->aali_init.init_status) & QSTAT_ERROR) {
-
- log(LOG_ERR,
- "fore initialization failed: intf=%s%d, hbeat=0x%lx\n",
- fup->fu_pif.pif_name, fup->fu_pif.pif_unit,
- (u_long)CP_READ(aap->aali_heartbeat));
- return;
- }
-
- ATM_DEBUG1("heap=0x%lx\n", aap->aali_heap);
- ATM_DEBUG1("heaplen=0x%lx\n", aap->aali_heaplen);
- ATM_DEBUG1("cmd_q=0x%lx\n", aap->aali_cmd_q);
- ATM_DEBUG1("xmit_q=0x%lx\n", aap->aali_xmit_q);
- ATM_DEBUG1("recv_q=0x%lx\n", aap->aali_recv_q);
- ATM_DEBUG1("buf1s_q=0x%lx\n", aap->aali_buf1s_q);
- ATM_DEBUG1("buf1l_q=0x%lx\n", aap->aali_buf1l_q);
- ATM_DEBUG1("buf2s_q=0x%lx\n", aap->aali_buf2s_q);
- ATM_DEBUG1("buf2l_q=0x%lx\n", aap->aali_buf2l_q);
-
- /*
- * Initialize all of our queues
- */
- fore_xmit_initialize(fup);
- fore_recv_initialize(fup);
- fore_buf_initialize(fup);
- fore_cmd_initialize(fup);
-
- /*
- * Mark device initialization completed
- */
- fup->fu_flags |= CUF_INITED;
-
- fore_get_prom(fup);
- return;
-}
-
-
-/*
- * Get device PROM values from CP
- *
- * This function will issue a GET_PROM command to the CP in order to
- * initiate the DMA transfer of the CP's PROM structure to the host.
- * This will be called after CP initialization has completed.
- * There is (currently) no retry if this fails.
- *
- * It took me some time to find out that FT3 and FT4 use different
- * operation codes for GET_PROM.
- *
- * Called at interrupt level.
- *
- * Arguments:
- * fup pointer to device unit structure
- *
- * Returns:
- * none
- *
- */
-static void
-fore_get_prom(fup)
- Fore_unit *fup;
-{
- H_cmd_queue *hcp;
- Cmd_queue *cqp;
-
- /*
- * Queue command at end of command queue
- */
- hcp = fup->fu_cmd_tail;
- if ((*hcp->hcq_status) & QSTAT_FREE) {
-
- /*
- * Queue entry available, so set our view of things up
- */
- if (fup->fu_ft4)
- hcp->hcq_code = CMD_GET_PROM4;
- else
- hcp->hcq_code = CMD_GET_PROM;
- hcp->hcq_arg = NULL;
- fup->fu_cmd_tail = hcp->hcq_next;
-
- /*
- * Now set the CP-resident queue entry - the CP will grab
- * the command when the op-code is set.
- */
- cqp = hcp->hcq_cpelem;
- (*hcp->hcq_status) = QSTAT_PENDING;
-
- fup->fu_promd = vtophys(fup->fu_prom);
- if (fup->fu_promd == 0) {
- fup->fu_stats->st_drv.drv_cm_nodma++;
- return;
- }
- cqp->cmdq_prom.prom_buffer = (CP_dma) CP_WRITE(fup->fu_promd);
- cqp->cmdq_prom.prom_cmd = CP_WRITE(hcp->hcq_code | CMD_INTR_REQ);
-
- } else {
- /*
- * Command queue full
- */
- fup->fu_stats->st_drv.drv_cm_full++;
- }
-
- return;
-}
-