USB: usbmon: fix bug in mon_buff_area_shrink
[safe/jmp/linux-2.6] / drivers / net / tokenring / tms380tr.c
index df43b44..a7b6888 100644 (file)
@@ -30,7 +30,7 @@
  *  Maintainer(s):
  *    JS       Jay Schulist            jschlst@samba.org
  *    CG       Christoph Goos          cgoos@syskonnect.de
- *    AF       Adam Fritzler           mid@auk.cx
+ *    AF       Adam Fritzler
  *    MLP       Mike Phillips           phillim@amtrak.com
  *    JF       Jochen Friedrich        jochen@scram.de
  *     
@@ -62,6 +62,7 @@
  *                             normal operation.
  *     30-Dec-02       JF      Removed incorrect __init from 
  *                             tms380tr_init_card.
+ *     22-Jul-05       JF      Converted to dma-mapping.
  *                             
  *  To do:
  *    1. Multi/Broadcast packet handling (this may have fixed itself)
@@ -89,7 +90,7 @@ static const char version[] = "tms380tr.c: v1.10 30/12/2002 by Christoph Goos, A
 #include <linux/time.h>
 #include <linux/errno.h>
 #include <linux/init.h>
-#include <linux/pci.h>
+#include <linux/dma-mapping.h>
 #include <linux/delay.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
@@ -114,8 +115,6 @@ static const char version[] = "tms380tr.c: v1.10 30/12/2002 by Christoph Goos, A
 #endif
 static unsigned int tms380tr_debug = TMS380TR_DEBUG;
 
-static struct device tms_device;
-
 /* Index to functions, as function prototypes.
  * Alphabetical by function name.
  */
@@ -145,8 +144,8 @@ static void         tms380tr_exec_sifcmd(struct net_device *dev, unsigned int WriteValu
 /* "G" */
 static struct net_device_stats *tms380tr_get_stats(struct net_device *dev);
 /* "H" */
-static int     tms380tr_hardware_send_packet(struct sk_buff *skb,
-                       struct net_device *dev);
+static netdev_tx_t tms380tr_hardware_send_packet(struct sk_buff *skb,
+                                                      struct net_device *dev);
 /* "I" */
 static int     tms380tr_init_adapter(struct net_device *dev);
 static void    tms380tr_init_ipb(struct net_local *tp);
@@ -166,7 +165,8 @@ static int  tms380tr_reset_adapter(struct net_device *dev);
 static void    tms380tr_reset_interrupt(struct net_device *dev);
 static void    tms380tr_ring_status_irq(struct net_device *dev);
 /* "S" */
-static int     tms380tr_send_packet(struct sk_buff *skb, struct net_device *dev);
+static netdev_tx_t tms380tr_send_packet(struct sk_buff *skb,
+                                             struct net_device *dev);
 static void    tms380tr_set_multicast_list(struct net_device *dev);
 static int     tms380tr_set_mac_address(struct net_device *dev, void *addr);
 /* "T" */
@@ -181,10 +181,14 @@ void              tms380tr_wait(unsigned long time);
 static void    tms380tr_write_rpl_status(RPL *rpl, unsigned int Status);
 static void    tms380tr_write_tpl_status(TPL *tpl, unsigned int Status);
 
-#define SIFREADB(reg) (((struct net_local *)dev->priv)->sifreadb(dev, reg))
-#define SIFWRITEB(val, reg) (((struct net_local *)dev->priv)->sifwriteb(dev, val, reg))
-#define SIFREADW(reg) (((struct net_local *)dev->priv)->sifreadw(dev, reg))
-#define SIFWRITEW(val, reg) (((struct net_local *)dev->priv)->sifwritew(dev, val, reg))
+#define SIFREADB(reg) \
+       (((struct net_local *)netdev_priv(dev))->sifreadb(dev, reg))
+#define SIFWRITEB(val, reg) \
+       (((struct net_local *)netdev_priv(dev))->sifwriteb(dev, val, reg))
+#define SIFREADW(reg) \
+       (((struct net_local *)netdev_priv(dev))->sifreadw(dev, reg))
+#define SIFWRITEW(val, reg) \
+       (((struct net_local *)netdev_priv(dev))->sifwritew(dev, val, reg))
 
 
 
@@ -434,7 +438,7 @@ static void tms380tr_init_net_local(struct net_device *dev)
                        skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize);
 
                        /* data unreachable for DMA ? then use local buffer */
