lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sun, 29 Jan 2012 18:47:56 -0800 From: Andrea Shepard <andrea@...sephoneslair.org> To: linux-kernel@...r.kernel.org, netdev@...r.kernel.org Cc: khc@...waw.pl, davem@...emloft.net, mmarek@...e.cz, jkosina@...e.cz, joe@...ches.com, justinmattock@...il.com, gregkh@...e.de, alan@...ux.intel.com, jdmason@...zu.us Subject: [05/22] Cyclades PC300 driver: update to use new HDLC interface 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@...sephoneslair.org> 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 netdev" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists