X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fnet%2Fplip.c;h=6bb085f5443700f63f3d48e67d372230fa7f120d;hb=refs%2Fheads%2Fvserver;hp=87ee3271b17de71f85fa99505bcb706ef276e164;hpb=76828883507a47dae78837ab5dec5a5b4513c667;p=linux-2.6.git diff --git a/drivers/net/plip.c b/drivers/net/plip.c index 87ee3271b..6bb085f54 100644 --- a/drivers/net/plip.c +++ b/drivers/net/plip.c @@ -16,7 +16,7 @@ * parport-sharing awareness code by Philip Blundell. * SMP locking by Niibe Yutaka. * Support for parallel ports with no IRQ (poll mode), - * Modifications to use the parallel port API + * Modifications to use the parallel port API * by Nimrod Zimerman. * * Fixes: @@ -123,7 +123,7 @@ static const char version[] = "NET3 PLIP version 2.4-parport gniibe@mri.co.jp\n" #ifndef NET_DEBUG #define NET_DEBUG 1 #endif -static unsigned int net_debug = NET_DEBUG; +static const unsigned int net_debug = NET_DEBUG; #define ENABLE(irq) if (irq != -1) enable_irq(irq) #define DISABLE(irq) if (irq != -1) disable_irq(irq) @@ -138,12 +138,12 @@ static unsigned int net_debug = NET_DEBUG; #define PLIP_NIBBLE_WAIT 3000 /* Bottom halves */ -static void plip_kick_bh(struct net_device *dev); -static void plip_bh(struct net_device *dev); -static void plip_timer_bh(struct net_device *dev); +static void plip_kick_bh(struct work_struct *work); +static void plip_bh(struct work_struct *work); +static void plip_timer_bh(struct work_struct *work); /* Interrupt handler */ -static void plip_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static void plip_interrupt(int irq, void *dev_id); /* Functions for DEV methods */ static int plip_tx_packet(struct sk_buff *skb, struct net_device *dev); @@ -207,9 +207,10 @@ struct plip_local { struct net_local { struct net_device_stats enet_stats; + struct net_device *dev; struct work_struct immediate; - struct work_struct deferred; - struct work_struct timer; + struct delayed_work deferred; + struct delayed_work timer; struct plip_local snd_data; struct plip_local rcv_data; struct pardevice *pardev; @@ -306,11 +307,11 @@ plip_init_netdev(struct net_device *dev) nl->nibble = PLIP_NIBBLE_WAIT; /* Initialize task queue structures */ - INIT_WORK(&nl->immediate, (void (*)(void *))plip_bh, dev); - INIT_WORK(&nl->deferred, (void (*)(void *))plip_kick_bh, dev); + INIT_WORK(&nl->immediate, plip_bh); + INIT_DELAYED_WORK(&nl->deferred, plip_kick_bh); if (dev->irq == -1) - INIT_WORK(&nl->timer, (void (*)(void *))plip_timer_bh, dev); + INIT_DELAYED_WORK(&nl->timer, plip_timer_bh); spin_lock_init(&nl->lock); } @@ -319,9 +320,10 @@ plip_init_netdev(struct net_device *dev) This routine is kicked by do_timer(). Request `plip_bh' to be invoked. */ static void -plip_kick_bh(struct net_device *dev) +plip_kick_bh(struct work_struct *work) { - struct net_local *nl = netdev_priv(dev); + struct net_local *nl = + container_of(work, struct net_local, deferred.work); if (nl->is_deferred) schedule_work(&nl->immediate); @@ -351,7 +353,7 @@ static int plip_bh_timeout_error(struct net_device *dev, struct net_local *nl, typedef int (*plip_func)(struct net_device *dev, struct net_local *nl, struct plip_local *snd, struct plip_local *rcv); -static plip_func connection_state_table[] = +static const plip_func connection_state_table[] = { plip_none, plip_receive_packet, @@ -362,9 +364,9 @@ static plip_func connection_state_table[] = /* Bottom half handler of PLIP. */ static void -plip_bh(struct net_device *dev) +plip_bh(struct work_struct *work) { - struct net_local *nl = netdev_priv(dev); + struct net_local *nl = container_of(work, struct net_local, immediate); struct plip_local *snd = &nl->snd_data; struct plip_local *rcv = &nl->rcv_data; plip_func f; @@ -372,20 +374,21 @@ plip_bh(struct net_device *dev) nl->is_deferred = 0; f = connection_state_table[nl->connection]; - if ((r = (*f)(dev, nl, snd, rcv)) != OK - && (r = plip_bh_timeout_error(dev, nl, snd, rcv, r)) != OK) { + if ((r = (*f)(nl->dev, nl, snd, rcv)) != OK + && (r = plip_bh_timeout_error(nl->dev, nl, snd, rcv, r)) != OK) { nl->is_deferred = 1; schedule_delayed_work(&nl->deferred, 1); } } static void -plip_timer_bh(struct net_device *dev) +plip_timer_bh(struct work_struct *work) { - struct net_local *nl = netdev_priv(dev); - + struct net_local *nl = + container_of(work, struct net_local, timer.work); + if (!(atomic_read (&nl->kill_timer))) { - plip_interrupt (-1, dev, NULL); + plip_interrupt (-1, nl->dev); schedule_delayed_work(&nl->timer, 1); } @@ -527,7 +530,7 @@ plip_receive(unsigned short nibble_timeout, struct net_device *dev, } /* - * Determine the packet's protocol ID. The rule here is that we + * Determine the packet's protocol ID. The rule here is that we * assume 802.3 if the type field is short enough to be a length. * This is normal practice and works for any 'now in use' protocol. * @@ -537,16 +540,16 @@ plip_receive(unsigned short nibble_timeout, struct net_device *dev, * We can't fix the daddr thing as that quirk (more bug) is embedded * in far too many old systems not all even running Linux. */ - + static __be16 plip_type_trans(struct sk_buff *skb, struct net_device *dev) { struct ethhdr *eth; unsigned char *rawp; - + skb->mac.raw=skb->data; skb_pull(skb,dev->hard_header_len); eth = eth_hdr(skb); - + if(*eth->h_dest&1) { if(memcmp(eth->h_dest,dev->broadcast, ETH_ALEN)==0) @@ -554,17 +557,17 @@ static __be16 plip_type_trans(struct sk_buff *skb, struct net_device *dev) else skb->pkt_type=PACKET_MULTICAST; } - + /* * This ALLMULTI check should be redundant by 1.4 * so don't forget to remove it. */ - + if (ntohs(eth->h_proto) >= 1536) return eth->h_proto; - + rawp = skb->data; - + /* * This is a magic hack to spot IPX packets. Older Novell breaks * the protocol design and runs IPX over 802.3 without an 802.2 LLC @@ -573,7 +576,7 @@ static __be16 plip_type_trans(struct sk_buff *skb, struct net_device *dev) */ if (*(unsigned short *)rawp == 0xFFFF) return htons(ETH_P_802_3); - + /* * Real 802.2 LLC */ @@ -902,18 +905,13 @@ plip_error(struct net_device *dev, struct net_local *nl, /* Handle the parallel port interrupts. */ static void -plip_interrupt(int irq, void *dev_id, struct pt_regs * regs) +plip_interrupt(int irq, void *dev_id) { struct net_device *dev = dev_id; struct net_local *nl; struct plip_local *rcv; unsigned char c0; - if (dev == NULL) { - printk(KERN_DEBUG "plip_interrupt: irq %d for unknown device.\n", irq); - return; - } - nl = netdev_priv(dev); rcv = &nl->rcv_data; @@ -972,7 +970,7 @@ plip_tx_packet(struct sk_buff *skb, struct net_device *dev) } netif_stop_queue (dev); - + if (skb->len > dev->mtu + dev->hard_header_len) { printk(KERN_WARNING "%s: packet too big, %d.\n", dev->name, (int)skb->len); netif_start_queue (dev); @@ -993,7 +991,7 @@ plip_tx_packet(struct sk_buff *skb, struct net_device *dev) } schedule_work(&nl->immediate); spin_unlock_irq(&nl->lock); - + return 0; } @@ -1032,7 +1030,7 @@ int plip_hard_header_cache(struct neighbour *neigh, { struct net_local *nl = neigh->dev->priv; int ret; - + if ((ret = nl->orig_hard_header_cache(neigh, hh)) == 0) { struct ethhdr *eth; @@ -1041,9 +1039,9 @@ int plip_hard_header_cache(struct neighbour *neigh, HH_DATA_OFF(sizeof(*eth))); plip_rewrite_address (neigh->dev, eth); } - + return ret; -} +} /* Open/initialize the board. This is called (in the current kernel) sometime after booting when the 'ifconfig' program is run. @@ -1187,7 +1185,7 @@ plip_wakeup(void *handle) else return; } - + if (!(dev->flags & IFF_UP)) /* Don't need the port when the interface is down */ return; @@ -1264,7 +1262,7 @@ static void plip_attach (struct parport *port) struct net_local *nl; char name[IFNAMSIZ]; - if ((parport[0] == -1 && (!timid || !port->devices)) || + if ((parport[0] == -1 && (!timid || !port->devices)) || plip_searchfor(parport, port->number)) { if (unit == PLIP_MAX) { printk(KERN_ERR "plip: too many devices\n"); @@ -1277,7 +1275,7 @@ static void plip_attach (struct parport *port) printk(KERN_ERR "plip: memory squeeze\n"); return; } - + strcpy(dev->name, name); SET_MODULE_OWNER(dev); @@ -1289,8 +1287,9 @@ static void plip_attach (struct parport *port) } nl = netdev_priv(dev); + nl->dev = dev; nl->pardev = parport_register_device(port, name, plip_preempt, - plip_wakeup, plip_interrupt, + plip_wakeup, plip_interrupt, 0, dev); if (!nl->pardev) { @@ -1384,7 +1383,7 @@ static int __init plip_setup(char *str) /* disable driver on "plip=" or "plip=0" */ parport[0] = -2; } else { - printk(KERN_WARNING "warning: 'plip=0x%x' ignored\n", + printk(KERN_WARNING "warning: 'plip=0x%x' ignored\n", ints[1]); } }