Пример #1
0
static void tulip_down (/*RTnet*/struct rtnet_device *rtdev)
{
	long ioaddr = rtdev->base_addr;
	struct tulip_private *tp = (struct tulip_private *) rtdev->priv;

	rtdm_irq_disable(&tp->irq_handle);
	rtdm_lock_get(&tp->lock); /* sync with IRQ handler on other cpu -JK- */

	/* Disable interrupts by clearing the interrupt mask. */
	outl (0x00000000, ioaddr + CSR7);

	/* Stop the Tx and Rx processes. */
	tulip_stop_rxtx(tp);

	/* prepare receive buffers */
	tulip_refill_rx(rtdev);

	/* release any unconsumed transmit buffers */
	tulip_clean_tx_ring(tp);

	/* 21040 -- Leave the card in 10baseT state. */
	if (tp->chip_id == DC21040)
		outl (0x00000004, ioaddr + CSR13);

	if (inl (ioaddr + CSR6) != 0xffffffff)
		tp->stats.rx_missed_errors += inl (ioaddr + CSR8) & 0xffff;

	rtdm_lock_put(&tp->lock);
	rtdm_irq_enable(&tp->irq_handle);

	rtdev->if_port = tp->saved_if_port;

	/* Leave the driver in snooze, not sleep, mode. */
	tulip_set_power_state (tp, 0, 1);
}
Пример #2
0
int demo_open_rt(struct rtdm_dev_context    *context,
                 rtdm_user_info_t           *user_info,
                 int                        oflags)
{
    struct demodrv_context  *my_context;
#ifdef USEMMAP
    unsigned long vaddr;
#endif
    int dev_id = context->device->device_id;
    int ret;
    
    // get the context for our driver - used to store driver info
    my_context = (struct demodrv_context *)context->dev_private;

#ifdef USEMMAP
    // allocate and prepare memory for our buffer
    my_context->buf = kmalloc(BUFFER_SIZE, GFP_KERNEL);
    /* mark pages reserved so that remap_pfn_range works */
    for (vaddr = (unsigned long)my_context->buf;
         vaddr < (unsigned long)my_context->buf + BUFFER_SIZE;
         vaddr += PAGE_SIZE)
        SetPageReserved(virt_to_page(vaddr));
    // write some test value to the start of our buffer
    *(int *)my_context->buf = 1234;

    my_context->mapped_user_addr = NULL;
#endif

    // we also have an interrupt handler:
#ifdef TIMERINT
    ret = rtdm_irq_request(&my_context->irq_handle, TIMER_INT, demo_interrupt,
                 0, context->device->proc_name, my_context);
#else
    ret = rtdm_irq_request(&my_context->irq_handle, PAR_INT, demo_interrupt,
                 0, context->device->proc_name, my_context);
#endif
    if (ret < 0)
        return ret;

    /* IPC initialisation - cannot fail with used parameters */
    rtdm_lock_init(&my_context->lock);
    rtdm_event_init(&my_context->irq_event, 0);
    my_context->dev_id         = dev_id;

    my_context->irq_events     = 0;
    my_context->irq_event_lock = 0;
    my_context->timeout = 0; // wait INFINITE

#ifndef TIMERINT
    //set port to interrupt mode; pins are output
    outb_p(0x10, BASEPORT + 2);
#endif
    // enable interrupt in RTDM
    rtdm_irq_enable(&my_context->irq_handle);
    return 0;
}
Пример #3
0
static int rt2x00_dev_radio_on(struct _rt2x00_device * device) {
  
    struct _rt2x00_pci	*rt2x00pci = rt2x00_priv(device);
    u32			reg = 0x00000000;
    int retval;
  
    if(rt2x00_pci_alloc_rings(device))
        goto exit_fail;
  
    rt2x00_clear_ring(rt2x00pci, &rt2x00pci->rx);
    rt2x00_clear_ring(rt2x00pci, &rt2x00pci->tx);

    rt2x00_init_ring_register(rt2x00pci);

    if(rt2x00_init_registers(rt2x00pci))
        goto exit_fail;

    rt2x00_init_write_mac(rt2x00pci, device->rtnet_dev);

    if(rt2x00_init_bbp(rt2x00pci))
        goto exit_fail;

    /*
     * Clear interrupts.
     */
    rt2x00_register_read(rt2x00pci, CSR7, &reg);
    rt2x00_register_write(rt2x00pci, CSR7, reg);

    /* Register rtdm-irq */
    retval = rtdm_irq_request(&rt2x00pci->irq_handle,
                              device->rtnet_dev->irq, 
                              rt2x00_interrupt, 0, 
                              device->rtnet_dev->name, 
                              device->rtnet_dev);

    /*
     * Enable interrupts.
     */
    rt2x00_register_read(rt2x00pci, CSR8, &reg);
    rt2x00_set_field32(&reg, CSR8_TBCN_EXPIRE, 0);
    rt2x00_set_field32(&reg, CSR8_TXDONE_TXRING, 0);
    rt2x00_set_field32(&reg, CSR8_TXDONE_ATIMRING, 0);
    rt2x00_set_field32(&reg, CSR8_TXDONE_PRIORING, 0);
    rt2x00_set_field32(&reg, CSR8_RXDONE, 0);
    rt2x00_register_write(rt2x00pci, CSR8, reg);

    rtdm_irq_enable(&rt2x00pci->irq_handle);

    return 0;

  exit_fail:
    rt2x00_pci_free_rings(device);
  
    return -ENOMEM;
}
Пример #4
0
static int
scc_enet_start_xmit(struct rtskb *skb, struct rtnet_device *rtdev)
{
	struct scc_enet_private *cep = (struct scc_enet_private *)rtdev->priv;
	volatile cbd_t	*bdp;
	rtdm_lockctx_t context;


	RT_DEBUG(__FUNCTION__": ...\n");

	/* Fill in a Tx ring entry */
	bdp = cep->cur_tx;

#ifndef final_version
	if (bdp->cbd_sc & BD_ENET_TX_READY) {
		/* Ooops.  All transmit buffers are full.  Bail out.
		 * This should not happen, since cep->tx_busy should be set.
		 */
		rtdm_printk("%s: tx queue full!.\n", rtdev->name);
		return 1;
	}
#endif

	/* Clear all of the status flags.
	 */
	bdp->cbd_sc &= ~BD_ENET_TX_STATS;

	/* If the frame is short, tell CPM to pad it.
	*/
	if (skb->len <= ETH_ZLEN)
		bdp->cbd_sc |= BD_ENET_TX_PAD;
	else
		bdp->cbd_sc &= ~BD_ENET_TX_PAD;

	/* Set buffer length and buffer pointer.
	*/
	bdp->cbd_datlen = skb->len;
	bdp->cbd_bufaddr = __pa(skb->data);

	/* Save skb pointer.
	*/
	cep->tx_skbuff[cep->skb_cur] = skb;

	cep->stats.tx_bytes += skb->len;
	cep->skb_cur = (cep->skb_cur+1) & TX_RING_MOD_MASK;
	
	/* Prevent interrupts from changing the Tx ring from underneath us. */
	// *** RTnet ***
#if 0
	rtdm_irq_disable(&cep->irq_handle);
	rtdm_lock_get(&cep->lock);
#else
	rtdm_lock_get_irqsave(&cep->lock, context);
#endif

	/* Get and patch time stamp just before the transmission */
	if (skb->xmit_stamp)
		*skb->xmit_stamp = cpu_to_be64(rtdm_clock_read() + *skb->xmit_stamp);

	/* Push the data cache so the CPM does not get stale memory
	 * data.
	 */
	flush_dcache_range((unsigned long)(skb->data),
			   (unsigned long)(skb->data + skb->len));


	/* Send it on its way.  Tell CPM its ready, interrupt when done,
	 * its the last BD of the frame, and to put the CRC on the end.
	 */
	bdp->cbd_sc |= (BD_ENET_TX_READY | BD_ENET_TX_INTR | BD_ENET_TX_LAST | BD_ENET_TX_TC);
#if 0
	dev->trans_start = jiffies;
#endif

	/* If this was the last BD in the ring, start at the beginning again.
	*/
	if (bdp->cbd_sc & BD_ENET_TX_WRAP)
		bdp = cep->tx_bd_base;
	else
		bdp++;

	if (bdp->cbd_sc & BD_ENET_TX_READY) {
	        rtnetif_stop_queue(rtdev);
		cep->tx_full = 1;
	}

	cep->cur_tx = (cbd_t *)bdp;

	// *** RTnet ***
#if 0
	rtdm_lock_put(&cep->lock);
	rtdm_irq_enable(&cep->irq_handle);
#else
	rtdm_lock_put_irqrestore(&cep->lock, context);
#endif

	return 0;
}
Пример #5
0
static int rtdm_my_isr(rtdm_irq_t *irq_context)
{

	MY_DEV *up=rtdm_irq_get_arg(irq_context,MY_DEV);

	up->systime1 = rtdm_clock_read();

	up->timeout = up->systime1 - up->systime;

	printk("Interrupt Latency=%dl\n",up->timeout);

	up->systime1=0;
	up->systime=0;

	unsigned int iir,lsr;
	unsigned int type;
	irqreturn_t ret=IRQ_NONE;
	int err;
	int max_count = 256;
	rtdm_lockctx_t context1;

	printk("I am in rtdm_my_isr......!!!\n");

	printk("Local struct up=%x\n",up);

        err = rtdm_irq_disable(&up->irq_handle);
        if(err<0)
             rtdm_printk("error in rtdm_irq_enable\n");
        rtdm_lock_get_irqsave(&up->lock,context1);

	do{
	iir = serial_in(up,UART_IIR);
	if(iir & UART_IIR_NO_INT)
		break;

	ret=IRQ_HANDLED;
	lsr = serial_in(up,UART_LSR);
	type = iir & 0x3e;
	
		switch(type)
		{
			case UART_IIR_THRI:
			printk("type of int:UART_IIR_THRI\n");
			transmit_chars(up,lsr);
			rtdm_event_signal(&up->w_event_tx);
			break;

			case UART_IIR_RX_TIMEOUT:
			/*FALLTHROUGH*/

			case UART_IIR_RDI:
				printk("type of int:UART_IIR_RDI\n");
				serial_omap_rdi(up,lsr);	
				 rtdm_event_signal(&up->w_event_rx);
				break;
			
			case UART_IIR_RLSI:
				printk("type of int:UART_IIR_RLSI\n");
//				serial_omap_rlsi(up,lsr);
				break;
			
			case UART_IIR_CTS_RTS_DSR:
				break;
			
			case UART_IIR_XOFF:
			/*simpleThrough*/
			default:
				break;
		}
	}while(!(iir & UART_IIR_NO_INT) && max_count--);

      	rtdm_lock_put_irqrestore(&up->lock,context1);
        err = rtdm_irq_enable(&up->irq_handle);
        if(err<0)
              rtdm_printk("error in rtdm_irq_enable\n");

	printk("rtdm_irq ended\n");
	
	 up->systime = rtdm_clock_read();
	
	return RTDM_IRQ_HANDLED;
}
Пример #6
0
static void serial_omap_set_termios(MY_DEV *up, unsigned int request)
{
	int val;
	unsigned char cval = 0;
	unsigned int baud, quot;
	rtdm_lockctx_t context1;
	int err;

	printk("serial_omap_set_termios\n");
	printk("Local struct up=%x\n",up);

	printk("request=%x\n",request);
	val=request & 0x03;
	printk("val=%x",val);
	switch(val)
	{
		case CS5_1:
			printk("CS5\n");
			cval = UART_LCR_WLEN5;
			break;
		
		case CS6_1:
			printk("CS6\n");
			cval = UART_LCR_WLEN6;
			break;
		
		case CS7_1:
			printk("CS7\n");
			cval = UART_LCR_WLEN7;
			break;
		default:
		case CS8_1:
			printk("CS8\n");
			cval = UART_LCR_WLEN8;
			break;
	}
	
	if(request & 0x04)
	{	printk("set two stop bits\n");
		cval |= UART_LCR_STOP;
	}

	if(request & 0x08)
	{	printk("set even patity\n");
		cval |= UART_LCR_PARITY;
	}

	if(request & 0x10)
	{	printk("set odd parity\n");
		cval |=  UART_LCR_EPAR;
	}

	val=request & 0x60;
	val = val >> 5;

	switch(val)
	{
		case BAUD_4800:
			printk("BAUD_4800\n");
			baud = 4800;
			break;
		case BAUD_9600:
			printk("BAUD_9600\n");
			baud = 9600;
			break;
		case BAUD_115200:
			printk("BAUD_115200\n");
			baud = 115200;
		default:
			printk("default\n");
			baud = 9600;
	}
//	baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/13);
	quot = serial_omap_get_divisor(up, baud);//for getting dll and dlh register value
	printk("serial_omap_get_divisor=%d\n",quot);

	up->calc_latency = (USEC_PER_SEC * up->fifosize) / (baud / 8);
	up->latency = up->calc_latency;

	up->dll = quot & 0xff;
	up->dlh = quot >> 8;
	up->mdr1 = UART_OMAP_MDR1_DISABLE;

	up->fcr = UART_FCR_R_TRIG_01 | UART_FCR_T_TRIG_01 | UART_FCR_ENABLE_FIFO;

       err = rtdm_irq_disable(&up->irq_handle);
       if(err<0)
               rtdm_printk("error in rtdm_irq_enable\n");
       rtdm_lock_get_irqsave(&up->lock,context1);

		up->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;    

//	if (termios->c_iflag & INPCK)
//		up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE;	      //Frame error indicator, Parity error indicator
//
//	if (termios->c_iflag & (BRKINT | PARMRK))
//		up->port.read_status_mask |= UART_LSR_BI;		      //Break interrupt indicator


		up->ignore_status_mask = 0;
	//this should be passed from user space
//	if (termios->c_iflag & IGNBRK) 					// IGNBRK Ignore BREAK condition on input.						
//	{
		printk("Ignore Break condition on input\n");
		up->ignore_status_mask |= UART_LSR_BI;
//	}
		
		up->ier &= ~UART_IER_MSI;
		
		serial_out(up, UART_IER, up->ier);	
		printk("Enable interrupt\n");
		serial_out(up, UART_LCR, cval);	//writing the setting to Line control register 	/* reset DLAB */
		
		up->lcr = cval;			//saving the setting of line control register
		up->scr = OMAP_UART_SCR_TX_EMPTY;	
		
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);		
		serial_out(up, UART_DLL, 0);
		serial_out(up, UART_DLM, 0);
		serial_out(up, UART_LCR, 0);
