-+ */
-+
-+ if (mac->txq_pkt <2)
-+ mac->txq_pkt += init_buffer(tx_doneq, 5);
-+
-+ if (npe_status(npe) & IX_NPEDL_EXCTL_STATUS_RUN) {
-+ mac_reset_regbit(mac, MAC_CORE_CNTRL, CORE_MDC_EN);
-+ mac_set_regbit(mac, MAC_RX_CNTRL1, RX_CNTRL1_LOOP_EN);
-+
-+ npe_mh_npe_loopback_mode(npe, mac->plat, 1);
-+ mdelay(200);
-+
-+ while (mac->rxq_pkt && loop++ < 2000 ) {
-+ phys = queue_get_entry(tx_doneq) & ~0xf;
-+ if (!phys)
-+ break;
-+ cont = dma_to_virt(queue->dev, phys);
-+ /* actually the packets should never leave the system,
-+ * but if they do, they shall contain 0s instead of
-+ * intresting random data....
-+ */
-+ memset(cont->data, 0, 64);
-+ cont->eth.pkt_len = 64;
-+ dma_sync_single(mac->txq->dev, phys, 64 + DMA_HDR_SIZE,
-+ DMA_TO_DEVICE);
-+ queue_put_entry(mac->txq, phys);
-+ if (queue_stat(mac->txq) == 2) { /* overflow */
-+ queue_put_entry(tx_doneq, phys);
-+ break;
-+ }
-+ mdelay(1);
-+ mac->rxq_pkt -= destroy_buffer(mac->rxdoneq,
-+ mac->rxq_pkt);
-+ }
-+ npe_mh_npe_loopback_mode(npe, mac->plat, 0);
-+ }
-+ /* Flush MAC TX fifo to drain the bogus packages */
-+ mac_set_regbit(mac, MAC_CORE_CNTRL, CORE_TX_FIFO_FLUSH);
-+ mac_reset_regbit(mac, MAC_RX_CNTRL1, RX_CNTRL1_RX_EN);
-+ mac_reset_regbit(mac, MAC_TX_CNTRL1, TX_CNTRL1_TX_EN);
-+ mac_reset_regbit(mac, MAC_RX_CNTRL1, RX_CNTRL1_LOOP_EN);
-+ mac_reset_regbit(mac, MAC_CORE_CNTRL, CORE_TX_FIFO_FLUSH);
-+ mac_reset_regbit(mac, MAC_CORE_CNTRL, CORE_TX_FIFO_FLUSH);
-+}
-+
-+static int mac_remove(struct platform_device *pdev)
-+{
-+ struct net_device* dev = platform_get_drvdata(pdev);
-+ struct mac_info *mac = netdev_priv(dev);
-+
-+ unregister_netdev(dev);
-+
-+ mac->rxq_pkt -= destroy_buffer(mac->rxq, mac->rxq_pkt);
-+ if (mac->rxq_pkt)
-+ drain_npe(mac);
-+
-+ mac->txq_pkt -= destroy_buffer(mac->txq, mac->txq_pkt);
-+ mac->txq_pkt -= destroy_buffer(tx_doneq, mac->txq_pkt);
-+
-+ if (mac->rxq_pkt || mac->txq_pkt)
-+ printk("Buffers lost in NPE: RX:%d, TX:%d\n",
-+ mac->rxq_pkt, mac->txq_pkt);
-+
-+ release_queue(mac->txq);
-+ release_queue(mac->rxq);
-+ release_queue(mac->rxdoneq);
-+
-+ flush_scheduled_work();
-+ return_npe_dev(mac->npe_dev);
-+
-+ iounmap(mac->addr);
-+ release_resource(mac->res);
-+ platform_set_drvdata(pdev, NULL);
-+ free_netdev(dev);
-+ return 0;
-+}
-+
-+static struct platform_driver ixp4xx_mac = {
-+ .driver.name = IXMAC_NAME,
-+ .probe = mac_probe,
-+ .remove = mac_remove,
-+};
-+
-+static int __init init_mac(void)
-+{
-+ /* The TX done Queue handles skbs sent out by the NPE */
-+ tx_doneq = request_queue(TX_DONE_QID, 128);
-+ if (IS_ERR(tx_doneq)) {
-+ printk(KERN_ERR "Error requesting Q: %d\n", TX_DONE_QID);
-+ return -EBUSY;
-+ }
-+ return platform_driver_register(&ixp4xx_mac);
-+}
-+
-+static void __exit finish_mac(void)
-+{
-+ platform_driver_unregister(&ixp4xx_mac);
-+ if (tx_doneq) {
-+ release_queue(tx_doneq);
-+ }
-+}
-+
-+module_init(init_mac);
-+module_exit(finish_mac);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Christian Hohnstaedt <chohnstaedt@innominate.com>");
-+
-diff -Naur linux-2.6.19.orig/drivers/net/ixp4xx/mac.h linux-2.6.19/drivers/net/ixp4xx/mac.h
---- linux-2.6.19.orig/drivers/net/ixp4xx/mac.h 1969-12-31 17:00:00.000000000 -0700
-+++ linux-2.6.19/drivers/net/ixp4xx/mac.h 2007-01-12 21:54:40.000000000 -0700
-@@ -0,0 +1,275 @@
-+/*
-+ * Copyright (C) 2002-2006 Christian Hohnstaedt <chohnstaedt@innominate.com>
-+ *
-+ * This file is released under the GPLv2
-+ */
-+
-+#include <linux/resource.h>
-+#include <linux/netdevice.h>
-+#include <linux/io.h>
-+#include <linux/mii.h>
-+#include <linux/workqueue.h>
-+#include <asm/hardware.h>
-+#include <linux/ixp_qmgr.h>
-+
-+/* 32 bit offsets to be added to u32 *pointers */
-+#define MAC_TX_CNTRL1 0x00 // 0x000
-+#define MAC_TX_CNTRL2 0x01 // 0x004
-+#define MAC_RX_CNTRL1 0x04 // 0x010
-+#define MAC_RX_CNTRL2 0x05 // 0x014
-+#define MAC_RANDOM_SEED 0x08 // 0x020
-+#define MAC_THRESH_P_EMPTY 0x0c // 0x030
-+#define MAC_THRESH_P_FULL 0x0e // 0x038
-+#define MAC_BUF_SIZE_TX 0x10 // 0x040
-+#define MAC_TX_DEFER 0x14 // 0x050
-+#define MAC_RX_DEFER 0x15 // 0x054
-+#define MAC_TX_TWO_DEFER_1 0x18 // 0x060
-+#define MAC_TX_TWO_DEFER_2 0x19 // 0x064
-+#define MAC_SLOT_TIME 0x1c // 0x070
-+#define MAC_MDIO_CMD 0x20 // 0x080 4 registers 0x20 - 0x23
-+#define MAC_MDIO_STS 0x24 // 0x090 4 registers 0x24 - 0x27
-+#define MAC_ADDR_MASK 0x28 // 0x0A0 6 registers 0x28 - 0x2d
-+#define MAC_ADDR 0x30 // 0x0C0 6 registers 0x30 - 0x35
-+#define MAC_INT_CLK_THRESH 0x38 // 0x0E0 1 register
-+#define MAC_UNI_ADDR 0x3c // 0x0F0 6 registers 0x3c - 0x41
-+#define MAC_CORE_CNTRL 0x7f // 0x1fC
-+
-+/* TX Control Register 1*/
-+
-+#define TX_CNTRL1_TX_EN BIT(0)
-+#define TX_CNTRL1_DUPLEX BIT(1)
-+#define TX_CNTRL1_RETRY BIT(2)
-+#define TX_CNTRL1_PAD_EN BIT(3)
-+#define TX_CNTRL1_FCS_EN BIT(4)
-+#define TX_CNTRL1_2DEFER BIT(5)
-+#define TX_CNTRL1_RMII BIT(6)
-+
-+/* TX Control Register 2 */
-+#define TX_CNTRL2_RETRIES_MASK 0xf
-+
-+/* RX Control Register 1 */
-+#define RX_CNTRL1_RX_EN BIT(0)
-+#define RX_CNTRL1_PADSTRIP_EN BIT(1)
-+#define RX_CNTRL1_CRC_EN BIT(2)
-+#define RX_CNTRL1_PAUSE_EN BIT(3)
-+#define RX_CNTRL1_LOOP_EN BIT(4)
-+#define RX_CNTRL1_ADDR_FLTR_EN BIT(5)
-+#define RX_CNTRL1_RX_RUNT_EN BIT(6)
-+#define RX_CNTRL1_BCAST_DIS BIT(7)
-+
-+/* RX Control Register 2 */
-+#define RX_CNTRL2_DEFER_EN BIT(0)
-+
-+/* Core Control Register */
-+#define CORE_RESET BIT(0)
-+#define CORE_RX_FIFO_FLUSH BIT(1)
-+#define CORE_TX_FIFO_FLUSH BIT(2)
-+#define CORE_SEND_JAM BIT(3)
-+#define CORE_MDC_EN BIT(4)
-+
-+/* Definitions for MII access routines*/
-+
-+#define MII_REG_SHL 16
-+#define MII_ADDR_SHL 21
-+
-+#define MII_GO BIT(31)
-+#define MII_WRITE BIT(26)
-+#define MII_READ_FAIL BIT(31)
-+
-+#define MII_TIMEOUT_10TH_SECS 5
-+#define MII_10TH_SEC_IN_MILLIS 100
-+
-+/*
-+ *
-+ * Default values
-+ *
-+ */
-+
-+#define MAC_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK)
-+
-+#define MAC_TX_CNTRL1_DEFAULT (\
-+ TX_CNTRL1_TX_EN | \
-+ TX_CNTRL1_RETRY | \
-+ TX_CNTRL1_FCS_EN | \
-+ TX_CNTRL1_2DEFER | \
-+ TX_CNTRL1_PAD_EN )
-+
-+#define MAC_TX_MAX_RETRIES_DEFAULT 0x0f
-+
-+#define MAC_RX_CNTRL1_DEFAULT ( \
-+ RX_CNTRL1_PADSTRIP_EN | \
-+ RX_CNTRL1_CRC_EN | \
-+ RX_CNTRL1_RX_EN )