Commit 70fc5bc5 authored by Stephen Hemminger's avatar Stephen Hemminger

[IRDA]: Convert smsc-ircc2 to alloc_irdadev().

parent 6fc0b384
...@@ -141,9 +141,7 @@ static const char *driver_name = "smsc-ircc2"; ...@@ -141,9 +141,7 @@ static const char *driver_name = "smsc-ircc2";
static int smsc_ircc_open(unsigned int firbase, unsigned int sirbase, u8 dma, u8 irq); static int smsc_ircc_open(unsigned int firbase, unsigned int sirbase, u8 dma, u8 irq);
static int smsc_ircc_present(unsigned int fir_base, unsigned int sir_base); static int smsc_ircc_present(unsigned int fir_base, unsigned int sir_base);
static void smsc_ircc_setup_io(struct smsc_ircc_cb *self, unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq); static void smsc_ircc_setup_io(struct smsc_ircc_cb *self, unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq);
static int smsc_ircc_setup_buffers(struct smsc_ircc_cb *self);
static void smsc_ircc_setup_qos(struct smsc_ircc_cb *self); static void smsc_ircc_setup_qos(struct smsc_ircc_cb *self);
static int smsc_ircc_setup_netdev(struct smsc_ircc_cb *self);
static void smsc_ircc_init_chip(struct smsc_ircc_cb *self); static void smsc_ircc_init_chip(struct smsc_ircc_cb *self);
static int __exit smsc_ircc_close(struct smsc_ircc_cb *self); static int __exit smsc_ircc_close(struct smsc_ircc_cb *self);
static int smsc_ircc_dma_receive(struct smsc_ircc_cb *self, int iobase); static int smsc_ircc_dma_receive(struct smsc_ircc_cb *self, int iobase);
...@@ -163,7 +161,6 @@ static void smsc_ircc_sir_stop(struct smsc_ircc_cb *self); ...@@ -163,7 +161,6 @@ static void smsc_ircc_sir_stop(struct smsc_ircc_cb *self);
#endif #endif
static void smsc_ircc_sir_write_wakeup(struct smsc_ircc_cb *self); static void smsc_ircc_sir_write_wakeup(struct smsc_ircc_cb *self);
static int smsc_ircc_sir_write(int iobase, int fifo_size, __u8 *buf, int len); static int smsc_ircc_sir_write(int iobase, int fifo_size, __u8 *buf, int len);
static int smsc_ircc_net_init(struct net_device *dev);
static int smsc_ircc_net_open(struct net_device *dev); static int smsc_ircc_net_open(struct net_device *dev);
static int smsc_ircc_net_close(struct net_device *dev); static int smsc_ircc_net_close(struct net_device *dev);
static int smsc_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); static int smsc_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
...@@ -366,6 +363,7 @@ int __init smsc_ircc_init(void) ...@@ -366,6 +363,7 @@ int __init smsc_ircc_init(void)
static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq) static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq)
{ {
struct smsc_ircc_cb *self; struct smsc_ircc_cb *self;
struct net_device *dev;
int err; int err;
IRDA_DEBUG(1, "%s\n", __FUNCTION__); IRDA_DEBUG(1, "%s\n", __FUNCTION__);
...@@ -383,21 +381,61 @@ static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u ...@@ -383,21 +381,61 @@ static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u
/* /*
* Allocate new instance of the driver * Allocate new instance of the driver
*/ */
self = kmalloc(sizeof(struct smsc_ircc_cb), GFP_KERNEL); dev = alloc_irdadev(sizeof(struct smsc_ircc_cb));
if (self == NULL) { if (!dev) {
ERROR("%s, Can't allocate memory for control block!\n", WARNING("%s() can't allocate net device\n", __FUNCTION__);
driver_name);
goto err_out1; goto err_out1;
} }
memset(self, 0, sizeof(struct smsc_ircc_cb));
SET_MODULE_OWNER(dev);
dev->hard_start_xmit = smsc_ircc_hard_xmit_sir;
#if SMSC_IRCC2_C_NET_TIMEOUT
dev->tx_timeout = smsc_ircc_timeout;
dev->watchdog_timeo = HZ*2; /* Allow enough time for speed change */
#endif
dev->open = smsc_ircc_net_open;
dev->stop = smsc_ircc_net_close;
dev->do_ioctl = smsc_ircc_net_ioctl;
dev->get_stats = smsc_ircc_net_get_stats;
self = dev->priv;
self->netdev = dev;
/* Make ifconfig display some details */
dev->base_addr = self->io.fir_base = fir_base;
dev->irq = self->io.irq = irq;
/* Need to store self somewhere */ /* Need to store self somewhere */
dev_self[dev_count++] = self; dev_self[dev_count++] = self;
spin_lock_init(&self->lock); spin_lock_init(&self->lock);
err = smsc_ircc_setup_buffers(self); self->rx_buff.truesize = SMSC_IRCC2_RX_BUFF_TRUESIZE;
if(err) self->tx_buff.truesize = SMSC_IRCC2_TX_BUFF_TRUESIZE;
goto err_out1;
self->rx_buff.head = (u8 *) kmalloc(self->rx_buff.truesize,
GFP_KERNEL|GFP_DMA);
if (self->rx_buff.head == NULL) {
ERROR("%s, Can't allocate memory for receive buffer!\n",
driver_name);
goto err_out2;
}
self->tx_buff.head = (u8 *) kmalloc(self->tx_buff.truesize,
GFP_KERNEL|GFP_DMA);
if (self->tx_buff.head == NULL) {
ERROR("%s, Can't allocate memory for transmit buffer!\n",
driver_name);
goto err_out3;
}
memset(self->rx_buff.head, 0, self->rx_buff.truesize);
memset(self->tx_buff.head, 0, self->tx_buff.truesize);
self->rx_buff.in_frame = FALSE;
self->rx_buff.state = OUTSIDE_FRAME;
self->tx_buff.data = self->tx_buff.head;
self->rx_buff.data = self->rx_buff.head;
smsc_ircc_setup_io(self, fir_base, sir_base, dma, irq); smsc_ircc_setup_io(self, fir_base, sir_base, dma, irq);
...@@ -413,17 +451,27 @@ static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u ...@@ -413,17 +451,27 @@ static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u
else else
smsc_ircc_probe_transceiver(self); smsc_ircc_probe_transceiver(self);
err = register_netdev(self->netdev);
err = smsc_ircc_setup_netdev(self); if(err) {
if(err) ERROR("%s, Network device registration failed!\n",
goto err_out1; driver_name);
goto err_out4;
}
self->pmdev = pm_register(PM_SYS_DEV, PM_SYS_IRDA, smsc_ircc_pmproc); self->pmdev = pm_register(PM_SYS_DEV, PM_SYS_IRDA, smsc_ircc_pmproc);
if (self->pmdev) if (self->pmdev)
self->pmdev->data = self; self->pmdev->data = self;
return 0; MESSAGE("IrDA: Registered device %s\n", dev->name);
return 0;
err_out4:
kfree(self->tx_buff.head);
err_out3:
kfree(self->rx_buff.head);
err_out2:
free_netdev(self->netdev);
dev_self[--dev_count] = NULL;
err_out1: err_out1:
release_region(fir_base, SMSC_IRCC2_FIR_CHIP_IO_EXTENT); release_region(fir_base, SMSC_IRCC2_FIR_CHIP_IO_EXTENT);
release_region(sir_base, SMSC_IRCC2_SIR_CHIP_IO_EXTENT); release_region(sir_base, SMSC_IRCC2_SIR_CHIP_IO_EXTENT);
...@@ -455,7 +503,6 @@ static int smsc_ircc_present(unsigned int fir_base, unsigned int sir_base) ...@@ -455,7 +503,6 @@ static int smsc_ircc_present(unsigned int fir_base, unsigned int sir_base)
goto out2; goto out2;
} }
register_bank(fir_base, 3); register_bank(fir_base, 3);
high = inb(fir_base+IRCC_ID_HIGH); high = inb(fir_base+IRCC_ID_HIGH);
...@@ -471,7 +518,6 @@ static int smsc_ircc_present(unsigned int fir_base, unsigned int sir_base) ...@@ -471,7 +518,6 @@ static int smsc_ircc_present(unsigned int fir_base, unsigned int sir_base)
__FUNCTION__, fir_base); __FUNCTION__, fir_base);
goto out3; goto out3;
} }
MESSAGE("SMsC IrDA Controller found\n IrCC version %d.%d, " MESSAGE("SMsC IrDA Controller found\n IrCC version %d.%d, "
"firport 0x%03x, sirport 0x%03x dma=%d, irq=%d\n", "firport 0x%03x, sirport 0x%03x dma=%d, irq=%d\n",
chip & 0x0f, version, fir_base, sir_base, dma, irq); chip & 0x0f, version, fir_base, sir_base, dma, irq);
...@@ -485,47 +531,6 @@ static int smsc_ircc_present(unsigned int fir_base, unsigned int sir_base) ...@@ -485,47 +531,6 @@ static int smsc_ircc_present(unsigned int fir_base, unsigned int sir_base)
return -ENODEV; return -ENODEV;
} }
/*
* Function smsc_ircc_setup_buffers(self)
*
* Setup RX/TX buffers
*
*/
static int smsc_ircc_setup_buffers(struct smsc_ircc_cb *self)
{
self->rx_buff.truesize = SMSC_IRCC2_RX_BUFF_TRUESIZE;
self->tx_buff.truesize = SMSC_IRCC2_TX_BUFF_TRUESIZE;
self->rx_buff.head = (u8 *) kmalloc(self->rx_buff.truesize,
GFP_KERNEL|GFP_DMA);
if (self->rx_buff.head == NULL) {
ERROR("%s, Can't allocate memory for receive buffer!\n",
driver_name);
kfree(self);
return -ENOMEM;
}
self->tx_buff.head = (u8 *) kmalloc(self->tx_buff.truesize,
GFP_KERNEL|GFP_DMA);
if (self->tx_buff.head == NULL) {
ERROR("%s, Can't allocate memory for transmit buffer!\n",
driver_name);
kfree(self->rx_buff.head);
kfree(self);
return -ENOMEM;
}
memset(self->rx_buff.head, 0, self->rx_buff.truesize);
memset(self->tx_buff.head, 0, self->tx_buff.truesize);
self->rx_buff.in_frame = FALSE;
self->rx_buff.state = OUTSIDE_FRAME;
self->tx_buff.data = self->tx_buff.head;
self->rx_buff.data = self->rx_buff.head;
return 0;
}
/* /*
* Function smsc_ircc_setup_io(self, fir_base, sir_base, dma, irq) * Function smsc_ircc_setup_io(self, fir_base, sir_base, dma, irq)
* *
...@@ -636,57 +641,6 @@ static void smsc_ircc_init_chip(struct smsc_ircc_cb *self) ...@@ -636,57 +641,6 @@ static void smsc_ircc_init_chip(struct smsc_ircc_cb *self)
outb(0x00, iobase+IRCC_MASTER); outb(0x00, iobase+IRCC_MASTER);
} }
/*
* Function smsc_ircc_setup_netdev(self)
*
* Alloc and setup network device
*
*/
static int smsc_ircc_setup_netdev(struct smsc_ircc_cb *self)
{
struct net_device *dev;
int err;
/* Alloc netdev */
if (!(dev = dev_alloc("irda%d", &err))) {
ERROR("%s(), dev_alloc() failed!\n", __FUNCTION__);
kfree(self->tx_buff.head);
kfree(self->rx_buff.head);
kfree(self);
return -ENOMEM;
}
dev->priv = (void *) self;
self->netdev = dev;
dev->init = smsc_ircc_net_init;
dev->hard_start_xmit = smsc_ircc_hard_xmit_sir;
#if SMSC_IRCC2_C_NET_TIMEOUT
dev->tx_timeout = smsc_ircc_timeout;
dev->watchdog_timeo = HZ*2; /* Allow enough time for speed change */
#endif
dev->open = smsc_ircc_net_open;
dev->stop = smsc_ircc_net_close;
dev->do_ioctl = smsc_ircc_net_ioctl;
dev->get_stats = smsc_ircc_net_get_stats;
/* Make ifconfig display some details */
dev->base_addr = self->io.fir_base;
dev->irq = self->io.irq;
err = register_netdev(dev);
if (err) {
ERROR("%s(), register_netdev() failed!\n", __FUNCTION__);
kfree(self->tx_buff.head);
kfree(self->rx_buff.head);
kfree(self);
return -ENODEV;
}
MESSAGE("IrDA: Registered device %s\n", dev->name);
return 0;
}
/* /*
* Function smsc_ircc_net_ioctl (dev, rq, cmd) * Function smsc_ircc_net_ioctl (dev, rq, cmd)
* *
...@@ -1571,18 +1525,6 @@ static int ircc_is_receiving(struct smsc_ircc_cb *self) ...@@ -1571,18 +1525,6 @@ static int ircc_is_receiving(struct smsc_ircc_cb *self)
} }
#endif /* unused */ #endif /* unused */
static int smsc_ircc_net_init(struct net_device *dev)
{
/* Keep track of module usage */
SET_MODULE_OWNER(dev);
/* Set up to be a normal IrDA network device driver */
irda_device_setup(dev);
/* Insert overrides below this line! */
return 0;
}
/* /*
* Function smsc_ircc_net_open (dev) * Function smsc_ircc_net_open (dev)
...@@ -1745,8 +1687,7 @@ static int __exit smsc_ircc_close(struct smsc_ircc_cb *self) ...@@ -1745,8 +1687,7 @@ static int __exit smsc_ircc_close(struct smsc_ircc_cb *self)
pm_unregister(self->pmdev); pm_unregister(self->pmdev);
/* Remove netdevice */ /* Remove netdevice */
if (self->netdev) unregister_netdev(self->netdev);
unregister_netdev(self->netdev);
/* Make sure the irq handler is not exectuting */ /* Make sure the irq handler is not exectuting */
spin_lock_irqsave(&self->lock, flags); spin_lock_irqsave(&self->lock, flags);
...@@ -1781,7 +1722,7 @@ static int __exit smsc_ircc_close(struct smsc_ircc_cb *self) ...@@ -1781,7 +1722,7 @@ static int __exit smsc_ircc_close(struct smsc_ircc_cb *self)
if (self->rx_buff.head) if (self->rx_buff.head)
kfree(self->rx_buff.head); kfree(self->rx_buff.head);
kfree(self); free_netdev(self->netdev);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment