Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[safe/jmp/linux-2.6] / drivers / net / ni65.c
index 925d1df..6474f02 100644 (file)
@@ -7,8 +7,6 @@
  * EtherBlaster. (probably it also works with every full NE2100
  * compatible card)
  *
- * To compile as module, type:
- *     gcc -O2 -fomit-frame-pointer -m486 -D__KERNEL__ -DMODULE -c ni65.c
  * driver probes: io: 0x360,0x300,0x320,0x340 / dma: 3,5,6,7
  *
  * This is an extension to the Linux operating system, and is covered by the
@@ -183,7 +181,7 @@ static struct card {
        short addr_offset;
        unsigned char *vendor_id;
        char *cardname;
-       long config;
+       unsigned long config;
 } cards[] = {
        {
                .id0         = NI65_ID0,
@@ -239,7 +237,7 @@ struct priv
        void *tmdbounce[TMDNUM];
        int tmdbouncenum;
        int lock,xmit_queued;
-       struct net_device_stats stats;
+
        void *self;
        int cmdr_addr;
        int cardno;
@@ -248,7 +246,7 @@ struct priv
 };
 
 static int  ni65_probe1(struct net_device *dev,int);
-static irqreturn_t ni65_interrupt(int irq, void * dev_id, struct pt_regs *regs);
+static irqreturn_t ni65_interrupt(int irq, void * dev_id);
 static void ni65_recv_intr(struct net_device *dev,int);
 static void ni65_xmit_intr(struct net_device *dev,int);
 static int  ni65_open(struct net_device *dev);
@@ -259,7 +257,6 @@ static void  ni65_timeout(struct net_device *dev);
 static int  ni65_close(struct net_device *dev);
 static int  ni65_alloc_buffer(struct net_device *dev);
 static void ni65_free_buffer(struct priv *p);
-static struct net_device_stats *ni65_get_stats(struct net_device *);
 static void set_multicast_list(struct net_device *dev);
 
 static int irqtab[] __initdata = { 9,12,15,5 }; /* irq config-translate */
@@ -295,7 +292,7 @@ static void ni65_set_performance(struct priv *p)
  */
 static int ni65_open(struct net_device *dev)
 {
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = dev->ml_priv;
        int irqval = request_irq(dev->irq, &ni65_interrupt,0,
                         cards[p->cardno].cardname,dev);
        if (irqval) {
@@ -321,10 +318,10 @@ static int ni65_open(struct net_device *dev)
  */
 static int ni65_close(struct net_device *dev)
 {
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = dev->ml_priv;
 
        netif_stop_queue(dev);
-       
+
        outw(inw(PORT+L_RESET),PORT+L_RESET); /* that's the hard way */
 
 #ifdef XMT_VIA_SKB
@@ -345,7 +342,7 @@ static int ni65_close(struct net_device *dev)
 
 static void cleanup_card(struct net_device *dev)
 {
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = dev->ml_priv;
        disable_dma(dev->dma);
        free_dma(dev->dma);
        release_region(dev->base_addr, cards[p->cardno].total_size);
@@ -403,6 +400,17 @@ out:
        return ERR_PTR(err);
 }
 
+static const struct net_device_ops ni65_netdev_ops = {
+       .ndo_open               = ni65_open,
+       .ndo_stop               = ni65_close,
+       .ndo_start_xmit         = ni65_send_packet,
+       .ndo_tx_timeout         = ni65_timeout,
+       .ndo_set_multicast_list = set_multicast_list,
+       .ndo_change_mtu         = eth_change_mtu,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+};
+
 /*
  * this is the real card probe ..
  */
@@ -444,7 +452,7 @@ static int __init ni65_probe1(struct net_device *dev,int ioaddr)
                release_region(ioaddr, cards[i].total_size);
                return j;
        }
-       p = (struct priv *) dev->priv;
+       p = dev->ml_priv;
        p->cmdr_addr = ioaddr + cards[i].cmd_offset;
        p->cardno = i;
        spin_lock_init(&p->ring_lock);
@@ -483,26 +491,27 @@ static int __init ni65_probe1(struct net_device *dev,int ioaddr)
        else {
                if(dev->dma == 0) {
                /* 'stuck test' from lance.c */
-                       long dma_channels = ((inb(DMA1_STAT_REG) >> 4) & 0x0f) |
-                                           (inb(DMA2_STAT_REG) & 0xf0);
+                       unsigned long dma_channels =
+                               ((inb(DMA1_STAT_REG) >> 4) & 0x0f)
+                               | (inb(DMA2_STAT_REG) & 0xf0);
                        for(i=1;i<5;i++) {
                                int dma = dmatab[i];
                                if(test_bit(dma,&dma_channels) || request_dma(dma,"ni6510"))
                                        continue;
-                                       
+
                                flags=claim_dma_lock();
                                disable_dma(dma);
                                set_dma_mode(dma,DMA_MODE_CASCADE);
                                enable_dma(dma);
                                release_dma_lock(flags);
-                               
+
                                ni65_init_lance(p,dev->dev_addr,0,0); /* trigger memory access */
-                               
+
                                flags=claim_dma_lock();
                                disable_dma(dma);
                                free_dma(dma);
                                release_dma_lock(flags);
-                               
+
                                if(readreg(CSR0) & CSR0_IDON)
                                        break;
                        }
@@ -550,14 +559,9 @@ static int __init ni65_probe1(struct net_device *dev,int ioaddr)
        }
 
        dev->base_addr = ioaddr;
-       SET_MODULE_OWNER(dev);
-       dev->open               = ni65_open;
-       dev->stop               = ni65_close;
-       dev->hard_start_xmit    = ni65_send_packet;
-       dev->tx_timeout         = ni65_timeout;
+       dev->netdev_ops = &ni65_netdev_ops;
        dev->watchdog_timeo     = HZ/2;
-       dev->get_stats          = ni65_get_stats;
-       dev->set_multicast_list = set_multicast_list;
+
        return 0; /* everything is OK */
 }
 
@@ -610,7 +614,6 @@ static void *ni65_alloc_mem(struct net_device *dev,char *what,int size,int type)
                        printk(KERN_WARNING "%s: unable to allocate %s memory.\n",dev->name,what);
                        return NULL;
                }
-               skb->dev = dev;
                skb_reserve(skb,2+16);
                skb_put(skb,R_BUF_SIZE);         /* grab the whole space .. (not necessary) */
                ptr = skb->data;
@@ -649,8 +652,8 @@ static int ni65_alloc_buffer(struct net_device *dev)
        if(!ptr)
                return -ENOMEM;
 
-       p = dev->priv = (struct priv *) (((unsigned long) ptr + 7) & ~0x7);
-       memset((char *) dev->priv,0,sizeof(struct priv));
+       p = dev->ml_priv = (struct priv *) (((unsigned long) ptr + 7) & ~0x7);
+       memset((char *)p, 0, sizeof(struct priv));
        p->self = ptr;
 
        for(i=0;i<TMDNUM;i++)
@@ -696,8 +699,7 @@ static void ni65_free_buffer(struct priv *p)
                return;
 
        for(i=0;i<TMDNUM;i++) {
-               if(p->tmdbounce[i])
-                       kfree(p->tmdbounce[i]);
+               kfree(p->tmdbounce[i]);
 #ifdef XMT_VIA_SKB
                if(p->tmd_skb[i])
                        dev_kfree_skb(p->tmd_skb[i]);
@@ -710,12 +712,10 @@ static void ni65_free_buffer(struct priv *p)
                if(p->recv_skb[i])
                        dev_kfree_skb(p->recv_skb[i]);
 #else
-               if(p->recvbounce[i])
-                       kfree(p->recvbounce[i]);
+               kfree(p->recvbounce[i]);
 #endif
        }
-       if(p->self)
-               kfree(p->self);
+       kfree(p->self);
 }
 
 
@@ -795,7 +795,7 @@ static void ni65_stop_start(struct net_device *dev,struct priv *p)
 static int ni65_lance_reinit(struct net_device *dev)
 {
         int i;
-        struct priv *p = (struct priv *) dev->priv;
+        struct priv *p = dev->ml_priv;
         unsigned long flags;
 
         p->lock = 0;
@@ -874,17 +874,17 @@ static int ni65_lance_reinit(struct net_device *dev)
 /*
  * interrupt handler
  */
-static irqreturn_t ni65_interrupt(int irq, void * dev_id, struct pt_regs * regs)
+static irqreturn_t ni65_interrupt(int irq, void * dev_id)
 {
        int csr0 = 0;
        struct net_device *dev = dev_id;
        struct priv *p;
        int bcnt = 32;
 
-       p = (struct priv *) dev->priv;
+       p = dev->ml_priv;
 
        spin_lock(&p->ring_lock);
-       
+
        while(--bcnt) {
                csr0 = inw(PORT+L_DATAREG);
 
@@ -904,17 +904,16 @@ static irqreturn_t ni65_interrupt(int irq, void * dev_id, struct pt_regs * regs)
 
                if(csr0 & CSR0_ERR)
                {
-                       struct priv *p = (struct priv *) dev->priv;
                        if(debuglevel > 1)
                                printk(KERN_ERR "%s: general error: %04x.\n",dev->name,csr0);
                        if(csr0 & CSR0_BABL)
-                               p->stats.tx_errors++;
+                               dev->stats.tx_errors++;
                        if(csr0 & CSR0_MISS) {
                                int i;
                                for(i=0;i<RMDNUM;i++)
                                        printk("%02x ",p->rmdhead[i].u.s.status);
                                printk("\n");
-                               p->stats.rx_errors++;
+                               dev->stats.rx_errors++;
                        }
                        if(csr0 & CSR0_MERR) {
                                if(debuglevel > 1)
@@ -929,8 +928,7 @@ static irqreturn_t ni65_interrupt(int irq, void * dev_id, struct pt_regs * regs)
  int j;
  for(j=0;j<RMDNUM;j++)
  {
-       struct priv *p = (struct priv *) dev->priv;
-       int i,k,num1,num2;
+       int i, num2;
        for(i=RMDNUM-1;i>0;i--) {
                 num2 = (p->rmdnum + i) & (RMDNUM-1);
                 if(!(p->rmdhead[num2].u.s.status & RCV_OWN))
@@ -938,6 +936,7 @@ static irqreturn_t ni65_interrupt(int irq, void * dev_id, struct pt_regs * regs)
        }
 
        if(i) {
+               int k, num1;
                for(k=0;k<RMDNUM;k++) {
                        num1 = (p->rmdnum + k) & (RMDNUM-1);
                        if(!(p->rmdhead[num1].u.s.status & RCV_OWN))
@@ -949,7 +948,6 @@ static irqreturn_t ni65_interrupt(int irq, void * dev_id, struct pt_regs * regs)
                if(debuglevel > 0)
                {
                        char buf[256],*buf1;
-                       int k;
                        buf1 = buf;
                        for(k=0;k<RMDNUM;k++) {
                                sprintf(buf1,"%02x ",(p->rmdhead[k].u.s.status)); /* & RCV_OWN) ); */
@@ -987,7 +985,7 @@ static irqreturn_t ni65_interrupt(int irq, void * dev_id, struct pt_regs * regs)
  */
 static void ni65_xmit_intr(struct net_device *dev,int csr0)
 {
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = dev->ml_priv;
 
        while(p->xmit_queued)
        {
@@ -1005,12 +1003,12 @@ static void ni65_xmit_intr(struct net_device *dev,int csr0)
 #endif
                 /* checking some errors */
                        if(tmdp->status2 & XMIT_RTRY)
-                               p->stats.tx_aborted_errors++;
+                               dev->stats.tx_aborted_errors++;
                        if(tmdp->status2 & XMIT_LCAR)
-                               p->stats.tx_carrier_errors++;
+                               dev->stats.tx_carrier_errors++;
                        if(tmdp->status2 & (XMIT_BUFF | XMIT_UFLO )) {
                /* this stops the xmitter */
-                               p->stats.tx_fifo_errors++;
+                               dev->stats.tx_fifo_errors++;
                                if(debuglevel > 0)
                                        printk(KERN_ERR "%s: Xmit FIFO/BUFF error\n",dev->name);
                                if(p->features & INIT_RING_BEFORE_START) {
@@ -1024,12 +1022,12 @@ static void ni65_xmit_intr(struct net_device *dev,int csr0)
                        if(debuglevel > 2)
                                printk(KERN_ERR "%s: xmit-error: %04x %02x-%04x\n",dev->name,csr0,(int) tmdstat,(int) tmdp->status2);
                        if(!(csr0 & CSR0_BABL)) /* don't count errors twice */
-                               p->stats.tx_errors++;
+                               dev->stats.tx_errors++;
                        tmdp->status2 = 0;
                }
                else {
-                       p->stats.tx_bytes -= (short)(tmdp->blen);
-                       p->stats.tx_packets++;
+                       dev->stats.tx_bytes -= (short)(tmdp->blen);
+                       dev->stats.tx_packets++;
                }
 
 #ifdef XMT_VIA_SKB
@@ -1054,7 +1052,7 @@ static void ni65_recv_intr(struct net_device *dev,int csr0)
        struct rmd *rmdp;
        int rmdstat,len;
        int cnt=0;
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = dev->ml_priv;
 
        rmdp = p->rmdhead + p->rmdnum;
        while(!( (rmdstat = rmdp->u.s.status) & RCV_OWN))
@@ -1065,7 +1063,7 @@ static void ni65_recv_intr(struct net_device *dev,int csr0)
                        if(!(rmdstat & RCV_ERR)) {
                                if(rmdstat & RCV_START)
                                {
-                                       p->stats.rx_length_errors++;
+                                       dev->stats.rx_length_errors++;
                                        printk(KERN_ERR "%s: recv, packet too long: %d\n",dev->name,rmdp->mlen & 0x0fff);
                                }
                        }
@@ -1074,16 +1072,16 @@ static void ni65_recv_intr(struct net_device *dev,int csr0)
                                        printk(KERN_ERR "%s: receive-error: %04x, lance-status: %04x/%04x\n",
                                                                        dev->name,(int) rmdstat,csr0,(int) inw(PORT+L_DATAREG) );
                                if(rmdstat & RCV_FRAM)
-                                       p->stats.rx_frame_errors++;
+                                       dev->stats.rx_frame_errors++;
                                if(rmdstat & RCV_OFLO)
-                                       p->stats.rx_over_errors++;
+                                       dev->stats.rx_over_errors++;
                                if(rmdstat & RCV_CRC)
-                                       p->stats.rx_crc_errors++;
+                                       dev->stats.rx_crc_errors++;
                                if(rmdstat & RCV_BUF_ERR)
-                                       p->stats.rx_fifo_errors++;
+                                       dev->stats.rx_fifo_errors++;
                        }
                        if(!(csr0 & CSR0_MISS)) /* don't count errors twice */
-                               p->stats.rx_errors++;
+                               dev->stats.rx_errors++;
                }
                else if( (len = (rmdp->mlen & 0x0fff) - 4) >= 60)
                {
@@ -1097,11 +1095,10 @@ static void ni65_recv_intr(struct net_device *dev,int csr0)
                        if(skb)
                        {
                                skb_reserve(skb,2);
-       skb->dev = dev;
 #ifdef RCV_VIA_SKB
                                if( (unsigned long) (skb->data + R_BUF_SIZE) > 0x1000000) {
                                        skb_put(skb,len);
-                                       eth_copy_and_sum(skb, (unsigned char *)(p->recv_skb[p->rmdnum]->data),len,0);
+                                       skb_copy_to_linear_data(skb, (unsigned char *)(p->recv_skb[p->rmdnum]->data),len);
                                }
                                else {
                                        struct sk_buff *skb1 = p->recv_skb[p->rmdnum];
@@ -1113,23 +1110,22 @@ static void ni65_recv_intr(struct net_device *dev,int csr0)
                                }
 #else
                                skb_put(skb,len);
-                               eth_copy_and_sum(skb, (unsigned char *) p->recvbounce[p->rmdnum],len,0);
+                               skb_copy_to_linear_data(skb, (unsigned char *) p->recvbounce[p->rmdnum],len);
 #endif
-                               p->stats.rx_packets++;
-                               p->stats.rx_bytes += len;
+                               dev->stats.rx_packets++;
+                               dev->stats.rx_bytes += len;
                                skb->protocol=eth_type_trans(skb,dev);
                                netif_rx(skb);
-                               dev->last_rx = jiffies;
                        }
                        else
                        {
                                printk(KERN_ERR "%s: can't alloc new sk_buff\n",dev->name);
-                               p->stats.rx_dropped++;
+                               dev->stats.rx_dropped++;
                        }
                }
                else {
                        printk(KERN_INFO "%s: received runt packet\n",dev->name);
-                       p->stats.rx_errors++;
+                       dev->stats.rx_errors++;
                }
                rmdp->blen = -(R_BUF_SIZE-8);
                rmdp->mlen = 0;
@@ -1142,11 +1138,11 @@ static void ni65_recv_intr(struct net_device *dev,int csr0)
 /*
  * kick xmitter ..
  */
+
 static void ni65_timeout(struct net_device *dev)
 {
        int i;
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = dev->ml_priv;
 
        printk(KERN_ERR "%s: xmitter timed out, try to restart!\n",dev->name);
        for(i=0;i<TMDNUM;i++)
@@ -1163,10 +1159,10 @@ static void ni65_timeout(struct net_device *dev)
 
 static int ni65_send_packet(struct sk_buff *skb, struct net_device *dev)
 {
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = dev->ml_priv;
 
        netif_stop_queue(dev);
-       
+
        if (test_and_set_bit(0, (void*)&p->lock)) {
                printk(KERN_ERR "%s: Queue was locked.\n", dev->name);
                return 1;
@@ -1181,8 +1177,9 @@ static int ni65_send_packet(struct sk_buff *skb, struct net_device *dev)
                if( (unsigned long) (skb->data + skb->len) > 0x1000000) {
 #endif
 
-                       memcpy((char *) p->tmdbounce[p->tmdbouncenum] ,(char *)skb->data,
-                                                        (skb->len > T_BUF_SIZE) ? T_BUF_SIZE : skb->len);
+                       skb_copy_from_linear_data(skb, p->tmdbounce[p->tmdbouncenum],
+                                     skb->len > T_BUF_SIZE ? T_BUF_SIZE :
+                                                             skb->len);
                        if (len > skb->len)
                                memset((char *)p->tmdbounce[p->tmdbouncenum]+skb->len, 0, len-skb->len);
                        dev_kfree_skb (skb);
@@ -1212,33 +1209,16 @@ static int ni65_send_packet(struct sk_buff *skb, struct net_device *dev)
 
                if(p->tmdnum != p->tmdlast)
                        netif_wake_queue(dev);
-                       
+
                p->lock = 0;
                dev->trans_start = jiffies;
-               
+
                spin_unlock_irqrestore(&p->ring_lock, flags);
        }
 
        return 0;
 }
 
-static struct net_device_stats *ni65_get_stats(struct net_device *dev)
-{
-
-#if 0
-       int i;
-       struct priv *p = (struct priv *) dev->priv;
-       for(i=0;i<RMDNUM;i++)
-       {
-               struct rmd *rmdp = p->rmdhead + ((p->rmdnum + i) & (RMDNUM-1));
-               printk("%02x ",rmdp->u.s.status);
-       }
-       printk("\n");
-#endif
-
-       return &((struct priv *) dev->priv)->stats;
-}
-
 static void set_multicast_list(struct net_device *dev)
 {
        if(!ni65_lance_reinit(dev))
@@ -1256,13 +1236,13 @@ MODULE_PARM_DESC(irq, "ni6510 IRQ number (ignored for some cards)");
 MODULE_PARM_DESC(io, "ni6510 I/O base address");
 MODULE_PARM_DESC(dma, "ni6510 ISA DMA channel (ignored for some cards)");
 
-int init_module(void)
+int __init init_module(void)
 {
        dev_ni65 = ni65_probe(-1);
        return IS_ERR(dev_ni65) ? PTR_ERR(dev_ni65) : 0;
 }
 
-void cleanup_module(void)
+void __exit cleanup_module(void)
 {
        unregister_netdev(dev_ni65);
        cleanup_card(dev_ni65);
@@ -1271,7 +1251,3 @@ void cleanup_module(void)
 #endif /* MODULE */
 
 MODULE_LICENSE("GPL");
-
-/*
- * END of ni65.c
- */