//***********************************************************************
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);    //config to mode B

		up->efr = serial_in(up, UART_EFR) & ~UART_EFR_ECB;//value of efr register without enhance function write enable bit
		up->efr &= ~UART_EFR_SCD;			  //remove special character detect enable
		serial_out(up, UART_EFR, up->efr | UART_EFR_ECB); //writing to EFR register with enhance function write enable bit

//************************************************************************************

		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);   	//config to mode A

		up->mcr = serial_in(up, UART_MCR) & ~UART_MCR_TCRTLR;	//value to TCRTLR=0(No action) if 1 then we can enable TCR and TLR
		serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR);    //writing value to the MCR with TCRTLR enable
	/* FIFO ENABLE, DMA MODE */

		up->scr |= OMAP_UART_SCR_RX_TRIG_GRANU1_MASK;		//enable the granularity of 1 for trigger RX level
		
//*******************************************************************
	/* Set receive FIFO threshold to 16 characters and
	 * transmit FIFO threshold to 16 spaces
	 */
		up->fcr &= ~OMAP_UART_FCR_RX_FIFO_TRIG_MASK;						// dont set RX_FIFO_TRIG to 60 character
		up->fcr &= ~OMAP_UART_FCR_TX_FIFO_TRIG_MASK;						//dont set TX_FIFO_TRIG to 56 character	
		up->fcr |= UART_FCR6_R_TRIGGER_16 | UART_FCR6_T_TRIGGER_24 | UART_FCR_ENABLE_FIFO;	//Rx fifo trigger at 16 character | Tx fifo trigger at 32 char | FIFO_EN		
		
		serial_out(up, UART_FCR, up->fcr);							//write to FCR
