fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / net / acenic.c
index 90ed332..33c6645 100644 (file)
  *   Grant Grundler <grundler@cup.hp.com>: PCI write posting fixes.
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/version.h>
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/ioport.h>
 #include <linux/pci.h>
+#include <linux/dma-mapping.h>
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
@@ -98,7 +99,7 @@
 #endif
 
 #ifndef PCI_VENDOR_ID_ALTEON
-#define PCI_VENDOR_ID_ALTEON           0x12ae  
+#define PCI_VENDOR_ID_ALTEON           0x12ae
 #endif
 #ifndef PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE
 #define PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE  0x0001
@@ -162,11 +163,7 @@ MODULE_DEVICE_TABLE(pci, acenic_pci_tbl);
 #define SET_NETDEV_DEV(net, pdev)      do{} while(0)
 #endif
 
-#if LINUX_VERSION_CODE >= 0x2051c
 #define ace_sync_irq(irq)      synchronize_irq(irq)
-#else
-#define ace_sync_irq(irq)      synchronize_irq()
-#endif
 
 #ifndef offset_in_page
 #define offset_in_page(ptr)    ((unsigned long)(ptr) & ~PAGE_MASK)
@@ -425,13 +422,14 @@ static int dis_pci_mem_inval[ACE_MAX_MOD_PARMS] = {1, 1, 1, 1, 1, 1, 1, 1};
 MODULE_AUTHOR("Jes Sorensen <jes@trained-monkey.org>");
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("AceNIC/3C985/GA620 Gigabit Ethernet driver");
-MODULE_PARM(link, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(trace, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(tx_coal_tick, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(max_tx_desc, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(rx_coal_tick, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(max_rx_desc, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(tx_ratio, "1-" __MODULE_STRING(8) "i");
+
+module_param_array(link, int, NULL, 0);
+module_param_array(trace, int, NULL, 0);
+module_param_array(tx_coal_tick, int, NULL, 0);
+module_param_array(max_tx_desc, int, NULL, 0);
+module_param_array(rx_coal_tick, int, NULL, 0);
+module_param_array(max_rx_desc, int, NULL, 0);
+module_param_array(tx_ratio, int, NULL, 0);
 MODULE_PARM_DESC(link, "AceNIC/3C985/NetGear link state");
 MODULE_PARM_DESC(trace, "AceNIC/3C985/NetGear firmware trace level");
 MODULE_PARM_DESC(tx_coal_tick, "AceNIC/3C985/GA620 max clock ticks to wait from first tx descriptor arrives");
@@ -441,7 +439,7 @@ MODULE_PARM_DESC(max_rx_desc, "AceNIC/3C985/GA620 max number of receive descript
 MODULE_PARM_DESC(tx_ratio, "AceNIC/3C985/GA620 ratio of NIC memory used for TX/RX descriptors (range 0-63)");
 
 
-static char version[] __initdata = 
+static char version[] __devinitdata =
   "acenic.c: v0.92 08/05/2002  Jes Sorensen, linux-acenic@SunSITE.dk\n"
   "                            http://home.cern.ch/~jes/gige/acenic.html\n";
 
@@ -449,12 +447,14 @@ static int ace_get_settings(struct net_device *, struct ethtool_cmd *);
 static int ace_set_settings(struct net_device *, struct ethtool_cmd *);
 static void ace_get_drvinfo(struct net_device *, struct ethtool_drvinfo *);
 
-static struct ethtool_ops ace_ethtool_ops = {
+static const struct ethtool_ops ace_ethtool_ops = {
        .get_settings = ace_get_settings,
        .set_settings = ace_set_settings,
        .get_drvinfo = ace_get_drvinfo,
 };
 
+static void ace_watchdog(struct net_device *dev);
+
 static int __devinit acenic_probe_one(struct pci_dev *pdev,
                const struct pci_device_id *id)
 {
@@ -474,6 +474,7 @@ static int __devinit acenic_probe_one(struct pci_dev *pdev,
 
        ap = dev->priv;
        ap->pdev = pdev;
+       ap->name = pci_name(pdev);
 
        dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
 #if ACENIC_DO_VLAN
@@ -482,7 +483,6 @@ static int __devinit acenic_probe_one(struct pci_dev *pdev,
        dev->vlan_rx_kill_vid = ace_vlan_rx_kill_vid;
 #endif
        if (1) {
-               static void ace_watchdog(struct net_device *dev);
                dev->tx_timeout = &ace_watchdog;
                dev->watchdog_timeo = 5*HZ;
        }
@@ -512,11 +512,11 @@ static int __devinit acenic_probe_one(struct pci_dev *pdev,
 
        pci_read_config_word(pdev, PCI_COMMAND, &ap->pci_command);
 
-       /* OpenFirmware on Mac's does not set this - DOH.. */ 
+       /* OpenFirmware on Mac's does not set this - DOH.. */
        if (!(ap->pci_command & PCI_COMMAND_MEMORY)) {
                printk(KERN_INFO "%s: Enabling PCI Memory Mapped "
                       "access - was not enabled by BIOS/Firmware\n",
-                      dev->name);
+                      ap->name);
                ap->pci_command = ap->pci_command | PCI_COMMAND_MEMORY;
                pci_write_config_word(ap->pdev, PCI_COMMAND,
                                      ap->pci_command);
@@ -535,65 +535,46 @@ static int __devinit acenic_probe_one(struct pci_dev *pdev,
         * addresses but who gives a damn.
         */
        dev->base_addr = pci_resource_start(pdev, 0);
-       ap->regs = (struct ace_regs *)ioremap(dev->base_addr, 0x4000);
+       ap->regs = ioremap(dev->base_addr, 0x4000);
        if (!ap->regs) {
                printk(KERN_ERR "%s:  Unable to map I/O register, "
                       "AceNIC %i will be disabled.\n",
-                      dev->name, boards_found);
+                      ap->name, boards_found);
                goto fail_free_netdev;
        }
 
        switch(pdev->vendor) {
        case PCI_VENDOR_ID_ALTEON:
                if (pdev->device == PCI_DEVICE_ID_FARALLON_PN9100T) {
-                       strncpy(ap->name, "Farallon PN9100-T "
-                               "Gigabit Ethernet", sizeof (ap->name));
                        printk(KERN_INFO "%s: Farallon PN9100-T ",
-                              dev->name);
+                              ap->name);
                } else {
-                       strncpy(ap->name, "AceNIC Gigabit Ethernet",
-                               sizeof (ap->name));
                        printk(KERN_INFO "%s: Alteon AceNIC ",
-                              dev->name);
+                              ap->name);
                }
                break;
        case PCI_VENDOR_ID_3COM:
-               strncpy(ap->name, "3Com 3C985 Gigabit Ethernet",
-                       sizeof (ap->name));
-               printk(KERN_INFO "%s: 3Com 3C985 ", dev->name);
+               printk(KERN_INFO "%s: 3Com 3C985 ", ap->name);
                break;
        case PCI_VENDOR_ID_NETGEAR:
-               strncpy(ap->name, "NetGear GA620 Gigabit Ethernet",
-                       sizeof (ap->name));
-               printk(KERN_INFO "%s: NetGear GA620 ", dev->name);
+               printk(KERN_INFO "%s: NetGear GA620 ", ap->name);
                break;
        case PCI_VENDOR_ID_DEC:
                if (pdev->device == PCI_DEVICE_ID_FARALLON_PN9000SX) {
-                       strncpy(ap->name, "Farallon PN9000-SX "
-                               "Gigabit Ethernet", sizeof (ap->name));
                        printk(KERN_INFO "%s: Farallon PN9000-SX ",
-                              dev->name);
+                              ap->name);
                        break;
                }
        case PCI_VENDOR_ID_SGI:
-               strncpy(ap->name, "SGI AceNIC Gigabit Ethernet",
-                       sizeof (ap->name));
-               printk(KERN_INFO "%s: SGI AceNIC ", dev->name);
+               printk(KERN_INFO "%s: SGI AceNIC ", ap->name);
                break;
        default:
-               strncpy(ap->name, "Unknown AceNIC based Gigabit "
-                       "Ethernet", sizeof (ap->name));
-               printk(KERN_INFO "%s: Unknown AceNIC ", dev->name);
+               printk(KERN_INFO "%s: Unknown AceNIC ", ap->name);
                break;
        }
 
-       ap->name [sizeof (ap->name) - 1] = '\0';
        printk("Gigabit Ethernet at 0x%08lx, ", dev->base_addr);
-#ifdef __sparc__
-       printk("irq %s\n", __irq_itoa(pdev->irq));
-#else
-       printk("irq %i\n", pdev->irq);
-#endif
+       printk("irq %d\n", pdev->irq);
 
 #ifdef CONFIG_ACENIC_OMIT_TIGON_I
        if ((readl(&ap->regs->HostCtrl) >> 28) == 4) {
@@ -622,6 +603,7 @@ static int __devinit acenic_probe_one(struct pci_dev *pdev,
                printk(KERN_ERR "acenic: device registration failed\n");
                goto fail_uninit;
        }
+       ap->name = dev->name;
 
        if (ap->pci_using_dac)
                dev->features |= NETIF_F_HIGHDMA;
@@ -641,8 +623,8 @@ static int __devinit acenic_probe_one(struct pci_dev *pdev,
 static void __devexit acenic_remove_one(struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata(pdev);
-       struct ace_private *ap = dev->priv;
-       struct ace_regs *regs = ap->regs;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
        short i;
 
        unregister_netdev(dev);
@@ -650,7 +632,7 @@ static void __devexit acenic_remove_one(struct pci_dev *pdev)
        writel(readl(&regs->CpuCtrl) | CPU_HALT, &regs->CpuCtrl);
        if (ap->version >= 2)
                writel(readl(&regs->CpuBCtrl) | CPU_HALT, &regs->CpuBCtrl);
-       
+
        /*
         * This clears any pending interrupts
         */
@@ -739,7 +721,7 @@ static struct pci_driver acenic_pci_driver = {
 
 static int __init acenic_init(void)
 {
-       return pci_module_init(&acenic_pci_driver);
+       return pci_register_driver(&acenic_pci_driver);
 }
 
 static void __exit acenic_exit(void)
@@ -752,7 +734,7 @@ module_exit(acenic_exit);
 
 static void ace_free_descriptors(struct net_device *dev)
 {
-       struct ace_private *ap = dev->priv;
+       struct ace_private *ap = netdev_priv(dev);
        int size;
 
        if (ap->rx_std_ring != NULL) {
@@ -802,7 +784,7 @@ static void ace_free_descriptors(struct net_device *dev)
 
 static int ace_allocate_descriptors(struct net_device *dev)
 {
-       struct ace_private *ap = dev->priv;
+       struct ace_private *ap = netdev_priv(dev);
        int size;
 
        size = (sizeof(struct rx_desc) *
@@ -873,17 +855,15 @@ static void ace_init_cleanup(struct net_device *dev)
 {
        struct ace_private *ap;
 
-       ap = dev->priv;
+       ap = netdev_priv(dev);
 
        ace_free_descriptors(dev);
 
        if (ap->info)
                pci_free_consistent(ap->pdev, sizeof(struct ace_info),
                                    ap->info, ap->info_dma);
-       if (ap->skb)
-               kfree(ap->skb);
-       if (ap->trace_buf)
-               kfree(ap->trace_buf);
+       kfree(ap->skb);
+       kfree(ap->trace_buf);
 
        if (dev->irq)
                free_irq(dev->irq, dev);
@@ -895,7 +875,7 @@ static void ace_init_cleanup(struct net_device *dev)
 /*
  * Commands are considered to be slow.
  */
-static inline void ace_issue_cmd(struct ace_regs *regs, struct cmd *cmd)
+static inline void ace_issue_cmd(struct ace_regs __iomem *regs, struct cmd *cmd)
 {
        u32 idx;
 
@@ -908,10 +888,10 @@ static inline void ace_issue_cmd(struct ace_regs *regs, struct cmd *cmd)
 }
 
 
-static int __init ace_init(struct net_device *dev)
+static int __devinit ace_init(struct net_device *dev)
 {
        struct ace_private *ap;
-       struct ace_regs *regs;
+       struct ace_regs __iomem *regs;
        struct ace_info *info = NULL;
        struct pci_dev *pdev;
        unsigned long myjif;
@@ -921,7 +901,7 @@ static int __init ace_init(struct net_device *dev)
        short i;
        unsigned char cache_size;
 
-       ap = dev->priv;
+       ap = netdev_priv(dev);
        regs = ap->regs;
 
        board_idx = ap->board_idx;
@@ -1013,6 +993,8 @@ static int __init ace_init(struct net_device *dev)
 
        mac1 = 0;
        for(i = 0; i < 4; i++) {
+               int tmp;
+
                mac1 = mac1 << 8;
                tmp = read_eeprom_byte(dev, 0x8c+i);
                if (tmp < 0) {
@@ -1023,6 +1005,8 @@ static int __init ace_init(struct net_device *dev)
        }
        mac2 = 0;
        for(i = 4; i < 8; i++) {
+               int tmp;
+
                mac2 = mac2 << 8;
                tmp = read_eeprom_byte(dev, 0x8c+i);
                if (tmp < 0) {
@@ -1071,7 +1055,7 @@ static int __init ace_init(struct net_device *dev)
        printk(KERN_INFO "  PCI bus width: %i bits, speed: %iMHz, "
               "latency: %i clks\n",
                (pci_state & PCI_32BIT) ? 32 : 64,
-               (pci_state & PCI_66MHZ) ? 66 : 33, 
+               (pci_state & PCI_66MHZ) ? 66 : 33,
                ap->pci_latency);
 
        /*
@@ -1173,13 +1157,13 @@ static int __init ace_init(struct net_device *dev)
                pci_write_config_word(pdev, PCI_COMMAND, ap->pci_command);
        }
 #endif
-               
+
        /*
         * Configure DMA attributes.
         */
-       if (!pci_set_dma_mask(pdev, 0xffffffffffffffffULL)) {
+       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
                ap->pci_using_dac = 1;
-       } else if (!pci_set_dma_mask(pdev, 0xffffffffULL)) {
+       } else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
                ap->pci_using_dac = 0;
        } else {
                ecode = -ENODEV;
@@ -1206,7 +1190,7 @@ static int __init ace_init(struct net_device *dev)
                goto init_error;
        }
 
-       ecode = request_irq(pdev->irq, ace_interrupt, SA_SHIRQ,
+       ecode = request_irq(pdev->irq, ace_interrupt, IRQF_SHARED,
                            DRV_NAME, dev);
        if (ecode) {
                printk(KERN_WARNING "%s: Requested IRQ %d is busy\n",
@@ -1296,7 +1280,7 @@ static int __init ace_init(struct net_device *dev)
                              (RX_STD_RING_ENTRIES +
                               RX_JUMBO_RING_ENTRIES))));
                info->rx_mini_ctrl.max_len = ACE_MINI_SIZE;
-               info->rx_mini_ctrl.flags = 
+               info->rx_mini_ctrl.flags =
                  RCB_FLG_TCP_UDP_SUM|RCB_FLG_NO_PSEUDO_HDR|ACE_RCB_VLAN_FLAG;
 
                for (i = 0; i < RX_MINI_RING_ENTRIES; i++)
@@ -1329,11 +1313,10 @@ static int __init ace_init(struct net_device *dev)
        writel(TX_RING_BASE, &regs->WinBase);
 
        if (ACE_IS_TIGON_I(ap)) {
-               ap->tx_ring = (struct tx_desc *)regs->Window;
-               for (i = 0; i < (TIGON_I_TX_RING_ENTRIES * 
-                                sizeof(struct tx_desc) / 4); i++) {
-                       writel(0, (unsigned long)ap->tx_ring + i * 4);
-               }
+               ap->tx_ring = (struct tx_desc *) regs->Window;
+               for (i = 0; i < (TIGON_I_TX_RING_ENTRIES
+                                * sizeof(struct tx_desc)) / sizeof(u32); i++)
+                       writel(0, (void __iomem *)ap->tx_ring  + i * 4);
 
                set_aceaddr(&info->tx_ctrl.rngptr, TX_RING_BASE);
        } else {
@@ -1387,7 +1370,7 @@ static int __init ace_init(struct net_device *dev)
        if (board_idx == BOARD_IDX_OVERFLOW) {
                printk(KERN_WARNING "%s: more than %i NICs detected, "
                       "ignoring module parameters!\n",
-                      dev->name, ACE_MAX_MOD_PARMS);
+                      ap->name, ACE_MAX_MOD_PARMS);
        } else if (board_idx >= 0) {
                if (tx_coal_tick[board_idx])
                        writel(tx_coal_tick[board_idx],
@@ -1426,7 +1409,7 @@ static int __init ace_init(struct net_device *dev)
 
                if (option & 0x01) {
                        printk(KERN_INFO "%s: Setting half duplex link\n",
-                              dev->name);
+                              ap->name);
                        tmp &= ~LNK_FULL_DUPLEX;
                }
                if (option & 0x02)
@@ -1439,7 +1422,7 @@ static int __init ace_init(struct net_device *dev)
                        tmp |= LNK_1000MB;
                if ((option & 0x70) == 0) {
                        printk(KERN_WARNING "%s: No media speed specified, "
-                              "forcing auto negotiation\n", dev->name);
+                              "forcing auto negotiation\n", ap->name);
                        tmp |= LNK_NEGOTIATE | LNK_1000MB |
                                LNK_100MB | LNK_10MB;
                }
@@ -1447,12 +1430,12 @@ static int __init ace_init(struct net_device *dev)
                        tmp |= LNK_NEG_FCTL;
                else
                        printk(KERN_INFO "%s: Disabling flow control "
-                              "negotiation\n", dev->name);
+                              "negotiation\n", ap->name);
                if (option & 0x200)
                        tmp |= LNK_RX_FLOW_CTL_Y;
                if ((option & 0x400) && (ap->version >= 2)) {
                        printk(KERN_INFO "%s: Enabling TX flow control\n",
-                              dev->name);
+                              ap->name);
                        tmp |= LNK_TX_FLOW_CTL_Y;
                }
        }
@@ -1509,7 +1492,7 @@ static int __init ace_init(struct net_device *dev)
                cpu_relax();
 
        if (!ap->fw_running) {
-               printk(KERN_ERR "%s: Firmware NOT running!\n", dev->name);
+               printk(KERN_ERR "%s: Firmware NOT running!\n", ap->name);
 
                ace_dump_trace(ap);
                writel(readl(&regs->CpuCtrl) | CPU_HALT, &regs->CpuCtrl);
@@ -1542,13 +1525,13 @@ static int __init ace_init(struct net_device *dev)
                ace_load_std_rx_ring(ap, RX_RING_SIZE);
        else
                printk(KERN_ERR "%s: Someone is busy refilling the RX ring\n",
-                      dev->name);
+                      ap->name);
        if (ap->version >= 2) {
                if (!test_and_set_bit(0, &ap->mini_refill_busy))
                        ace_load_mini_rx_ring(ap, RX_MINI_SIZE);
                else
                        printk(KERN_ERR "%s: Someone is busy refilling "
-                              "the RX mini ring\n", dev->name);
+                              "the RX mini ring\n", ap->name);
        }
        return 0;
 
@@ -1560,14 +1543,9 @@ static int __init ace_init(struct net_device *dev)
 
 static void ace_set_rxtx_parms(struct net_device *dev, int jumbo)
 {
-       struct ace_private *ap;
-       struct ace_regs *regs;
-       int board_idx;
-
-       ap = dev->priv;
-       regs = ap->regs;
-
-       board_idx = ap->board_idx;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
+       int board_idx = ap->board_idx;
 
        if (board_idx >= 0) {
                if (!jumbo) {
@@ -1604,8 +1582,8 @@ static void ace_set_rxtx_parms(struct net_device *dev, int jumbo)
 static void ace_watchdog(struct net_device *data)
 {
        struct net_device *dev = data;
-       struct ace_private *ap = dev->priv;
-       struct ace_regs *regs = ap->regs;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
 
        /*
         * We haven't received a stats update event for more than 2.5
@@ -1628,7 +1606,7 @@ static void ace_watchdog(struct net_device *data)
 
 static void ace_tasklet(unsigned long dev)
 {
-       struct ace_private *ap = ((struct net_device *)dev)->priv;
+       struct ace_private *ap = netdev_priv((struct net_device *)dev);
        int cur_size;
 
        cur_size = atomic_read(&ap->cur_rx_bufs);
@@ -1686,10 +1664,9 @@ static void ace_dump_trace(struct ace_private *ap)
  */
 static void ace_load_std_rx_ring(struct ace_private *ap, int nr_bufs)
 {
-       struct ace_regs *regs;
+       struct ace_regs __iomem *regs = ap->regs;
        short i, idx;
 
-       regs = ap->regs;
 
        prefetchw(&ap->cur_rx_bufs);
 
@@ -1750,11 +1727,9 @@ static void ace_load_std_rx_ring(struct ace_private *ap, int nr_bufs)
 
 static void ace_load_mini_rx_ring(struct ace_private *ap, int nr_bufs)
 {
-       struct ace_regs *regs;
+       struct ace_regs __iomem *regs = ap->regs;
        short i, idx;
 
-       regs = ap->regs;
-
        prefetchw(&ap->cur_mini_bufs);
 
        idx = ap->rx_mini_skbprd;
@@ -1809,11 +1784,9 @@ static void ace_load_mini_rx_ring(struct ace_private *ap, int nr_bufs)
  */
 static void ace_load_jumbo_rx_ring(struct ace_private *ap, int nr_bufs)
 {
-       struct ace_regs *regs;
+       struct ace_regs __iomem *regs = ap->regs;
        short i, idx;
 
-       regs = ap->regs;
-
        idx = ap->rx_jumbo_skbprd;
 
        for (i = 0; i < nr_bufs; i++) {
@@ -1878,13 +1851,13 @@ static u32 ace_handle_event(struct net_device *dev, u32 evtcsm, u32 evtprd)
 {
        struct ace_private *ap;
 
-       ap = dev->priv;
+       ap = netdev_priv(dev);
 
        while (evtcsm != evtprd) {
                switch (ap->evt_ring[evtcsm].evt) {
                case E_FW_RUNNING:
                        printk(KERN_INFO "%s: Firmware up and running\n",
-                              dev->name);
+                              ap->name);
                        ap->fw_running = 1;
                        wmb();
                        break;
@@ -1899,7 +1872,7 @@ static u32 ace_handle_event(struct net_device *dev, u32 evtcsm, u32 evtprd)
                                u32 state = readl(&ap->regs->GigLnkState);
                                printk(KERN_WARNING "%s: Optical link UP "
                                       "(%s Duplex, Flow Control: %s%s)\n",
-                                      dev->name,
+                                      ap->name,
                                       state & LNK_FULL_DUPLEX ? "Full":"Half",
                                       state & LNK_TX_FLOW_CTL_Y ? "TX " : "",
                                       state & LNK_RX_FLOW_CTL_Y ? "RX" : "");
@@ -1907,15 +1880,15 @@ static u32 ace_handle_event(struct net_device *dev, u32 evtcsm, u32 evtprd)
                        }
                        case E_C_LINK_DOWN:
                                printk(KERN_WARNING "%s: Optical link DOWN\n",
-                                      dev->name);
+                                      ap->name);
                                break;
                        case E_C_LINK_10_100:
                                printk(KERN_WARNING "%s: 10/100BaseT link "
-                                      "UP\n", dev->name);
+                                      "UP\n", ap->name);
                                break;
                        default:
                                printk(KERN_ERR "%s: Unknown optical link "
-                                      "state %02x\n", dev->name, code);
+                                      "state %02x\n", ap->name, code);
                        }
                        break;
                }
@@ -1923,19 +1896,19 @@ static u32 ace_handle_event(struct net_device *dev, u32 evtcsm, u32 evtprd)
                        switch(ap->evt_ring[evtcsm].code) {
                        case E_C_ERR_INVAL_CMD:
                                printk(KERN_ERR "%s: invalid command error\n",
-                                      dev->name);
+                                      ap->name);
                                break;
                        case E_C_ERR_UNIMP_CMD:
                                printk(KERN_ERR "%s: unimplemented command "
-                                      "error\n", dev->name);
+                                      "error\n", ap->name);
                                break;
                        case E_C_ERR_BAD_CFG:
                                printk(KERN_ERR "%s: bad config error\n",
-                                      dev->name);
+                                      ap->name);
                                break;
                        default:
                                printk(KERN_ERR "%s: unknown error %02x\n",
-                                      dev->name, ap->evt_ring[evtcsm].code);
+                                      ap->name, ap->evt_ring[evtcsm].code);
                        }
                        break;
                case E_RESET_JUMBO_RNG:
@@ -1964,13 +1937,13 @@ static u32 ace_handle_event(struct net_device *dev, u32 evtcsm, u32 evtprd)
                        ap->jumbo = 0;
                        ap->rx_jumbo_skbprd = 0;
                        printk(KERN_INFO "%s: Jumbo ring flushed\n",
-                              dev->name);
+                              ap->name);
                        clear_bit(0, &ap->jumbo_refill_busy);
                        break;
                }
                default:
                        printk(KERN_ERR "%s: Unhandled event 0x%02x\n",
-                              dev->name, ap->evt_ring[evtcsm].evt);
+                              ap->name, ap->evt_ring[evtcsm].evt);
                }
                evtcsm = (evtcsm + 1) % EVT_RING_ENTRIES;
        }
@@ -1981,7 +1954,7 @@ static u32 ace_handle_event(struct net_device *dev, u32 evtcsm, u32 evtprd)
 
 static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm)
 {
-       struct ace_private *ap = dev->priv;
+       struct ace_private *ap = netdev_priv(dev);
        u32 idx;
        int mini_count = 0, std_count = 0;
 
@@ -1989,7 +1962,7 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm)
 
        prefetchw(&ap->cur_rx_bufs);
        prefetchw(&ap->cur_mini_bufs);
-       
+
        while (idx != rxretprd) {
                struct ring_info *rip;
                struct sk_buff *skb;
@@ -2000,7 +1973,7 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm)
 
 
                /* make sure the rx descriptor isn't read before rxretprd */
-               if (idx == rxretcsm) 
+               if (idx == rxretcsm)
                        rmb();
 
                retdesc = &ap->rx_return_ring[idx];
@@ -2032,7 +2005,7 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm)
                        rip = &ap->skb->rx_mini_skbuff[skbidx];
                        mapsize = ACE_MINI_BUFSIZE;
                        rxdesc = &ap->rx_mini_ring[skbidx];
-                       mini_count++; 
+                       mini_count++;
                        break;
                default:
                        printk(KERN_INFO "%s: unknown frame type (0x%02x) "
@@ -2063,7 +2036,7 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm)
                 */
                if (bd_flags & BD_FLG_TCP_UDP_SUM) {
                        skb->csum = htons(csum);
-                       skb->ip_summed = CHECKSUM_HW;
+                       skb->ip_summed = CHECKSUM_COMPLETE;
                } else {
                        skb->ip_summed = CHECKSUM_NONE;
                }
@@ -2093,8 +2066,7 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm)
         * the 12.3.x Firmware - my Tigon I NICs seem to disagree!
         */
        if (ACE_IS_TIGON_I(ap)) {
-               struct ace_regs *regs = ap->regs;
-               writel(idx, &regs->RxRetCsm);
+               writel(idx, &ap->regs->RxRetCsm);
        }
        ap->cur_rx = idx;
 
@@ -2108,7 +2080,7 @@ static void ace_rx_int(struct net_device *dev, u32 rxretprd, u32 rxretcsm)
 static inline void ace_tx_int(struct net_device *dev,
                              u32 txcsm, u32 idx)
 {
-       struct ace_private *ap = dev->priv;
+       struct ace_private *ap = netdev_priv(dev);
 
        do {
                struct sk_buff *skb;
@@ -2172,18 +2144,15 @@ static inline void ace_tx_int(struct net_device *dev,
 }
 
 
-static irqreturn_t ace_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
+static irqreturn_t ace_interrupt(int irq, void *dev_id)
 {
-       struct ace_private *ap;
-       struct ace_regs *regs;
        struct net_device *dev = (struct net_device *)dev_id;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
        u32 idx;
        u32 txcsm, rxretcsm, rxretprd;
        u32 evtcsm, evtprd;
 
-       ap = dev->priv;
-       regs = ap->regs;
-
        /*
         * In case of PCI shared interrupts or spurious interrupts,
         * we want to make sure it is actually our interrupt before
@@ -2304,7 +2273,7 @@ static irqreturn_t ace_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
 #if ACENIC_DO_VLAN
 static void ace_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
 {
-       struct ace_private *ap = dev->priv;
+       struct ace_private *ap = netdev_priv(dev);
        unsigned long flags;
 
        local_irq_save(flags);
@@ -2319,7 +2288,7 @@ static void ace_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
 
 static void ace_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
 {
-       struct ace_private *ap = dev->priv;
+       struct ace_private *ap = netdev_priv(dev);
        unsigned long flags;
 
        local_irq_save(flags);
@@ -2336,13 +2305,10 @@ static void ace_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
 
 static int ace_open(struct net_device *dev)
 {
-       struct ace_private *ap;
-       struct ace_regs *regs;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
        struct cmd cmd;
 
-       ap = dev->priv;
-       regs = ap->regs;
-
        if (!(ap->fw_running)) {
                printk(KERN_WARNING "%s: Firmware not running!\n", dev->name);
                return -EBUSY;
@@ -2394,8 +2360,8 @@ static int ace_open(struct net_device *dev)
 
 static int ace_close(struct net_device *dev)
 {
-       struct ace_private *ap;
-       struct ace_regs *regs;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
        struct cmd cmd;
        unsigned long flags;
        short i;
@@ -2407,8 +2373,6 @@ static int ace_close(struct net_device *dev)
         */
        netif_stop_queue(dev);
 
-       ap = dev->priv;
-       regs = ap->regs;
 
        if (ap->promisc) {
                cmd.evt = C_SET_PROMISC_MODE;
@@ -2444,9 +2408,11 @@ static int ace_close(struct net_device *dev)
 
                if (mapping) {
                        if (ACE_IS_TIGON_I(ap)) {
-                               writel(0, &ap->tx_ring[i].addr.addrhi);
-                               writel(0, &ap->tx_ring[i].addr.addrlo);
-                               writel(0, &ap->tx_ring[i].flagsize);
+                               struct tx_desc __iomem *tx
+                                       = (struct tx_desc __iomem *) &ap->tx_ring[i];
+                               writel(0, &tx->addr.addrhi);
+                               writel(0, &tx->addr.addrlo);
+                               writel(0, &tx->flagsize);
                        } else
                                memset(ap->tx_ring + i, 0,
                                       sizeof(struct tx_desc));
@@ -2503,11 +2469,12 @@ ace_load_tx_bd(struct ace_private *ap, struct tx_desc *desc, u64 addr,
 #endif
 
        if (ACE_IS_TIGON_I(ap)) {
-               writel(addr >> 32, &desc->addr.addrhi);
-               writel(addr & 0xffffffff, &desc->addr.addrlo);
-               writel(flagsize, &desc->flagsize);
+               struct tx_desc __iomem *io = (struct tx_desc __iomem *) desc;
+               writel(addr >> 32, &io->addr.addrhi);
+               writel(addr & 0xffffffff, &io->addr.addrlo);
+               writel(flagsize, &io->flagsize);
 #if ACENIC_DO_VLAN
-               writel(vlan_tag, &desc->vlanres);
+               writel(vlan_tag, &io->vlanres);
 #endif
        } else {
                desc->addr.addrhi = addr >> 32;
@@ -2522,10 +2489,11 @@ ace_load_tx_bd(struct ace_private *ap, struct tx_desc *desc, u64 addr,
 
 static int ace_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
-       struct ace_private *ap = dev->priv;
-       struct ace_regs *regs = ap->regs;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
        struct tx_desc *desc;
        u32 idx, flagsize;
+       unsigned long maxjiff = jiffies + 3*HZ;
 
 restart:
        idx = ap->tx_prd;
@@ -2533,16 +2501,13 @@ restart:
        if (tx_ring_full(ap, ap->tx_ret_csm, idx))
                goto overflow;
 
-#if MAX_SKB_FRAGS
-       if (!skb_shinfo(skb)->nr_frags)
-#endif
-       {
+       if (!skb_shinfo(skb)->nr_frags) {
                dma_addr_t mapping;
                u32 vlan_tag = 0;
 
                mapping = ace_map_tx_skb(ap, skb, skb, idx);
                flagsize = (skb->len << 16) | (BD_FLG_END);
-               if (skb->ip_summed == CHECKSUM_HW)
+               if (skb->ip_summed == CHECKSUM_PARTIAL)
                        flagsize |= BD_FLG_TCP_UDP_SUM;
 #if ACENIC_DO_VLAN
                if (vlan_tx_tag_present(skb)) {
@@ -2558,16 +2523,14 @@ restart:
                        flagsize |= BD_FLG_COAL_NOW;
 
                ace_load_tx_bd(ap, desc, mapping, flagsize, vlan_tag);
-       }
-#if MAX_SKB_FRAGS
-       else {
+       } else {
                dma_addr_t mapping;
                u32 vlan_tag = 0;
                int i, len = 0;
 
                mapping = ace_map_tx_skb(ap, skb, NULL, idx);
                flagsize = (skb_headlen(skb) << 16);
-               if (skb->ip_summed == CHECKSUM_HW)
+               if (skb->ip_summed == CHECKSUM_PARTIAL)
                        flagsize |= BD_FLG_TCP_UDP_SUM;
 #if ACENIC_DO_VLAN
                if (vlan_tx_tag_present(skb)) {
@@ -2593,7 +2556,7 @@ restart:
                                               PCI_DMA_TODEVICE);
 
                        flagsize = (frag->size << 16);
-                       if (skb->ip_summed == CHECKSUM_HW)
+                       if (skb->ip_summed == CHECKSUM_PARTIAL)
                                flagsize |= BD_FLG_TCP_UDP_SUM;
                        idx = (idx + 1) % ACE_TX_RING_ENTRIES(ap);
 
@@ -2615,7 +2578,6 @@ restart:
                        ace_load_tx_bd(ap, desc, mapping, flagsize, vlan_tag);
                }
        }
-#endif
 
        wmb();
        ap->tx_prd = idx;
@@ -2635,7 +2597,7 @@ restart:
        }
 
        dev->trans_start = jiffies;
-       return 0;
+       return NETDEV_TX_OK;
 
 overflow:
        /*
@@ -2654,15 +2616,22 @@ overflow:
         * Alternative is to return with 1 not throttling queue. In this
         * case loop becomes longer, no more useful effects.
         */
-       barrier();
-       goto restart;
+       if (time_before(jiffies, maxjiff)) {
+               barrier();
+               cpu_relax();
+               goto restart;
+       }
+
+       /* The ring is stuck full. */
+       printk(KERN_WARNING "%s: Transmit ring stuck full\n", dev->name);
+       return NETDEV_TX_BUSY;
 }
 
 
 static int ace_change_mtu(struct net_device *dev, int new_mtu)
 {
-       struct ace_private *ap = dev->priv;
-       struct ace_regs *regs = ap->regs;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
 
        if (new_mtu > ACE_JUMBO_MTU)
                return -EINVAL;
@@ -2698,8 +2667,8 @@ static int ace_change_mtu(struct net_device *dev, int new_mtu)
 
 static int ace_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 {
-       struct ace_private *ap = dev->priv;
-       struct ace_regs *regs = ap->regs;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
        u32 link;
 
        memset(ecmd, 0, sizeof(struct ethtool_cmd));
@@ -2751,8 +2720,8 @@ static int ace_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 
 static int ace_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 {
-       struct ace_private *ap = dev->priv;
-       struct ace_regs *regs = ap->regs;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
        u32 link, speed;
 
        link = readl(&regs->GigLnkState);
@@ -2811,18 +2780,18 @@ static int ace_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
        return 0;
 }
 
-static void ace_get_drvinfo(struct net_device *dev, 
+static void ace_get_drvinfo(struct net_device *dev,
                            struct ethtool_drvinfo *info)
 {
-       struct ace_private *ap = dev->priv;
+       struct ace_private *ap = netdev_priv(dev);
 
        strlcpy(info->driver, "acenic", sizeof(info->driver));
-       snprintf(info->version, sizeof(info->version), "%i.%i.%i", 
+       snprintf(info->version, sizeof(info->version), "%i.%i.%i",
                tigonFwReleaseMajor, tigonFwReleaseMinor,
                tigonFwReleaseFix);
 
        if (ap->pdev)
-               strlcpy(info->bus_info, pci_name(ap->pdev), 
+               strlcpy(info->bus_info, pci_name(ap->pdev),
                        sizeof(info->bus_info));
 
 }
@@ -2832,8 +2801,9 @@ static void ace_get_drvinfo(struct net_device *dev,
  */
 static int ace_set_mac_addr(struct net_device *dev, void *p)
 {
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
        struct sockaddr *addr=p;
-       struct ace_regs *regs;
        u8 *da;
        struct cmd cmd;
 
@@ -2844,7 +2814,6 @@ static int ace_set_mac_addr(struct net_device *dev, void *p)
 
        da = (u8 *)dev->dev_addr;
 
-       regs = ((struct ace_private *)dev->priv)->regs;
        writel(da[0] << 8 | da[1], &regs->MacAddrHi);
        writel((da[2] << 24) | (da[3] << 16) | (da[4] << 8) | da[5],
               &regs->MacAddrLo);
@@ -2860,8 +2829,8 @@ static int ace_set_mac_addr(struct net_device *dev, void *p)
 
 static void ace_set_multicast_list(struct net_device *dev)
 {
-       struct ace_private *ap = dev->priv;
-       struct ace_regs *regs = ap->regs;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
        struct cmd cmd;
 
        if ((dev->flags & IFF_ALLMULTI) && !(ap->mcast_all)) {
@@ -2914,9 +2883,9 @@ static void ace_set_multicast_list(struct net_device *dev)
 
 static struct net_device_stats *ace_get_stats(struct net_device *dev)
 {
-       struct ace_private *ap = dev->priv;
-       struct ace_mac_stats *mac_stats =
-               (struct ace_mac_stats *)ap->regs->Stats;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_mac_stats __iomem *mac_stats =
+               (struct ace_mac_stats __iomem *)ap->regs->Stats;
 
        ap->stats.rx_missed_errors = readl(&mac_stats->drop_space);
        ap->stats.multicast = readl(&mac_stats->kept_mc);
@@ -2926,10 +2895,10 @@ static struct net_device_stats *ace_get_stats(struct net_device *dev)
 }
 
 
-static void __init ace_copy(struct ace_regs *regs, void *src,
+static void __devinit ace_copy(struct ace_regs __iomem *regs, void *src,
                            u32 dest, int size)
 {
-       unsigned long tdest;
+       void __iomem *tdest;
        u32 *wsrc;
        short tsize, i;
 
@@ -2939,7 +2908,7 @@ static void __init ace_copy(struct ace_regs *regs, void *src,
        while (size > 0) {
                tsize = min_t(u32, ((~dest & (ACE_WINDOW_SIZE - 1)) + 1),
                            min_t(u32, size, ACE_WINDOW_SIZE));
-               tdest = (unsigned long)&regs->Window +
+               tdest = (void __iomem *) &regs->Window +
                        (dest & (ACE_WINDOW_SIZE - 1));
                writel(dest & ~(ACE_WINDOW_SIZE - 1), &regs->WinBase);
                /*
@@ -2959,9 +2928,9 @@ static void __init ace_copy(struct ace_regs *regs, void *src,
 }
 
 
-static void __init ace_clear(struct ace_regs *regs, u32 dest, int size)
+static void __devinit ace_clear(struct ace_regs __iomem *regs, u32 dest, int size)
 {
-       unsigned long tdest;
+       void __iomem *tdest;
        short tsize = 0, i;
 
        if (size <= 0)
@@ -2970,7 +2939,7 @@ static void __init ace_clear(struct ace_regs *regs, u32 dest, int size)
        while (size > 0) {
                tsize = min_t(u32, ((~dest & (ACE_WINDOW_SIZE - 1)) + 1),
                                min_t(u32, size, ACE_WINDOW_SIZE));
-               tdest = (unsigned long)&regs->Window +
+               tdest = (void __iomem *) &regs->Window +
                        (dest & (ACE_WINDOW_SIZE - 1));
                writel(dest & ~(ACE_WINDOW_SIZE - 1), &regs->WinBase);
 
@@ -2992,17 +2961,14 @@ static void __init ace_clear(struct ace_regs *regs, u32 dest, int size)
  * This operation requires the NIC to be halted and is performed with
  * interrupts disabled and with the spinlock hold.
  */
-int __init ace_load_firmware(struct net_device *dev)
+int __devinit ace_load_firmware(struct net_device *dev)
 {
-       struct ace_private *ap;
-       struct ace_regs *regs;
-
-       ap = dev->priv;
-       regs = ap->regs;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
 
        if (!(readl(&regs->CpuCtrl) & CPU_HALTED)) {
                printk(KERN_ERR "%s: trying to download firmware while the "
-                      "CPU is running!\n", dev->name);
+                      "CPU is running!\n", ap->name);
                return -EFAULT;
        }
 
@@ -3046,7 +3012,7 @@ int __init ace_load_firmware(struct net_device *dev)
  * Thanks to Stevarino Webinski for helping tracking down the bugs in the
  * code i2c readout code by beta testing all my hacks.
  */
-static void __init eeprom_start(struct ace_regs *regs)
+static void __devinit eeprom_start(struct ace_regs __iomem *regs)
 {
        u32 local;
 
@@ -3075,7 +3041,7 @@ static void __init eeprom_start(struct ace_regs *regs)
 }
 
 
-static void __init eeprom_prep(struct ace_regs *regs, u8 magic)
+static void __devinit eeprom_prep(struct ace_regs __iomem *regs, u8 magic)
 {
        short i;
        u32 local;
@@ -3090,7 +3056,7 @@ static void __init eeprom_prep(struct ace_regs *regs, u8 magic)
 
        for (i = 0; i < 8; i++, magic <<= 1) {
                udelay(ACE_SHORT_DELAY);
-               if (magic & 0x80) 
+               if (magic & 0x80)
                        local |= EEPROM_DATA_OUT;
                else
                        local &= ~EEPROM_DATA_OUT;
@@ -3112,7 +3078,7 @@ static void __init eeprom_prep(struct ace_regs *regs, u8 magic)
 }
 
 
-static int __init eeprom_check_ack(struct ace_regs *regs)
+static int __devinit eeprom_check_ack(struct ace_regs __iomem *regs)
 {
        int state;
        u32 local;
@@ -3140,7 +3106,7 @@ static int __init eeprom_check_ack(struct ace_regs *regs)
 }
 
 
-static void __init eeprom_stop(struct ace_regs *regs)
+static void __devinit eeprom_stop(struct ace_regs __iomem *regs)
 {
        u32 local;
 
@@ -3175,10 +3141,11 @@ static void __init eeprom_stop(struct ace_regs *regs)
 /*
  * Read a whole byte from the EEPROM.
  */
-static int __init read_eeprom_byte(struct net_device *dev,
+static int __devinit read_eeprom_byte(struct net_device *dev,
                                   unsigned long offset)
 {
-       struct ace_regs *regs;
+       struct ace_private *ap = netdev_priv(dev);
+       struct ace_regs __iomem *regs = ap->regs;
        unsigned long flags;
        u32 local;
        int result = 0;
@@ -3187,11 +3154,9 @@ static int __init read_eeprom_byte(struct net_device *dev,
        if (!dev) {
                printk(KERN_ERR "No device!\n");
                result = -ENODEV;
-               goto eeprom_read_error;
+               goto out;
        }
 
-       regs = ((struct ace_private *)dev->priv)->regs;
-
        /*
         * Don't take interrupts on this CPU will bit banging
         * the %#%#@$ I2C device
@@ -3203,7 +3168,7 @@ static int __init read_eeprom_byte(struct net_device *dev,
        eeprom_prep(regs, EEPROM_WRITE_SELECT);
        if (eeprom_check_ack(regs)) {
                local_irq_restore(flags);
-               printk(KERN_ERR "%s: Unable to sync eeprom\n", dev->name);
+               printk(KERN_ERR "%s: Unable to sync eeprom\n", ap->name);
                result = -EIO;
                goto eeprom_read_error;
        }
@@ -3212,7 +3177,7 @@ static int __init read_eeprom_byte(struct net_device *dev,
        if (eeprom_check_ack(regs)) {
                local_irq_restore(flags);
                printk(KERN_ERR "%s: Unable to set address byte 0\n",
-                      dev->name);
+                      ap->name);
                result = -EIO;
                goto eeprom_read_error;
        }
@@ -3221,7 +3186,7 @@ static int __init read_eeprom_byte(struct net_device *dev,
        if (eeprom_check_ack(regs)) {
                local_irq_restore(flags);
                printk(KERN_ERR "%s: Unable to set address byte 1\n",
-                      dev->name);
+                      ap->name);
                result = -EIO;
                goto eeprom_read_error;
        }
@@ -3231,7 +3196,7 @@ static int __init read_eeprom_byte(struct net_device *dev,
        if (eeprom_check_ack(regs)) {
                local_irq_restore(flags);
                printk(KERN_ERR "%s: Unable to set READ_SELECT\n",
-                      dev->name);
+                      ap->name);
                result = -EIO;
                goto eeprom_read_error;
        }
@@ -3288,7 +3253,7 @@ static int __init read_eeprom_byte(struct net_device *dev,
 
  eeprom_read_error:
        printk(KERN_ERR "%s: Unable to read eeprom byte 0x%02lx\n",
-              dev->name, offset);
+              ap->name, offset);
        goto out;
 }