[05/22] Cyclades PC300 driver: update to use new HDLC interface

From: Andrea Shepard
Date: Sun Jan 29 2012 - 21:48:27 EST


The Cyclades 4.1.0 driver was written for a very old version of the kernel
HDLC code; this updates it to work with the current version. As with several
others, this patch contains some style violations generated by edits to lines
with pre-existing violations; fixes for these are combined into a separate
cleanup patch (patch #15 of this series).

Signed-off-by: Andrea Shepard <andrea@xxxxxxxxxxxxxxxxxxx>

diff --git a/drivers/net/wan/pc300.h b/drivers/net/wan/pc300.h
index ad52c85..3a73833 100644
--- a/drivers/net/wan/pc300.h
+++ b/drivers/net/wan/pc300.h
@@ -315,7 +315,6 @@ typedef struct pc300patterntst {
} pc300patterntst_t;

typedef struct pc300dev {
- void *if_ptr; /* General purpose pointer */
struct pc300ch *chan;
u8 trace_on;
u32 line_on; /* DCD(X.21, RSV) / sync(TE) change counters */
@@ -323,12 +322,10 @@ typedef struct pc300dev {
#ifdef __KERNEL__
char name[16];
hdlc_device *hdlc;
+ struct net_device *netdev;

void *private;
struct sk_buff *tx_skb;
- union { /* This union has all the protocol-specific structures */
- struct ppp_device pppdev;
- }ifu;
#ifdef CONFIG_PC300_MLPPP
void *cpc_tty; /* information to PC300 TTY driver */
#endif
diff --git a/drivers/net/wan/pc300_drv.c b/drivers/net/wan/pc300_drv.c
index 5cec02b..ec1964b 100644
--- a/drivers/net/wan/pc300_drv.c
+++ b/drivers/net/wan/pc300_drv.c
@@ -227,10 +227,9 @@ static char rcsid[] =
#include <linux/skbuff.h>
#include <linux/if_arp.h>
#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
#include <linux/spinlock.h>
#include <linux/if.h>
-
-#include <net/syncppp.h>
#include <net/arp.h>

#include <asm/io.h>
@@ -367,6 +366,18 @@ void cpc_tty_trigger_poll(pc300dev_t * pc300dev);
void cpc_tty_reset_var(void);
#endif

+static const struct net_device_ops pc300_netdev_ops = {
+ .ndo_change_mtu = cpc_change_mtu,
+ .ndo_do_ioctl = cpc_ioctl,
+ .ndo_get_stats = cpc_get_stats,
+ .ndo_open = cpc_open,
+ .ndo_set_mac_address = NULL,
+ .ndo_start_xmit = cpc_queue_xmit,
+ .ndo_stop = cpc_close,
+ .ndo_tx_timeout = cpc_tx_timeout,
+ .ndo_validate_addr = NULL
+};
+
/************************/
/*** DMA Routines ***/
/************************/
@@ -1840,10 +1851,10 @@ cpc_trace(struct net_device *dev, struct sk_buff *skb_main, char rx_tx)

static void cpc_tx_timeout(struct net_device *dev)
{
- pc300dev_t *d = (pc300dev_t *) dev->priv;
+ pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv;
pc300ch_t *chan = (pc300ch_t *) d->chan;
pc300_t *card = (pc300_t *) chan->card;
- struct net_device_stats *stats = &d->hdlc->stats;
+ struct net_device_stats *stats = &(dev->stats);
int ch = chan->channel;
unsigned long flags;
u8 ilar;
@@ -1868,10 +1879,10 @@ static void cpc_tx_timeout(struct net_device *dev)

static int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev)
{
- pc300dev_t *d = (pc300dev_t *) dev->priv;
+ pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv;
pc300ch_t *chan = (pc300ch_t *) d->chan;
pc300_t *card = (pc300_t *) chan->card;
- struct net_device_stats *stats = &d->hdlc->stats;
+ struct net_device_stats *stats = &(dev->stats);
int ch = chan->channel;
unsigned long flags;
#ifdef PC300_DEBUG_TX
@@ -1951,11 +1962,10 @@ static int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev)

static void cpc_net_rx(struct net_device *dev)
{
- struct net_device *dev = hdlc_to_dev(hdlc);
- pc300dev_t *d = (pc300dev_t *) dev->priv;
+ pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv;
pc300ch_t *chan = (pc300ch_t *) d->chan;
pc300_t *card = (pc300_t *) chan->card;
- struct net_device_stats *stats = &d->hdlc->stats;
+ struct net_device_stats *stats = &(dev->stats);
int ch = chan->channel;
#ifdef PC300_DEBUG_RX
int i;
@@ -2044,7 +2054,7 @@ static void sca_tx_intr(pc300dev_t *dev)
pc300_t *card = (pc300_t *)chan->card;
int ch = chan->channel;
volatile pcsca_bd_t * ptdescr;
- struct net_device_stats *stats = &dev->hdlc->stats;
+ struct net_device_stats *stats = &(dev->netdev->stats);

/* Clean up descriptors from previous transmission */
ptdescr = (pcsca_bd_t *)(card->hw.rambase +
@@ -2068,7 +2078,7 @@ static void sca_tx_intr(pc300dev_t *dev)
} else {
#endif
/* Tell the upper layer we are ready to transmit more packets */
- netif_wake_queue((struct net_device*)dev->hdlc);
+ netif_wake_queue(dev->netdev);
#ifdef CONFIG_PC300_MLPPP
}
#endif
@@ -2086,8 +2096,7 @@ static void sca_intr(pc300_t * card)
for (ch = 0; ch < card->hw.nchan; ch++) {
pc300ch_t *chan = &card->chan[ch];
pc300dev_t *d = &chan->d;
- hdlc_device *hdlc = d->hdlc;
- struct net_device *dev = hdlc_to_dev(hdlc);
+ struct net_device *dev = d->netdev;

spin_lock(&card->card_lock);

@@ -2118,10 +2127,10 @@ static void sca_intr(pc300_t * card)
if ((cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
rx_dma_stop(card, ch);
}
- cpc_net_rx(hdlc);
+ cpc_net_rx(dev);
/* Discard invalid frames */
- hdlc->stats.rx_errors++;
- hdlc->stats.rx_over_errors++;
+ dev->stats.rx_errors++;
+ dev->stats.rx_over_errors++;
chan->rx_first_bd = 0;
chan->rx_last_bd = N_DMA_RX_BUF - 1;
rx_dma_start(card, ch);
@@ -2142,10 +2151,10 @@ static void sca_intr(pc300_t * card)
/* verify if driver is TTY */
cpc_tty_receive(d);
} else {
- cpc_net_rx(hdlc);
+ cpc_net_rx(dev);
}
#else
- cpc_net_rx(hdlc);
+ cpc_net_rx(dev);
#endif
if (card->hw.type == PC300_TE) {
cpc_writeb(card->hw.falcbase +
@@ -2187,8 +2196,8 @@ static void sca_intr(pc300_t * card)
card->hw.cpld_reg2) &
~ (CPLD_REG2_FALC_LED1 << (2 * ch)));
}
- hdlc->stats.tx_errors++;
- hdlc->stats.tx_fifo_errors++;
+ dev->stats.tx_errors++;
+ dev->stats.tx_fifo_errors++;
sca_tx_intr(d);
}
}
@@ -2605,8 +2614,7 @@ static int cpc_change_mtu(struct net_device *dev, int new_mtu)

static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
- hdlc_device *hdlc = dev_to_hdlc(dev);
- pc300dev_t *d = (pc300dev_t *) dev->priv;
+ pc300dev_t *d = (pc300dev_t *) (dev_to_hdlc(dev))->priv;
pc300ch_t *chan = (pc300ch_t *) d->chan;
pc300_t *card = (pc300_t *) chan->card;
pc300conf_t conf_aux;
@@ -2623,10 +2631,10 @@ static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
case SIOCGPC300CONF:
#ifdef CONFIG_PC300_MLPPP
if (conf->proto != PC300_PROTO_MLPPP) {
- conf->proto = hdlc->proto.id;
+ conf->proto = 0;
}
#else
- conf->proto = hdlc->proto.id;
+ conf->proto = 0;
#endif
memcpy(&conf_aux.conf, conf, sizeof(pc300chconf_t));
memcpy(&conf_aux.hw, &card->hw, sizeof(pc300hw_t));
@@ -2659,12 +2667,10 @@ static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
}
} else {
memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t));
- hdlc->proto.id = conf->proto;
}
}
#else
memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t));
- hdlc->proto.id = conf->proto;
#endif
return 0;
case SIOCGPC300STATUS:
@@ -2677,7 +2683,7 @@ static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
case SIOCGPC300UTILSTATS:
{
if (!arg) { /* clear statistics */
- memset(&hdlc->stats, 0, sizeof(struct net_device_stats));
+ memset(&dev->stats, 0, sizeof(dev->stats));
if (card->hw.type == PC300_TE) {
memset(&chan->falc, 0, sizeof(falc_t));
}
@@ -2688,7 +2694,7 @@ static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
pc300stats.hw_type = card->hw.type;
pc300stats.line_on = card->chan[ch].d.line_on;
pc300stats.line_off = card->chan[ch].d.line_off;
- memcpy(&pc300stats.gen_stats, &hdlc->stats,
+ memcpy(&pc300stats.gen_stats, &dev->stats,
sizeof(struct net_device_stats));
if (card->hw.type == PC300_TE)
memcpy(&pc300stats.te_stats,&chan->falc,sizeof(falc_t));
@@ -2898,10 +2904,10 @@ static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)

static struct net_device_stats *cpc_get_stats(struct net_device *dev)
{
- pc300dev_t *d = (pc300dev_t *) dev->priv;
+ pc300dev_t *d = (pc300dev_t *) (dev_to_hdlc(dev))->priv;

if (d)
- return &d->hdlc->stats;
+ return &(dev->stats);
else
return NULL;
}
@@ -3147,8 +3153,7 @@ static int tx_config(pc300dev_t * d)
static int cpc_attach(struct net_device *dev, unsigned short encoding,
unsigned short parity)
{
- struct net_device * dev = hdlc_to_dev(hdlc);
- pc300dev_t *d = (pc300dev_t *)dev->priv;
+ pc300dev_t *d = (pc300dev_t *)dev_to_hdlc(dev)->priv;
pc300ch_t *chan = (pc300ch_t *)d->chan;
pc300_t *card = (pc300_t *)chan->card;
pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
@@ -3224,26 +3229,19 @@ static void cpc_closech(pc300dev_t * d)

int cpc_open(struct net_device *dev)
{
- hdlc_device *hdlc = dev_to_hdlc(dev);
- pc300dev_t *d = (pc300dev_t *) dev->priv;
+ pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv;
struct ifreq ifr;
int result;
+ pc300ch_t *chan = (pc300ch_t *) d->chan;
+ pc300_t *card = (pc300_t *) chan->card;

#ifdef PC300_DEBUG_OTHER
printk("pc300: cpc_open");
#endif

- if (hdlc->proto.id == IF_PROTO_PPP) {
- d->if_ptr = &hdlc->state.ppp.pppdev;
- }
-
- result = hdlc_open(hdlc);
- if (hdlc->proto.id == IF_PROTO_PPP) {
- dev->priv = d;
- }
- if (result) {
+ result = hdlc_open(dev);
+ if (result)
return result;
- }

sprintf(ifr.ifr_name, "%s", dev->name);
cpc_opench(d);
@@ -3253,8 +3251,7 @@ int cpc_open(struct net_device *dev)

static int cpc_close(struct net_device *dev)
{
- hdlc_device *hdlc = dev_to_hdlc(dev);
- pc300dev_t *d = (pc300dev_t *) dev->priv;
+ pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv;
pc300ch_t *chan = (pc300ch_t *) d->chan;
pc300_t *card = (pc300_t *) chan->card;
unsigned long flags;
@@ -3269,10 +3266,7 @@ static int cpc_close(struct net_device *dev)
cpc_closech(d);
CPC_UNLOCK(card, flags);

- hdlc_close(hdlc);
- if (hdlc->proto.id == IF_PROTO_PPP) {
- d->if_ptr = NULL;
- }
+ hdlc_close(dev);
#ifdef CONFIG_PC300_MLPPP
if (chan->conf.proto == PC300_PROTO_MLPPP) {
cpc_tty_unregister_service(d);
@@ -3439,36 +3433,26 @@ static void cpc_init_card(pc300_t * card)
d->line_on = 0;
d->line_off = 0;

- d->hdlc = (hdlc_device *) kmalloc(sizeof(hdlc_device), GFP_KERNEL);
- if (d->hdlc == NULL)
+ dev = alloc_hdlcdev(d);
+ if (dev == NULL)
continue;
- memset(d->hdlc, 0, sizeof(hdlc_device));
-
- hdlc = d->hdlc;
- hdlc->xmit = cpc_queue_xmit;
- hdlc->attach = cpc_attach;
-
- dev = hdlc_to_dev(hdlc);

dev->mem_start = card->hw.ramphys;
dev->mem_end = card->hw.ramphys + card->hw.ramsize - 1;
dev->irq = card->hw.irq;
- dev->init = NULL;
dev->tx_queue_len = PC300_TX_QUEUE_LEN;
dev->mtu = PC300_DEF_MTU;
-
- dev->open = cpc_open;
- dev->stop = cpc_close;
- dev->tx_timeout = cpc_tx_timeout;
+ dev->netdev_ops = &pc300_netdev_ops;
dev->watchdog_timeo = PC300_TX_TIMEOUT;
- dev->get_stats = cpc_get_stats;
- dev->set_multicast_list = NULL;
- dev->set_mac_address = NULL;
- dev->change_mtu = cpc_change_mtu;
- dev->do_ioctl = cpc_ioctl;
-
- if (register_hdlc_device(hdlc) == 0) {
- dev->priv = d; /* We need 'priv', hdlc doesn't */
+
+ hdlc = dev_to_hdlc(dev);
+ hdlc->xmit = cpc_queue_xmit;
+ hdlc->attach = cpc_attach;
+ d->hdlc = hdlc;
+
+ d->netdev = dev;
+
+ if (register_hdlc_device(dev) == 0) {
printk("%s: Cyclades-PC300/", dev->name);
switch (card->hw.type) {
case PC300_TE:
@@ -3731,7 +3715,8 @@ static void __devexit cpc_remove_one(struct pci_dev *pdev)
cpc_readw(card->hw.plxbase + card->hw.intctl_reg) & ~(0x0040));

for (i = 0; i < card->hw.nchan; i++) {
- unregister_hdlc_device(card->chan[i].d.hdlc);
+ unregister_hdlc_device(card->chan[i].d.netdev);
+ free_netdev(card->chan[i].d.netdev);
}
iounmap(card->hw.plxbase);
iounmap(card->hw.scabase);
diff --git a/drivers/net/wan/pc300_tty.c b/drivers/net/wan/pc300_tty.c
index e614126..e4610c2 100644
--- a/drivers/net/wan/pc300_tty.c
+++ b/drivers/net/wan/pc300_tty.c
@@ -154,8 +154,7 @@ static void cpc_tty_signal_off(pc300dev_t *pc300dev, unsigned char signal)
int ch = pc300chan->channel;
unsigned long flags;

- CPC_TTY_DBG("%s-tty: Clear signal %x\n",
- ((struct net_device*)(pc300dev->hdlc))->name, signal);
+ CPC_TTY_DBG("%s-tty: Clear signal %x\n",pc300dev->netdev->name, signal);
CPC_TTY_LOCK(card, flags);
cpc_writeb(card->hw.scabase + M_REG(CTL,ch),
cpc_readb(card->hw.scabase+M_REG(CTL,ch))& signal);
@@ -172,8 +171,7 @@ static void cpc_tty_signal_on(pc300dev_t *pc300dev, unsigned char signal)
int ch = pc300chan->channel;
unsigned long flags;

- CPC_TTY_DBG("%s-tty: Set signal %x\n",
- ((struct net_device*)(pc300dev->hdlc))->name, signal);
+ CPC_TTY_DBG("%s-tty: Set signal %x\n",pc300dev->netdev->name, signal);
CPC_TTY_LOCK(card, flags);
cpc_writeb(card->hw.scabase + M_REG(CTL,ch),
cpc_readb(card->hw.scabase+M_REG(CTL,ch))& ~signal);
@@ -196,17 +194,17 @@ void cpc_tty_init(pc300dev_t *pc300dev)
st_cpc_tty_area * cpc_tty;

/* hdlcX - X=interface number */
- port = ((struct net_device*)(pc300dev->hdlc))->name[4] - '0';
+ port = pc300dev->netdev->name[4] - '0';
if (port >= CPC_TTY_NPORTS) {
printk("%s-tty: invalid interface selected (0-%i): %i",
- ((struct net_device*)(pc300dev->hdlc))->name,
+ pc300dev->netdev->name,
CPC_TTY_NPORTS-1,port);
return;
}

if (cpc_tty_cnt == 0) { /* first TTY connection -> register driver */
CPC_TTY_DBG("%s-tty: driver init, major:%i, minor range:%i=%i\n",
- ((struct net_device*)(pc300dev->hdlc))->name,
+ pc300dev->netdev->name,
CPC_TTY_MAJOR, CPC_TTY_MINOR_START,
CPC_TTY_MINOR_START+CPC_TTY_NPORTS);
/* initialize tty driver struct */
@@ -238,8 +236,7 @@ void cpc_tty_init(pc300dev_t *pc300dev)

/* register the TTY driver */
if (tty_register_driver(&serial_drv)) {
- printk("%s-tty: Failed to register serial driver! ",
- ((struct net_device*)(pc300dev->hdlc))->name);
+ printk("%s-tty: Failed to register serial driver! ",pc300dev->netdev->name);
return;
}

@@ -250,8 +247,7 @@ void cpc_tty_init(pc300dev_t *pc300dev)
cpc_tty = &cpc_tty_area[port];

if (cpc_tty->state != CPC_TTY_ST_IDLE) {
- CPC_TTY_DBG("%s-tty: TTY port %i, already in use.\n",
- ((struct net_device*)(pc300dev->hdlc))->name,port);
+ CPC_TTY_DBG("%s-tty: TTY port %i, already in use.\n",pc300dev->netdev->name,port);
return;
}

@@ -268,11 +264,11 @@ void cpc_tty_init(pc300dev_t *pc300dev)

pc300dev->cpc_tty = (void *)cpc_tty;

- aux = strlen(((struct net_device*)(pc300dev->hdlc))->name);
- memcpy(cpc_tty->name,((struct net_device*)(pc300dev->hdlc))->name,aux);
+ aux = strlen(pc300dev->netdev->name);
+ memcpy(cpc_tty->name, pc300dev->netdev->name, aux);
memcpy(&cpc_tty->name[aux], "-tty", 5);

- cpc_open((struct net_device *)pc300dev->hdlc);
+ cpc_open(pc300dev->netdev);
cpc_tty_signal_off(pc300dev, CTL_DTR);

CPC_TTY_DBG("%s: Initializing TTY Sync Driver, tty major#%d minor#%i\n",
@@ -457,7 +453,7 @@ static int cpc_tty_write(struct tty_struct *tty, int from_user,
(from_user)?"from user" : "from kernel",count);

pc300chan = (pc300ch_t *)((pc300dev_t*)cpc_tty->pc300dev)->chan;
- stats = &((pc300dev_t*)cpc_tty->pc300dev)->hdlc->stats;
+ stats = &(cpc_tty->pc300dev->netdev->stats);
card = (pc300_t *) pc300chan->card;
ch = pc300chan->channel;

@@ -599,8 +595,7 @@ static int pc300_tiocmget(struct tty_struct *tty, struct file *file)

cpc_tty = (st_cpc_tty_area *) tty->driver_data;

- CPC_TTY_DBG("%s-tty: tiocmget\n",
- ((struct net_device*)(pc300dev->hdlc))->name);
+ CPC_TTY_DBG("%s-tty: tiocmget\n",pc300dev->netdev->name);

CPC_TTY_LOCK(card, flags);
status = cpc_readb(card->hw.scabase+M_REG(CTL,ch));
@@ -935,7 +930,7 @@ static int cpc_tty_send_to_card(pc300dev_t *dev,void* buf, int len)
pc300ch_t *chan = (pc300ch_t *)dev->chan;
pc300_t *card = (pc300_t *)chan->card;
int ch = chan->channel;
- struct net_device_stats *stats = &dev->hdlc->stats;
+ struct net_device_stats *stats = &dev->netdev->stats;
unsigned long flags;
pcsca_bd_t __iomem *ptdescr;
int i, nchar;
@@ -1019,19 +1014,18 @@ static void cpc_tty_trace(pc300dev_t *dev, char* buf, int len, char rxtx)

if ((skb = dev_alloc_skb(10 + len)) == NULL) {
/* out of memory */
- CPC_TTY_DBG("%s: tty_trace - out of memory\n",
- ((struct net_device *)(dev->hdlc))->name);
+ CPC_TTY_DBG("%s: tty_trace - out of memory\n",dev->netdev->name);
return;
}

skb_put (skb, 10 + len);
- skb->dev = (struct net_device *) dev->hdlc;
+ skb->dev = dev->netdev;
skb->protocol = htons(ETH_P_CUST);
skb->mac.raw = skb->data;
skb->pkt_type = PACKET_HOST;
skb->len = 10 + len;

- memcpy(skb->data,((struct net_device *)(dev->hdlc))->name,5);
+ memcpy(skb->data,dev->netdev->name,5);
skb->data[5] = '[';
skb->data[6] = rxtx;
skb->data[7] = ']';
@@ -1053,15 +1047,13 @@ void cpc_tty_unregister_service(pc300dev_t *pc300dev)
int res;

if ((cpc_tty= (st_cpc_tty_area *) pc300dev->cpc_tty) == 0) {
- CPC_TTY_DBG("%s: interface is not TTY\n",
- ((struct net_device *)(pc300dev->hdlc))->name);
+ CPC_TTY_DBG("%s: interface is not TTY\n",pc300dev->netdev->name);
return;
}
CPC_TTY_DBG("%s: cpc_tty_unregister_service", cpc_tty->name);

if (cpc_tty->pc300dev != pc300dev) {
- CPC_TTY_DBG("%s: invalid tty ptr=%s\n",
- ((struct net_device *)(pc300dev->hdlc))->name, cpc_tty->name);
+ CPC_TTY_DBG("%s: invalid tty ptr=%s\n",pc300dev->netdev->name, cpc_tty->name);
return;
}

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/