//********************************************************************
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);			//config to mode B
							
		serial_out(up, UART_OMAP_SCR, up->scr);				//writing to SCR(supplementary control register)
//*******************************************************************							
	/* Reset UART_MCR_TCRTLR: this must be done with the EFR_ECB bit set */
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);			//config mode A
		serial_out(up, UART_MCR, up->mcr);				//writing to MCR without TCRTLR
//*******************************************************************
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);			//config mode B
		serial_out(up, UART_EFR, up->efr);				//writing to EFR register without special character detect enable
//*******************************************************************
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);			//config mode A
							
	/* Protocol, Baud Rate, and Interrupt Settings */
							
		if (up->errata & UART_ERRATA_i202_MDR1_ACCESS)			//
			serial_omap_mdr1_errataset(up, up->mdr1);
		else
			serial_out(up, UART_OMAP_MDR1, up->mdr1);
//********************************************************************
		
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);			//config mode B
		serial_out(up, UART_EFR, up->efr | UART_EFR_ECB);		//writing to EFR register with special character
		
		serial_out(up, UART_LCR, 0);					//writing line control register
		serial_out(up, UART_IER, 0);					//writing to IER
//********************************************************************
		
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);			
		
		serial_out(up, UART_DLL, up->dll);	/* LS of divisor */
		serial_out(up, UART_DLM, up->dlh);	/* MS of divisor */
		
		serial_out(up, UART_LCR, 0);
		serial_out(up, UART_IER, up->ier);
