static int pxa_irda_stop(struct net_device *dev) { struct pxa_irda *si = netdev_priv(dev); netif_stop_queue(dev); pxa_irda_shutdown(si); /* Stop IrLAP */ if (si->irlap) { irlap_close(si->irlap); si->irlap = NULL; } free_irq(IRQ_STUART, dev); free_irq(IRQ_ICP, dev); pxa_free_dma(si->rxdma); pxa_free_dma(si->txdma); if (si->dma_rx_buff) dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_tx_buff, si->dma_tx_buff_phy); if (si->dma_tx_buff) dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_rx_buff, si->dma_rx_buff_phy); printk(KERN_DEBUG "pxa_ir: irda driver closed\n"); return 0; }
static int au1k_irda_stop(struct net_device *dev) { struct au1k_private *aup = netdev_priv(dev); au1k_irda_plat_set_phy_mode(aup, AU1000_IRDA_PHY_MODE_OFF); /* disable interrupts */ irda_write(aup, IR_CONFIG_2, irda_read(aup, IR_CONFIG_2) & ~IR_IEN); irda_write(aup, IR_CONFIG_1, 0); irda_write(aup, IR_ENABLE, 0); /* disable clock */ if (aup->irlap) { irlap_close(aup->irlap); aup->irlap = NULL; } netif_stop_queue(dev); del_timer(&aup->timer); /* disable the interrupt */ free_irq(aup->irq_tx, dev); free_irq(aup->irq_rx, dev); return 0; }
/* * Function kingsun_net_close (kingsun) * * Network device is taken down. Usually this is done by * "ifconfig irda0 down" */ static int kingsun_net_close(struct net_device *netdev) { struct kingsun_cb *kingsun = netdev_priv(netdev); /* Stop transmit processing */ netif_stop_queue(netdev); /* Mop up receive && transmit urb's */ usb_kill_urb(kingsun->tx_urb); usb_kill_urb(kingsun->rx_urb); usb_free_urb(kingsun->tx_urb); usb_free_urb(kingsun->rx_urb); kingsun->tx_urb = NULL; kingsun->rx_urb = NULL; kfree_skb(kingsun->rx_buff.skb); kingsun->rx_buff.skb = NULL; kingsun->rx_buff.head = NULL; kingsun->rx_buff.in_frame = FALSE; kingsun->rx_buff.state = OUTSIDE_FRAME; kingsun->receiving = 0; /* Stop and remove instance of IrLAP */ if (kingsun->irlap) irlap_close(kingsun->irlap); kingsun->irlap = NULL; return 0; }
static int kingsun_net_close(struct net_device *netdev) { struct kingsun_cb *kingsun = netdev_priv(netdev); netif_stop_queue(netdev); usb_kill_urb(kingsun->tx_urb); usb_kill_urb(kingsun->rx_urb); usb_free_urb(kingsun->tx_urb); usb_free_urb(kingsun->rx_urb); kingsun->tx_urb = NULL; kingsun->rx_urb = NULL; kfree_skb(kingsun->rx_buff.skb); kingsun->rx_buff.skb = NULL; kingsun->rx_buff.head = NULL; kingsun->rx_buff.in_frame = FALSE; kingsun->rx_buff.state = OUTSIDE_FRAME; kingsun->receiving = 0; if (kingsun->irlap) irlap_close(kingsun->irlap); kingsun->irlap = NULL; return 0; }
static int pxa250_irda_stop(struct net_device *dev) { struct pxa250_irda *si = dev->priv; printk(KERN_ERR "Irda stop... RX = %d TX = %d\n",rx_count,tx_count); disable_irq(dev->irq); disable_irq(si->fir_irq); /* pxa250_irda_shutdown(si); */ /* * If we have been doing DMA receive, make sure we * tidy that up cleanly. */ if (si->rxskb) { dev_kfree_skb(si->rxskb); si->rxskb = NULL; } /* Stop IrLAP */ if (si->irlap) { irlap_close(si->irlap); si->irlap = NULL; } consistent_free (si->txbuf_dma_virt,HPSIR_MAX_TXLEN,si->txbuf_dma); consistent_free (si->rxbuf_dma_virt,HPSIR_MAX_RXLEN,si->rxbuf_dma); pxa_free_dma(si->txdma_ch); pxa_free_dma(si->rxdma_ch); netif_stop_queue(dev); si->open = 0; /* * Free resources */ free_irq(dev->irq, dev); free_irq(si->fir_irq, dev); MOD_DEC_USE_COUNT; return 0; }
static int sa1100_irda_stop(struct net_device *dev) { struct sa1100_irda *si = dev->priv; disable_irq(dev->irq); sa1100_irda_shutdown(si); /* * If we have been doing DMA receive, make sure we * tidy that up cleanly. */ if (si->rxskb) { pci_unmap_single(NULL, si->rxbuf_dma, HPSIR_MAX_RXLEN, PCI_DMA_FROMDEVICE); dev_kfree_skb(si->rxskb); si->rxskb = NULL; } /* Stop IrLAP */ if (si->irlap) { irlap_close(si->irlap); si->irlap = NULL; } netif_stop_queue(dev); si->open = 0; /* * Free resources */ sa1100_free_dma(si->txdma); sa1100_free_dma(si->rxdma); free_irq(dev->irq, dev); sa1100_set_power(si, 0); MOD_DEC_USE_COUNT; return 0; }
static int bfin_sir_stop(struct net_device *dev) { struct bfin_sir_self *self = netdev_priv(dev); flush_work(&self->work); bfin_sir_shutdown(self->sir_port, dev); if (self->rxskb) { dev_kfree_skb(self->rxskb); self->rxskb = NULL; } /* Stop IrLAP */ if (self->irlap) { irlap_close(self->irlap); self->irlap = NULL; } netif_stop_queue(dev); self->open = 0; return 0; }
static int au1k_irda_stop(struct net_device *dev) { struct au1k_private *aup = netdev_priv(dev); /* disable interrupts */ writel(read_ir_reg(IR_CONFIG_2) & ~(1<<8), IR_CONFIG_2); writel(0, IR_CONFIG_1); writel(0, IR_INTERFACE_CONFIG); /* disable clock */ au_sync(); if (aup->irlap) { irlap_close(aup->irlap); aup->irlap = NULL; } netif_stop_queue(dev); del_timer(&aup->timer); /* disable the interrupt */ free_irq(AU1000_IRDA_TX_INT, dev); free_irq(AU1000_IRDA_RX_INT, dev); return 0; }
static int omap_irda_stop(struct net_device *dev) { struct omap_irda *omap_ir = netdev_priv(dev); disable_irq(dev->irq); netif_stop_queue(dev); omap_free_dma(omap_ir->rx_dma_channel); omap_free_dma(omap_ir->tx_dma_channel); if (omap_ir->rx_buf_dma_virt) dma_free_coherent(NULL, IRDA_SKB_MAX_MTU, omap_ir->rx_buf_dma_virt, omap_ir->rx_buf_dma_phys); if (omap_ir->tx_buf_dma_virt) dma_free_coherent(NULL, IRDA_SIR_MAX_FRAME, omap_ir->tx_buf_dma_virt, omap_ir->tx_buf_dma_phys); omap_irda_shutdown(omap_ir); /* Stop IrLAP */ if (omap_ir->irlap) { irlap_close(omap_ir->irlap); omap_ir->irlap = NULL; } omap_ir->open = 0; /* * Free resources */ free_irq(dev->irq, dev); return 0; }
static int omap1610_irda_stop(struct net_device *dev) { struct omap1610_irda *si = dev->priv; __ECHO_IN; disable_irq(dev->irq); netif_stop_queue(dev); omap_free_dma(si->rx_dma_channel); omap_free_dma(si->tx_dma_channel); dma_free_coherent(NULL, 4096, si->rx_buf_dma_virt, si->rx_buf_dma_phys); dma_free_coherent(NULL, 4096, si->tx_buf_dma_virt, si->tx_buf_dma_phys); omap1610_irda_shutdown(si); /* Stop IrLAP */ if (si->irlap) { irlap_close(si->irlap); si->irlap = NULL; } si->open = 0; /* * Free resources */ free_irq(dev->irq, dev); __ECHO_OUT; return 0; }
/* * This function is called when IFF_UP flag has been cleared by the user via * the ifconfig irda0 down command. This function stops any further * transmissions being queued, and then disables the interrupts. * Finally it resets the device. * @param dev the net_device structure * * @return int the function always returns 0 indicating a success. */ static int mxc_irda_stop(struct net_device *dev) { struct mxc_irda *si = netdev_priv(dev); unsigned long flags; /* Stop IrLAP */ if (si->irlap) { irlap_close(si->irlap); si->irlap = NULL; } netif_stop_queue(dev); /*Save flags and disable the IrDA interrupts.. */ if (si->open) { local_irq_save(flags); disable_irq(si->uart_irq); local_irq_restore(flags); free_irq(si->uart_irq, dev); mxc_irda_shutdown(si); si->open = 0; } return 0; }
/* * Function kingsun_net_open (dev) * * Network device is taken up. Usually this is done by "ifconfig irda0 up" */ static int kingsun_net_open(struct net_device *netdev) { struct kingsun_cb *kingsun = netdev_priv(netdev); int err = -ENOMEM; char hwname[16]; /* At this point, urbs are NULL, and skb is NULL (see kingsun_probe) */ kingsun->receiving = 0; /* Initialize for SIR to copy data directly into skb. */ kingsun->rx_buff.in_frame = FALSE; kingsun->rx_buff.state = OUTSIDE_FRAME; kingsun->rx_buff.truesize = IRDA_SKB_MAX_MTU; kingsun->rx_buff.skb = dev_alloc_skb(IRDA_SKB_MAX_MTU); if (!kingsun->rx_buff.skb) goto free_mem; skb_reserve(kingsun->rx_buff.skb, 1); kingsun->rx_buff.head = kingsun->rx_buff.skb->data; do_gettimeofday(&kingsun->rx_time); kingsun->rx_urb = usb_alloc_urb(0, GFP_KERNEL); if (!kingsun->rx_urb) goto free_mem; kingsun->tx_urb = usb_alloc_urb(0, GFP_KERNEL); if (!kingsun->tx_urb) goto free_mem; /* * Now that everything should be initialized properly, * Open new IrLAP layer instance to take care of us... */ sprintf(hwname, "usb#%d", kingsun->usbdev->devnum); kingsun->irlap = irlap_open(netdev, &kingsun->qos, hwname); if (!kingsun->irlap) { dev_err(&kingsun->usbdev->dev, "irlap_open failed\n"); goto free_mem; } /* Start first reception */ usb_fill_int_urb(kingsun->rx_urb, kingsun->usbdev, usb_rcvintpipe(kingsun->usbdev, kingsun->ep_in), kingsun->in_buf, kingsun->max_rx, kingsun_rcv_irq, kingsun, 1); kingsun->rx_urb->status = 0; err = usb_submit_urb(kingsun->rx_urb, GFP_KERNEL); if (err) { dev_err(&kingsun->usbdev->dev, "first urb-submit failed: %d\n", err); goto close_irlap; } netif_start_queue(netdev); /* Situation at this point: - all work buffers allocated - urbs allocated and ready to fill - max rx packet known (in max_rx) - unwrap state machine initialized, in state outside of any frame - receive request in progress - IrLAP layer started, about to hand over packets to send */ return 0; close_irlap: irlap_close(kingsun->irlap); free_mem: if (kingsun->tx_urb) { usb_free_urb(kingsun->tx_urb); kingsun->tx_urb = NULL; } if (kingsun->rx_urb) { usb_free_urb(kingsun->rx_urb); kingsun->rx_urb = NULL; } if (kingsun->rx_buff.skb) { kfree_skb(kingsun->rx_buff.skb); kingsun->rx_buff.skb = NULL; kingsun->rx_buff.head = NULL; } return err; }
/* * Function kingsun_net_open (dev) * * Network device is taken up. Usually this is done by "ifconfig irda0 up" */ static int ks959_net_open(struct net_device *netdev) { struct ks959_cb *kingsun = netdev_priv(netdev); int err = -ENOMEM; char hwname[16]; /* At this point, urbs are NULL, and skb is NULL (see kingsun_probe) */ kingsun->receiving = 0; /* Initialize for SIR to copy data directly into skb. */ kingsun->rx_unwrap_buff.in_frame = FALSE; kingsun->rx_unwrap_buff.state = OUTSIDE_FRAME; kingsun->rx_unwrap_buff.truesize = IRDA_SKB_MAX_MTU; kingsun->rx_unwrap_buff.skb = dev_alloc_skb(IRDA_SKB_MAX_MTU); if (!kingsun->rx_unwrap_buff.skb) goto free_mem; skb_reserve(kingsun->rx_unwrap_buff.skb, 1); kingsun->rx_unwrap_buff.head = kingsun->rx_unwrap_buff.skb->data; do_gettimeofday(&kingsun->rx_time); kingsun->rx_urb = usb_alloc_urb(0, GFP_KERNEL); if (!kingsun->rx_urb) goto free_mem; kingsun->tx_urb = usb_alloc_urb(0, GFP_KERNEL); if (!kingsun->tx_urb) goto free_mem; kingsun->speed_urb = usb_alloc_urb(0, GFP_KERNEL); if (!kingsun->speed_urb) goto free_mem; /* Initialize speed for dongle */ kingsun->new_speed = 9600; err = ks959_change_speed(kingsun, 9600); if (err < 0) goto free_mem; /* * Now that everything should be initialized properly, * Open new IrLAP layer instance to take care of us... */ sprintf(hwname, "usb#%d", kingsun->usbdev->devnum); kingsun->irlap = irlap_open(netdev, &kingsun->qos, hwname); if (!kingsun->irlap) { err("ks959-sir: irlap_open failed"); goto free_mem; } /* Start reception. Setup request already pre-filled in ks959_probe */ usb_fill_control_urb(kingsun->rx_urb, kingsun->usbdev, usb_rcvctrlpipe(kingsun->usbdev, 0), (unsigned char *)kingsun->rx_setuprequest, kingsun->rx_buf, KINGSUN_RCV_FIFO_SIZE, ks959_rcv_irq, kingsun); kingsun->rx_urb->status = 0; err = usb_submit_urb(kingsun->rx_urb, GFP_KERNEL); if (err) { err("ks959-sir: first urb-submit failed: %d", err); goto close_irlap; } netif_start_queue(netdev); /* Situation at this point: - all work buffers allocated - urbs allocated and ready to fill - max rx packet known (in max_rx) - unwrap state machine initialized, in state outside of any frame - receive request in progress - IrLAP layer started, about to hand over packets to send */ return 0; close_irlap: irlap_close(kingsun->irlap); free_mem: usb_free_urb(kingsun->speed_urb); kingsun->speed_urb = NULL; usb_free_urb(kingsun->tx_urb); kingsun->tx_urb = NULL; usb_free_urb(kingsun->rx_urb); kingsun->rx_urb = NULL; if (kingsun->rx_unwrap_buff.skb) { kfree_skb(kingsun->rx_unwrap_buff.skb); kingsun->rx_unwrap_buff.skb = NULL; kingsun->rx_unwrap_buff.head = NULL; } return err; }
static int kingsun_net_open(struct net_device *netdev) { struct kingsun_cb *kingsun = netdev_priv(netdev); int err = -ENOMEM; char hwname[16]; kingsun->receiving = 0; kingsun->rx_buff.in_frame = FALSE; kingsun->rx_buff.state = OUTSIDE_FRAME; kingsun->rx_buff.truesize = IRDA_SKB_MAX_MTU; kingsun->rx_buff.skb = dev_alloc_skb(IRDA_SKB_MAX_MTU); if (!kingsun->rx_buff.skb) goto free_mem; skb_reserve(kingsun->rx_buff.skb, 1); kingsun->rx_buff.head = kingsun->rx_buff.skb->data; do_gettimeofday(&kingsun->rx_time); kingsun->rx_urb = usb_alloc_urb(0, GFP_KERNEL); if (!kingsun->rx_urb) goto free_mem; kingsun->tx_urb = usb_alloc_urb(0, GFP_KERNEL); if (!kingsun->tx_urb) goto free_mem; sprintf(hwname, "usb#%d", kingsun->usbdev->devnum); kingsun->irlap = irlap_open(netdev, &kingsun->qos, hwname); if (!kingsun->irlap) { err("kingsun-sir: irlap_open failed"); goto free_mem; } usb_fill_int_urb(kingsun->rx_urb, kingsun->usbdev, usb_rcvintpipe(kingsun->usbdev, kingsun->ep_in), kingsun->in_buf, kingsun->max_rx, kingsun_rcv_irq, kingsun, 1); kingsun->rx_urb->status = 0; err = usb_submit_urb(kingsun->rx_urb, GFP_KERNEL); if (err) { err("kingsun-sir: first urb-submit failed: %d", err); goto close_irlap; } netif_start_queue(netdev); return 0; close_irlap: irlap_close(kingsun->irlap); free_mem: if (kingsun->tx_urb) { usb_free_urb(kingsun->tx_urb); kingsun->tx_urb = NULL; } if (kingsun->rx_urb) { usb_free_urb(kingsun->rx_urb); kingsun->rx_urb = NULL; } if (kingsun->rx_buff.skb) { kfree_skb(kingsun->rx_buff.skb); kingsun->rx_buff.skb = NULL; kingsun->rx_buff.head = NULL; } return err; }