Beispiel #1
0
static void __exit scc_enet_cleanup(void)
{
	struct rtnet_device *rtdev = rtdev_root;
	struct scc_enet_private *cep = (struct scc_enet_private *)rtdev->priv;
	volatile cpm8xx_t *cp = cpmp;
	volatile scc_enet_t *ep;

	if (rtdev) {
		rtdm_irq_disable(&cep->irq_handle);
		rtdm_irq_free(&cep->irq_handle);

		ep = (scc_enet_t *)(&cp->cp_dparam[PROFF_ENET]);
		m8xx_cpm_dpfree(ep->sen_genscc.scc_rbase);
		m8xx_cpm_dpfree(ep->sen_genscc.scc_tbase);

		rt_stack_disconnect(rtdev);
		rt_unregister_rtnetdev(rtdev);
		rt_rtdev_disconnect(rtdev);

		printk("%s: unloaded\n", rtdev->name);
		rtskb_pool_release(&cep->skb_pool);
		rtdev_free(rtdev);
		rtdev_root = NULL;
	}
}
Beispiel #2
0
static void __exit cpm_load_cleanup (void)
{
	int i;
	volatile immap_t *immap = (immap_t *) IMAP_ADDR;
	volatile cpm8xx_t *cp = &immap->im_cpm;
	volatile risc_timer_t *rtram =
			(risc_timer_t *) & cp->cp_dparam[PROFF_RTIMER];

	remove_proc_entry (PROC_NAME, NULL);

	/* Stop the general purpose timers.
	 */
	immap->im_cpmtimer.cpmt_tgcr |=
			CPMTIMER_TGCR_STP1 | CPMTIMER_TGCR_STP2;

	/* Stop the RISC timers.
	 */
#ifdef RCCR_BUG
	*(uint *) & (immap->im_cpm.cp_rccr) &= ~0x80000000;
#else
	immap->im_cpm.cp_rccr &= ~0x8000;
#endif

	/* Disable RISC timers.
	 */
	for (i = 0; i < RISC_TIMER_MAX; i++) {
		rtram->tm_cmd = (i << 16);

		/* Wait for a previous command to clear.
		 */
		while (cp->cp_cpcr & CPM_CR_FLG);

		/* Issue SET TIMER command.
		 */
		cp->cp_cpcr = mk_cr_cmd (CPM_CR_CH_TIMER, CPM_CR_SET_TIMER) |
					 CPM_CR_FLG;
#if 0
		while (cp->cp_cpcr & CPM_CR_FLG);
#endif
	}

	m8xx_cpm_dpfree (risc_dpram_timers);
}