//********************************************************************
		
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
		
		serial_out(up, UART_EFR, up->efr);
		serial_out(up, UART_LCR, cval);
		
		if (baud > 230400 && baud != 3000000)
		{	printk("baud > 230400\n");
			up->mdr1 = UART_OMAP_MDR1_13X_MODE;
		}
		else
		{	printk("baud < 230400\n");
			up->mdr1 = UART_OMAP_MDR1_16X_MODE;
		}
		if (up->errata & UART_ERRATA_i202_MDR1_ACCESS)	
		{	printk("up->errata condition true\n");
			serial_omap_mdr1_errataset(up, up->mdr1);
		}
		else
		{	printk("up->errata condition false\n");
			serial_out(up, UART_OMAP_MDR1, up->mdr1);
		}
//***********************************************************************

	/* Configure flow control */
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);

	/* XON1/XOFF1 accessible mode B, TCRTLR=0, ECB=0 */

//	serial_out(up, UART_XON1, termios->c_cc[VSTART]);
//	serial_out(up, UART_XOFF1, termios->c_cc[VSTOP]);

	/* Enable access to TCR/TLR */
		serial_out(up, UART_EFR, up->efr | UART_EFR_ECB);
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
		serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR);

		serial_out(up, UART_TI752_TCR, OMAP_UART_TCR_TRIG);//TCR trasmission control register value 0xFF 

	//no hardware control 
		up->efr &= ~(UART_EFR_CTS | UART_EFR_RTS);

	
		serial_out(up, UART_MCR, up->mcr);			//write to MCR 
		printk("write to UART_MCR\n");
		serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);		//write to LCR for switching to config mode B
		printk("Switch to config mode B\n");
		serial_out(up, UART_EFR, up->efr);			//write to EFR
		printk("write to EFR register\n");
		serial_out(up, UART_LCR, up->lcr);			//write to LCR
		printk("write to LCR\n");
	
      	rtdm_lock_put_irqrestore(&up->lock,context1);
        	err = rtdm_irq_enable(&up->irq_handle);
         if(err<0)
              	rtdm_printk("error in rtdm_irq_enable\n");

	printk("serial_omap_set_termios end\n");	 
}