-                       dmabuf = pci_map_single(tp->pdev, tp->Rpl[i].Skb->data, tp->MaxPacketSize, PCI_DMA_FROMDEVICE);
+                       dmabuf = dma_map_single(tp->pdev, tp->Rpl[i].Skb->data, tp->MaxPacketSize, DMA_FROM_DEVICE);
                        if(tp->dmalimit && (dmabuf + tp->MaxPacketSize > tp->dmalimit))
                        {
                                tp->Rpl[i].SkbStat = SKB_DATA_COPY;
@@ -596,21 +600,23 @@ static void tms380tr_timeout(struct net_device *dev)
 /*
  * Gets skb from system, queues it and checks if it can be sent
  */
-static int tms380tr_send_packet(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t tms380tr_send_packet(struct sk_buff *skb,
+                                             struct net_device *dev)
 {
        struct net_local *tp = netdev_priv(dev);
-       int err;
+       netdev_tx_t rc;
 
-       err = tms380tr_hardware_send_packet(skb, dev);
+       rc = tms380tr_hardware_send_packet(skb, dev);
        if(tp->TplFree->NextTPLPtr->BusyFlag)
                netif_stop_queue(dev);
-       return (err);
+       return rc;
 }
 
 /*
  * Move frames into adapter tx queue
  */
-static int tms380tr_hardware_send_packet(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t tms380tr_hardware_send_packet(struct sk_buff *skb,
+                                                      struct net_device *dev)
 {
        TPL *tpl;
        short length;
@@ -630,7 +636,7 @@ static int tms380tr_hardware_send_packet(struct sk_buff *skb, struct net_device
                if (tms380tr_debug > 0)
                        printk(KERN_DEBUG "%s: No free TPL\n", dev->name);
                spin_unlock_irqrestore(&tp->lock, flags);
-               return 1;
+               return NETDEV_TX_BUSY;
        }
 
        dmabuf = 0;
@@ -638,14 +644,14 @@ static int tms380tr_hardware_send_packet(struct sk_buff *skb, struct net_device
        /* Is buffer reachable for Busmaster-DMA? */
 
        length  = skb->len;
-       dmabuf = pci_map_single(tp->pdev, skb->data, length, PCI_DMA_TODEVICE);
+       dmabuf = dma_map_single(tp->pdev, skb->data, length, DMA_TO_DEVICE);
        if(tp->dmalimit && (dmabuf + length > tp->dmalimit)) {
                /* Copy frame to local buffer */
-               pci_unmap_single(tp->pdev, dmabuf, length, PCI_DMA_TODEVICE);
+               dma_unmap_single(tp->pdev, dmabuf, length, DMA_TO_DEVICE);
                dmabuf  = 0;
                i       = tp->TplFree->TPLIndex;
                buf     = tp->LocalTxBuffers[i];
-               memcpy(buf, skb->data, length);
+               skb_copy_from_linear_data(skb, buf, length);
                newbuf  = ((char *)buf - (char *)tp) + tp->dmabuffer;
        }
        else {
@@ -679,7 +685,7 @@ static int tms380tr_hardware_send_packet(struct sk_buff *skb, struct net_device
        tms380tr_exec_sifcmd(dev, CMD_TX_VALID);
        spin_unlock_irqrestore(&tp->lock, flags);
 
-       return 0;
+       return NETDEV_TX_OK;
 }
 
 /*
@@ -745,18 +751,13 @@ static void tms380tr_timer_chk(unsigned long data)
 /*
  * The typical workload of the driver: Handle the network interface interrupts.
  */
-irqreturn_t tms380tr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+irqreturn_t tms380tr_interrupt(int irq, void *dev_id)
 {
        struct net_device *dev = dev_id;
        struct net_local *tp;
        unsigned short irq_type;
        int handled = 0;
 
-       if(dev == NULL) {
-               printk(KERN_INFO "%s: irq %d for unknown device.\n", dev->name, irq);
-               return IRQ_NONE;
-       }
-
        tp = netdev_priv(dev);
 
        irq_type = SIFREADW(SIFSTS);
@@ -1244,8 +1245,7 @@ void tms380tr_wait(unsigned long time)
        
        tmp = jiffies + time/(1000000/HZ);
        do {
-               current->state          = TASK_INTERRUPTIBLE;
-               tmp = schedule_timeout(tmp);
+               tmp = schedule_timeout_interruptible(tmp);
        } while(time_after(tmp, jiffies));
 #else
        udelay(time);
@@ -1284,9 +1284,7 @@ static int tms380tr_reset_adapter(struct net_device *dev)
        unsigned short count, c, count2;
        const struct firmware *fw_entry = NULL;
 
-       strncpy(tms_device.bus_id,dev->name, BUS_ID_SIZE);
-
-       if (request_firmware(&fw_entry, "tms380tr.bin", &tms_device) != 0) {
+       if (request_firmware(&fw_entry, "tms380tr.bin", tp->pdev) != 0) {
                printk(KERN_ALERT "%s: firmware %s is missing, cannot start.\n",
                        dev->name, "tms380tr.bin");
                return (-1);
@@ -2021,7 +2019,7 @@ static void tms380tr_cancel_tx_queue(struct net_local* tp)
 
                printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl);
                if (tpl->DMABuff)
-                       pci_unmap_single(tp->pdev, tpl->DMABuff, tpl->Skb->len, PCI_DMA_TODEVICE);
+                       dma_unmap_single(tp->pdev, tpl->DMABuff, tpl->Skb->len, DMA_TO_DEVICE);
                dev_kfree_skb_any(tpl->Skb);
        }
 
@@ -2090,7 +2088,7 @@ static void tms380tr_tx_status_irq(struct net_device *dev)
 
                tp->MacStat.tx_packets++;
                if (tpl->DMABuff)
-                       pci_unmap_single(tp->pdev, tpl->DMABuff, tpl->Skb->len, PCI_DMA_TODEVICE);
+                       dma_unmap_single(tp->pdev, tpl->DMABuff, tpl->Skb->len, DMA_TO_DEVICE);
                dev_kfree_skb_irq(tpl->Skb);
                tpl->BusyFlag = 0;      /* "free" TPL */
        }
@@ -2133,7 +2131,7 @@ static void tms380tr_rcv_status_irq(struct net_device *dev)
                /* Get the frame size (Byte swap for Intel).
                 * Do this early (see workaround comment below)
                 */
-               Length = be16_to_cpu((unsigned short)rpl->FrameSize);
+               Length = be16_to_cpu(rpl->FrameSize);
 
                /* Check if the Frame_Start, Frame_End and
                 * Frame_Complete bits are set.
@@ -2149,7 +2147,7 @@ static void tms380tr_rcv_status_irq(struct net_device *dev)
                         * Length2 is there because there have also been
                         * cases where the FrameSize was partially written
                         */
-                       Length2 = be16_to_cpu((unsigned short)rpl->FrameSize);
+                       Length2 = be16_to_cpu(rpl->FrameSize);
 
                        if(Length == 0 || Length != Length2)
                        {
@@ -2177,7 +2175,6 @@ static void tms380tr_rcv_status_irq(struct net_device *dev)
                                }
                                else
                                {
-                                       skb->dev        = dev;
                                        skb_put(skb, tp->MaxPacketSize);
                                        rpl->SkbStat    = SKB_DATA_COPY;
                                        ReceiveDataPtr  = rpl->MData;
@@ -2188,14 +2185,14 @@ static void tms380tr_rcv_status_irq(struct net_device *dev)
                                || rpl->SkbStat == SKB_DMA_DIRECT))
                        {
                                if(rpl->SkbStat == SKB_DATA_COPY)
-                                       memcpy(skb->data, ReceiveDataPtr, Length);
+                                       skb_copy_to_linear_data(skb, ReceiveDataPtr,
+                                                      Length);
 
                                /* Deliver frame to system */
                                rpl->Skb = NULL;
                                skb_trim(skb,Length);
                                skb->protocol = tr_type_trans(skb,dev);
                                netif_rx(skb);
-                               dev->last_rx = jiffies;
                        }
                }
                else    /* Invalid frame */
@@ -2209,7 +2206,7 @@ static void tms380tr_rcv_status_irq(struct net_device *dev)
                                tp->MacStat.rx_errors++;
                }
                if (rpl->DMABuff)
-                       pci_unmap_single(tp->pdev, rpl->DMABuff, tp->MaxPacketSize, PCI_DMA_TODEVICE);
+                       dma_unmap_single(tp->pdev, rpl->DMABuff, tp->MaxPacketSize, DMA_TO_DEVICE);
                rpl->DMABuff = 0;
 
                /* Allocate new skb for rpl */
@@ -2227,7 +2224,7 @@ static void tms380tr_rcv_status_irq(struct net_device *dev)
                        skb_put(rpl->Skb, tp->MaxPacketSize);
 
                        /* Data unreachable for DMA ? then use local buffer */
-                       dmabuf = pci_map_single(tp->pdev, rpl->Skb->data, tp->MaxPacketSize, PCI_DMA_FROMDEVICE);
+                       dmabuf = dma_map_single(tp->pdev, rpl->Skb->data, tp->MaxPacketSize, DMA_FROM_DEVICE);
                        if(tp->dmalimit && (dmabuf + tp->MaxPacketSize > tp->dmalimit))
                        {
                                rpl->SkbStat = SKB_DATA_COPY;
@@ -2332,23 +2329,37 @@ void tmsdev_term(struct net_device *dev)
        struct net_local *tp;
 
        tp = netdev_priv(dev);
-       pci_unmap_single(tp->pdev, tp->dmabuffer, sizeof(struct net_local),
-               PCI_DMA_BIDIRECTIONAL);
+       dma_unmap_single(tp->pdev, tp->dmabuffer, sizeof(struct net_local),
+               DMA_BIDIRECTIONAL);
 }
 
-int tmsdev_init(struct net_device *dev, unsigned long dmalimit, 
-               struct pci_dev *pdev)
+const struct net_device_ops tms380tr_netdev_ops = {
+       .ndo_open               = tms380tr_open,
+       .ndo_stop               = tms380tr_close,
+       .ndo_start_xmit         = tms380tr_send_packet,
+       .ndo_tx_timeout         = tms380tr_timeout,
+       .ndo_get_stats          = tms380tr_get_stats,
+       .ndo_set_multicast_list = tms380tr_set_multicast_list,
+       .ndo_set_mac_address    = tms380tr_set_mac_address,
+};
+EXPORT_SYMBOL(tms380tr_netdev_ops);
+
+int tmsdev_init(struct net_device *dev, struct device *pdev)
 {
        struct net_local *tms_local;
 
-       memset(dev->priv, 0, sizeof(struct net_local));
+       memset(netdev_priv(dev), 0, sizeof(struct net_local));
        tms_local = netdev_priv(dev);
        init_waitqueue_head(&tms_local->wait_for_tok_int);
-       tms_local->dmalimit = dmalimit;
+       if (pdev->dma_mask)
+               tms_local->dmalimit = *pdev->dma_mask;
+       else
+               return -ENOMEM;
        tms_local->pdev = pdev;
-       tms_local->dmabuffer = pci_map_single(pdev, (void *)tms_local,
-           sizeof(struct net_local), PCI_DMA_BIDIRECTIONAL);
-       if (tms_local->dmabuffer + sizeof(struct net_local) > dmalimit)
+       tms_local->dmabuffer = dma_map_single(pdev, (void *)tms_local,
+           sizeof(struct net_local), DMA_BIDIRECTIONAL);
+       if (tms_local->dmabuffer + sizeof(struct net_local) > 
+                       tms_local->dmalimit)
        {
                printk(KERN_INFO "%s: Memory not accessible for DMA\n",
                        dev->name);
@@ -2356,22 +2367,12 @@ int tmsdev_init(struct net_device *dev, unsigned long dmalimit,
                return -ENOMEM;
        }
        
-       /* These can be overridden by the card driver if needed */
-       dev->open               = tms380tr_open;
-       dev->stop               = tms380tr_close;
-       dev->do_ioctl           = NULL; 
-       dev->hard_start_xmit    = tms380tr_send_packet;
-       dev->tx_timeout         = tms380tr_timeout;
+       dev->netdev_ops         = &tms380tr_netdev_ops;
        dev->watchdog_timeo     = HZ;
-       dev->get_stats          = tms380tr_get_stats;
-       dev->set_multicast_list = &tms380tr_set_multicast_list;
-       dev->set_mac_address    = tms380tr_set_mac_address;
 
        return 0;
 }
 
-#ifdef MODULE
-
 EXPORT_SYMBOL(tms380tr_open);
 EXPORT_SYMBOL(tms380tr_close);
 EXPORT_SYMBOL(tms380tr_interrupt);
@@ -2379,7 +2380,9 @@ EXPORT_SYMBOL(tmsdev_init);
 EXPORT_SYMBOL(tmsdev_term);
 EXPORT_SYMBOL(tms380tr_wait);
 
-struct module *TMS380_module = NULL;
+#ifdef MODULE
+
+static struct module *TMS380_module = NULL;
 
 int init_module(void)
 {
@@ -2397,14 +2400,3 @@ void cleanup_module(void)
 
 MODULE_LICENSE("GPL");
 
-\f
-/*
- * Local variables:
- *  compile-command: "gcc -DMODVERSIONS  -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer -I/usr/src/linux/drivers/net/tokenring/ -c tms380tr.c"
- *  alt-compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer -I/usr/src/linux/drivers/net/tokenring/ -c tms380tr.c"
- *  c-set-style "K&R"
- *  c-indent-level: 8
- *  c-basic-offset: 8
- *  tab-width: 8
- * End:
- */