drivers/net: remove useless semicolons
[safe/jmp/linux-2.6] / drivers / net / dl2k.c
index 47cce9c..a2f238d 100644 (file)
@@ -59,7 +59,7 @@ static int rio_open (struct net_device *dev);
 static void rio_timer (unsigned long data);
 static void rio_tx_timeout (struct net_device *dev);
 static void alloc_list (struct net_device *dev);
-static int start_xmit (struct sk_buff *skb, struct net_device *dev);
+static netdev_tx_t start_xmit (struct sk_buff *skb, struct net_device *dev);
 static irqreturn_t rio_interrupt (int irq, void *dev_instance);
 static void rio_free_tx (struct net_device *dev, int irq);
 static void tx_error (struct net_device *dev, int tx_status);
@@ -85,6 +85,19 @@ static int mii_write (struct net_device *dev, int phy_addr, int reg_num,
 
 static const struct ethtool_ops ethtool_ops;
 
+static const struct net_device_ops netdev_ops = {
+       .ndo_open               = rio_open,
+       .ndo_start_xmit = start_xmit,
+       .ndo_stop               = rio_close,
+       .ndo_get_stats          = get_stats,
+       .ndo_validate_addr      = eth_validate_addr,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_set_multicast_list = set_multicast,
+       .ndo_do_ioctl           = rio_ioctl,
+       .ndo_tx_timeout         = rio_tx_timeout,
+       .ndo_change_mtu         = change_mtu,
+};
+
 static int __devinit
 rio_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
@@ -97,7 +110,6 @@ rio_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent)
        static int version_printed;
        void *ring_space;
        dma_addr_t ring_dma;
-       DECLARE_MAC_BUF(mac);
 
        if (!version_printed++)
                printk ("%s", version);
@@ -151,8 +163,8 @@ rio_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent)
                            strcmp (media[card_idx], "4") == 0) {
                                np->speed = 100;
                                np->full_duplex = 1;
-                       } else if (strcmp (media[card_idx], "100mbps_hd") == 0
-                                  || strcmp (media[card_idx], "3") == 0) {
+                       } else if (strcmp (media[card_idx], "100mbps_hd") == 0 ||
+                                  strcmp (media[card_idx], "3") == 0) {
                                np->speed = 100;
                                np->full_duplex = 0;
                        } else if (strcmp (media[card_idx], "10mbps_fd") == 0 ||
@@ -198,15 +210,8 @@ rio_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent)
                else if (tx_coalesce > TX_RING_SIZE-1)
                        tx_coalesce = TX_RING_SIZE - 1;
        }
-       dev->open = &rio_open;
-       dev->hard_start_xmit = &start_xmit;
-       dev->stop = &rio_close;
-       dev->get_stats = &get_stats;
-       dev->set_multicast_list = &set_multicast;
-       dev->do_ioctl = &rio_ioctl;
-       dev->tx_timeout = &rio_tx_timeout;
+       dev->netdev_ops = &netdev_ops;
        dev->watchdog_timeo = TX_TIMEOUT;
-       dev->change_mtu = &change_mtu;
        SET_ETHTOOL_OPS(dev, &ethtool_ops);
 #if 0
        dev->features = NETIF_F_IP_CSUM;
@@ -257,14 +262,15 @@ rio_probe1 (struct pci_dev *pdev, const struct pci_device_id *ent)
 
        card_idx++;
 
-       printk (KERN_INFO "%s: %s, %s, IRQ %d\n",
-               dev->name, np->name, print_mac(mac, dev->dev_addr), irq);
+       printk (KERN_INFO "%s: %s, %pM, IRQ %d\n",
+               dev->name, np->name, dev->dev_addr, irq);
        if (tx_coalesce > 1)
                printk(KERN_INFO "tx_coalesce:\t%d packets\n",
                                tx_coalesce);
        if (np->coalesce)
-               printk(KERN_INFO "rx_coalesce:\t%d packets\n"
-                      KERN_INFO "rx_timeout: \t%d ns\n",
+               printk(KERN_INFO
+                      "rx_coalesce:\t%d packets\n"
+                      "rx_timeout: \t%d ns\n",
                                np->rx_coalesce, np->rx_timeout*640);
        if (np->vlan)
                printk(KERN_INFO "vlan(id):\t%d\n", np->vlan);
@@ -405,7 +411,7 @@ rio_open (struct net_device *dev)
        int i;
        u16 macctrl;
 
-       i = request_irq (dev->irq, &rio_interrupt, IRQF_SHARED, dev->name, dev);
+       i = request_irq (dev->irq, rio_interrupt, IRQF_SHARED, dev->name, dev);
        if (i)
                return i;
 
@@ -499,7 +505,8 @@ rio_timer (unsigned long data)
                        entry = np->old_rx % RX_RING_SIZE;
                        /* Dropped packets don't need to re-allocate */
                        if (np->rx_skbuff[entry] == NULL) {
-                               skb = dev_alloc_skb (np->rx_buf_sz);
+                               skb = netdev_alloc_skb_ip_align(dev,
+                                                               np->rx_buf_sz);
                                if (skb == NULL) {
                                        np->rx_ring[entry].fraginfo = 0;
                                        printk (KERN_INFO
@@ -508,8 +515,6 @@ rio_timer (unsigned long data)
                                        break;
                                }
                                np->rx_skbuff[entry] = skb;
-                               /* 16 byte align the IP header */
-                               skb_reserve (skb, 2);
                                np->rx_ring[entry].fraginfo =
                                    cpu_to_le64 (pci_map_single
                                         (np->pdev, skb->data, np->rx_buf_sz,
@@ -534,7 +539,7 @@ rio_tx_timeout (struct net_device *dev)
                dev->name, readl (ioaddr + TxStatus));
        rio_free_tx(dev, 0);
        dev->if_port = 0;
-       dev->trans_start = jiffies;
+       dev->trans_start = jiffies; /* prevent tx timeout */
 }
 
  /* allocate and initialize Tx and Rx descriptors */
@@ -570,7 +575,9 @@ alloc_list (struct net_device *dev)
        /* Allocate the rx buffers */
        for (i = 0; i < RX_RING_SIZE; i++) {
                /* Allocated fixed size of skbuff */
-               struct sk_buff *skb = dev_alloc_skb (np->rx_buf_sz);
+               struct sk_buff *skb;
+
+               skb = netdev_alloc_skb_ip_align(dev, np->rx_buf_sz);
                np->rx_skbuff[i] = skb;
                if (skb == NULL) {
                        printk (KERN_ERR
@@ -578,7 +585,6 @@ alloc_list (struct net_device *dev)
                                dev->name);
                        break;
                }
-               skb_reserve (skb, 2);   /* 16 byte align the IP header. */
                /* Rubicon now supports 40 bits of addressing space. */
                np->rx_ring[i].fraginfo =
                    cpu_to_le64 ( pci_map_single (
@@ -590,11 +596,9 @@ alloc_list (struct net_device *dev)
        /* Set RFDListPtr */
        writel (np->rx_ring_dma, dev->base_addr + RFDListPtr0);
        writel (0, dev->base_addr + RFDListPtr1);
-
-       return;
 }
 
-static int
+static netdev_tx_t
 start_xmit (struct sk_buff *skb, struct net_device *dev)
 {
        struct netdev_private *np = netdev_priv(dev);
@@ -605,7 +609,7 @@ start_xmit (struct sk_buff *skb, struct net_device *dev)
 
        if (np->link_status == 0) {     /* Link Down */
                dev_kfree_skb(skb);
-               return 0;
+               return NETDEV_TX_OK;
        }
        ioaddr = dev->base_addr;
        entry = np->cur_tx % TX_RING_SIZE;
@@ -660,9 +664,7 @@ start_xmit (struct sk_buff *skb, struct net_device *dev)
                writel (0, dev->base_addr + TFDListPtr1);
        }
 
-       /* NETDEV WATCHDOG timer */
-       dev->trans_start = jiffies;
-       return 0;
+       return NETDEV_TX_OK;
 }
 
 static irqreturn_t
@@ -709,7 +711,7 @@ rio_interrupt (int irq, void *dev_instance)
 
 static inline dma_addr_t desc_to_dma(struct netdev_desc *desc)
 {
-       return le64_to_cpu(desc->fraginfo) & DMA_48BIT_MASK;
+       return le64_to_cpu(desc->fraginfo) & DMA_BIT_MASK(48);
 }
 
 static void
@@ -867,13 +869,11 @@ receive_packet (struct net_device *dev)
                                                  PCI_DMA_FROMDEVICE);
                                skb_put (skb = np->rx_skbuff[entry], pkt_len);
                                np->rx_skbuff[entry] = NULL;
-                       } else if ((skb = dev_alloc_skb (pkt_len + 2)) != NULL) {
+                       } else if ((skb = netdev_alloc_skb_ip_align(dev, pkt_len))) {
                                pci_dma_sync_single_for_cpu(np->pdev,
                                                            desc_to_dma(desc),
                                                            np->rx_buf_sz,
                                                            PCI_DMA_FROMDEVICE);
-                               /* 16 byte align the IP header */
-                               skb_reserve (skb, 2);
                                skb_copy_to_linear_data (skb,
                                                  np->rx_skbuff[entry]->data,
                                                  pkt_len);
@@ -892,7 +892,6 @@ receive_packet (struct net_device *dev)
                        }
 #endif
                        netif_rx (skb);
-                       dev->last_rx = jiffies;
                }
                entry = (entry + 1) % RX_RING_SIZE;
        }
@@ -904,7 +903,7 @@ receive_packet (struct net_device *dev)
                struct sk_buff *skb;
                /* Dropped packets don't need to re-allocate */
                if (np->rx_skbuff[entry] == NULL) {
-                       skb = dev_alloc_skb (np->rx_buf_sz);
+                       skb = netdev_alloc_skb_ip_align(dev, np->rx_buf_sz);
                        if (skb == NULL) {
                                np->rx_ring[entry].fraginfo = 0;
                                printk (KERN_INFO
@@ -914,8 +913,6 @@ receive_packet (struct net_device *dev)
                                break;
                        }
                        np->rx_skbuff[entry] = skb;
-                       /* 16 byte align the IP header */
-                       skb_reserve (skb, 2);
                        np->rx_ring[entry].fraginfo =
                            cpu_to_le64 (pci_map_single
                                         (np->pdev, skb->data, np->rx_buf_sz,
@@ -1129,21 +1126,18 @@ set_multicast (struct net_device *dev)
                /* Receive all frames promiscuously. */
                rx_mode = ReceiveAllFrames;
        } else if ((dev->flags & IFF_ALLMULTI) ||
-                       (dev->mc_count > multicast_filter_limit)) {
+                       (netdev_mc_count(dev) > multicast_filter_limit)) {
                /* Receive broadcast and multicast frames */
                rx_mode = ReceiveBroadcast | ReceiveMulticast | ReceiveUnicast;
-       } else if (dev->mc_count > 0) {
-               int i;
-               struct dev_mc_list *mclist;
+       } else if (!netdev_mc_empty(dev)) {
+               struct netdev_hw_addr *ha;
                /* Receive broadcast frames and multicast frames filtering
                   by Hashtable */
                rx_mode =
                    ReceiveBroadcast | ReceiveMulticastHash | ReceiveUnicast;
-               for (i=0, mclist = dev->mc_list; mclist && i < dev->mc_count;
-                               i++, mclist=mclist->next)
-               {
+               netdev_for_each_mc_addr(ha, dev) {
                        int bit, index = 0;
-                       int crc = ether_crc_le (ETH_ALEN, mclist->dmi_addr);
+                       int crc = ether_crc_le(ETH_ALEN, ha->addr);
                        /* The inverted high significant 6 bits of CRC are
                           used as an index to hashtable */
                        for (bit = 0; bit < 6; bit++)
@@ -1316,9 +1310,10 @@ rio_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
                            ("%02x:cur:%08x next:%08x status:%08x frag1:%08x frag0:%08x",
                             i,
                             (u32) (np->tx_ring_dma + i * sizeof (*desc)),
-                            (u32) desc->next_desc,
-                            (u32) desc->status, (u32) (desc->fraginfo >> 32),
-                            (u32) desc->fraginfo);
+                            (u32)le64_to_cpu(desc->next_desc),
+                            (u32)le64_to_cpu(desc->status),
+                            (u32)(le64_to_cpu(desc->fraginfo) >> 32),
+                            (u32)le64_to_cpu(desc->fraginfo));
                        printk ("\n");
                }
                printk ("\n");
@@ -1435,7 +1430,7 @@ mii_write (struct net_device *dev, int phy_addr, int reg_num, u16 data)
 static int
 mii_wait_link (struct net_device *dev, int wait)
 {
-       BMSR_t bmsr;
+       __u16 bmsr;
        int phy_addr;
        struct netdev_private *np;
 
@@ -1443,8 +1438,8 @@ mii_wait_link (struct net_device *dev, int wait)
        phy_addr = np->phy_addr;
 
        do {
-               bmsr.image = mii_read (dev, phy_addr, MII_BMSR);
-               if (bmsr.bits.link_status)
+               bmsr = mii_read (dev, phy_addr, MII_BMSR);
+               if (bmsr & MII_BMSR_LINK_STATUS)
                        return 0;
                mdelay (1);
        } while (--wait > 0);
@@ -1453,73 +1448,75 @@ mii_wait_link (struct net_device *dev, int wait)
 static int
 mii_get_media (struct net_device *dev)
 {
-       ANAR_t negotiate;
-       BMSR_t bmsr;
-       BMCR_t bmcr;
-       MSCR_t mscr;
-       MSSR_t mssr;
+       __u16 negotiate;
+       __u16 bmsr;
+       __u16 mscr;
+       __u16 mssr;
        int phy_addr;
        struct netdev_private *np;
 
        np = netdev_priv(dev);
        phy_addr = np->phy_addr;
 
-       bmsr.image = mii_read (dev, phy_addr, MII_BMSR);
+       bmsr = mii_read (dev, phy_addr, MII_BMSR);
        if (np->an_enable) {
-               if (!bmsr.bits.an_complete) {
+               if (!(bmsr & MII_BMSR_AN_COMPLETE)) {
                        /* Auto-Negotiation not completed */
                        return -1;
                }
-               negotiate.image = mii_read (dev, phy_addr, MII_ANAR) &
+               negotiate = mii_read (dev, phy_addr, MII_ANAR) &
                        mii_read (dev, phy_addr, MII_ANLPAR);
-               mscr.image = mii_read (dev, phy_addr, MII_MSCR);
-               mssr.image = mii_read (dev, phy_addr, MII_MSSR);
-               if (mscr.bits.media_1000BT_FD & mssr.bits.lp_1000BT_FD) {
+               mscr = mii_read (dev, phy_addr, MII_MSCR);
+               mssr = mii_read (dev, phy_addr, MII_MSSR);
+               if (mscr & MII_MSCR_1000BT_FD && mssr & MII_MSSR_LP_1000BT_FD) {
                        np->speed = 1000;
                        np->full_duplex = 1;
                        printk (KERN_INFO "Auto 1000 Mbps, Full duplex\n");
-               } else if (mscr.bits.media_1000BT_HD & mssr.bits.lp_1000BT_HD) {
+               } else if (mscr & MII_MSCR_1000BT_HD && mssr & MII_MSSR_LP_1000BT_HD) {
                        np->speed = 1000;
                        np->full_duplex = 0;
                        printk (KERN_INFO "Auto 1000 Mbps, Half duplex\n");
-               } else if (negotiate.bits.media_100BX_FD) {
+               } else if (negotiate & MII_ANAR_100BX_FD) {
                        np->speed = 100;
                        np->full_duplex = 1;
                        printk (KERN_INFO "Auto 100 Mbps, Full duplex\n");
-               } else if (negotiate.bits.media_100BX_HD) {
+               } else if (negotiate & MII_ANAR_100BX_HD) {
                        np->speed = 100;
                        np->full_duplex = 0;
                        printk (KERN_INFO "Auto 100 Mbps, Half duplex\n");
-               } else if (negotiate.bits.media_10BT_FD) {
+               } else if (negotiate & MII_ANAR_10BT_FD) {
                        np->speed = 10;
                        np->full_duplex = 1;
                        printk (KERN_INFO "Auto 10 Mbps, Full duplex\n");
-               } else if (negotiate.bits.media_10BT_HD) {
+               } else if (negotiate & MII_ANAR_10BT_HD) {
                        np->speed = 10;
                        np->full_duplex = 0;
                        printk (KERN_INFO "Auto 10 Mbps, Half duplex\n");
                }
-               if (negotiate.bits.pause) {
+               if (negotiate & MII_ANAR_PAUSE) {
                        np->tx_flow &= 1;
                        np->rx_flow &= 1;
-               } else if (negotiate.bits.asymmetric) {
+               } else if (negotiate & MII_ANAR_ASYMMETRIC) {
                        np->tx_flow = 0;
                        np->rx_flow &= 1;
                }
                /* else tx_flow, rx_flow = user select  */
        } else {
-               bmcr.image = mii_read (dev, phy_addr, MII_BMCR);
-               if (bmcr.bits.speed100 == 1 && bmcr.bits.speed1000 == 0) {
+               __u16 bmcr = mii_read (dev, phy_addr, MII_BMCR);
+               switch (bmcr & (MII_BMCR_SPEED_100 | MII_BMCR_SPEED_1000)) {
+               case MII_BMCR_SPEED_1000:
+                       printk (KERN_INFO "Operating at 1000 Mbps, ");
+                       break;
+               case MII_BMCR_SPEED_100:
                        printk (KERN_INFO "Operating at 100 Mbps, ");
-               } else if (bmcr.bits.speed100 == 0 && bmcr.bits.speed1000 == 0) {
+                       break;
+               case 0:
                        printk (KERN_INFO "Operating at 10 Mbps, ");
-               } else if (bmcr.bits.speed100 == 0 && bmcr.bits.speed1000 == 1) {
-                       printk (KERN_INFO "Operating at 1000 Mbps, ");
                }
-               if (bmcr.bits.duplex_mode) {
-                       printk ("Full duplex\n");
+               if (bmcr & MII_BMCR_DUPLEX_MODE) {
+                       printk (KERN_CONT "Full duplex\n");
                } else {
-                       printk ("Half duplex\n");
+                       printk (KERN_CONT "Half duplex\n");
                }
        }
        if (np->tx_flow)
@@ -1537,10 +1534,10 @@ mii_get_media (struct net_device *dev)
 static int
 mii_set_media (struct net_device *dev)
 {
-       PHY_SCR_t pscr;
-       BMCR_t bmcr;
-       BMSR_t bmsr;
-       ANAR_t anar;
+       __u16 pscr;
+       __u16 bmcr;
+       __u16 bmsr;
+       __u16 anar;
        int phy_addr;
        struct netdev_private *np;
        np = netdev_priv(dev);
@@ -1549,76 +1546,77 @@ mii_set_media (struct net_device *dev)
        /* Does user set speed? */
        if (np->an_enable) {
                /* Advertise capabilities */
-               bmsr.image = mii_read (dev, phy_addr, MII_BMSR);
-               anar.image = mii_read (dev, phy_addr, MII_ANAR);
-               anar.bits.media_100BX_FD = bmsr.bits.media_100BX_FD;
-               anar.bits.media_100BX_HD = bmsr.bits.media_100BX_HD;
-               anar.bits.media_100BT4 = bmsr.bits.media_100BT4;
-               anar.bits.media_10BT_FD = bmsr.bits.media_10BT_FD;
-               anar.bits.media_10BT_HD = bmsr.bits.media_10BT_HD;
-               anar.bits.pause = 1;
-               anar.bits.asymmetric = 1;
-               mii_write (dev, phy_addr, MII_ANAR, anar.image);
+               bmsr = mii_read (dev, phy_addr, MII_BMSR);
+               anar = mii_read (dev, phy_addr, MII_ANAR) &
+                            ~MII_ANAR_100BX_FD &
+                            ~MII_ANAR_100BX_HD &
+                            ~MII_ANAR_100BT4 &
+                            ~MII_ANAR_10BT_FD &
+                            ~MII_ANAR_10BT_HD;
+               if (bmsr & MII_BMSR_100BX_FD)
+                       anar |= MII_ANAR_100BX_FD;
+               if (bmsr & MII_BMSR_100BX_HD)
+                       anar |= MII_ANAR_100BX_HD;
+               if (bmsr & MII_BMSR_100BT4)
+                       anar |= MII_ANAR_100BT4;
+               if (bmsr & MII_BMSR_10BT_FD)
+                       anar |= MII_ANAR_10BT_FD;
+               if (bmsr & MII_BMSR_10BT_HD)
+                       anar |= MII_ANAR_10BT_HD;
+               anar |= MII_ANAR_PAUSE | MII_ANAR_ASYMMETRIC;
+               mii_write (dev, phy_addr, MII_ANAR, anar);
 
                /* Enable Auto crossover */
-               pscr.image = mii_read (dev, phy_addr, MII_PHY_SCR);
-               pscr.bits.mdi_crossover_mode = 3;       /* 11'b */
-               mii_write (dev, phy_addr, MII_PHY_SCR, pscr.image);
+               pscr = mii_read (dev, phy_addr, MII_PHY_SCR);
+               pscr |= 3 << 5; /* 11'b */
+               mii_write (dev, phy_addr, MII_PHY_SCR, pscr);
 
                /* Soft reset PHY */
                mii_write (dev, phy_addr, MII_BMCR, MII_BMCR_RESET);
-               bmcr.image = 0;
-               bmcr.bits.an_enable = 1;
-               bmcr.bits.restart_an = 1;
-               bmcr.bits.reset = 1;
-               mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
+               bmcr = MII_BMCR_AN_ENABLE | MII_BMCR_RESTART_AN | MII_BMCR_RESET;
+               mii_write (dev, phy_addr, MII_BMCR, bmcr);
                mdelay(1);
        } else {
                /* Force speed setting */
                /* 1) Disable Auto crossover */
-               pscr.image = mii_read (dev, phy_addr, MII_PHY_SCR);
-               pscr.bits.mdi_crossover_mode = 0;
-               mii_write (dev, phy_addr, MII_PHY_SCR, pscr.image);
+               pscr = mii_read (dev, phy_addr, MII_PHY_SCR);
+               pscr &= ~(3 << 5);
+               mii_write (dev, phy_addr, MII_PHY_SCR, pscr);
 
                /* 2) PHY Reset */
-               bmcr.image = mii_read (dev, phy_addr, MII_BMCR);
-               bmcr.bits.reset = 1;
-               mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
+               bmcr = mii_read (dev, phy_addr, MII_BMCR);
+               bmcr |= MII_BMCR_RESET;
+               mii_write (dev, phy_addr, MII_BMCR, bmcr);
 
                /* 3) Power Down */
-               bmcr.image = 0x1940;    /* must be 0x1940 */
-               mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
+               bmcr = 0x1940;  /* must be 0x1940 */
+               mii_write (dev, phy_addr, MII_BMCR, bmcr);
                mdelay (100);   /* wait a certain time */
 
                /* 4) Advertise nothing */
                mii_write (dev, phy_addr, MII_ANAR, 0);
 
                /* 5) Set media and Power Up */
-               bmcr.image = 0;
-               bmcr.bits.power_down = 1;
+               bmcr = MII_BMCR_POWER_DOWN;
                if (np->speed == 100) {
-                       bmcr.bits.speed100 = 1;
-                       bmcr.bits.speed1000 = 0;
+                       bmcr |= MII_BMCR_SPEED_100;
                        printk (KERN_INFO "Manual 100 Mbps, ");
                } else if (np->speed == 10) {
-                       bmcr.bits.speed100 = 0;
-                       bmcr.bits.speed1000 = 0;
                        printk (KERN_INFO "Manual 10 Mbps, ");
                }
                if (np->full_duplex) {
-                       bmcr.bits.duplex_mode = 1;
-                       printk ("Full duplex\n");
+                       bmcr |= MII_BMCR_DUPLEX_MODE;
+                       printk (KERN_CONT "Full duplex\n");
                } else {
-                       bmcr.bits.duplex_mode = 0;
-                       printk ("Half duplex\n");
+                       printk (KERN_CONT "Half duplex\n");
                }
 #if 0
                /* Set 1000BaseT Master/Slave setting */
-               mscr.image = mii_read (dev, phy_addr, MII_MSCR);
-               mscr.bits.cfg_enable = 1;
-               mscr.bits.cfg_value = 0;
+               mscr = mii_read (dev, phy_addr, MII_MSCR);
+               mscr |= MII_MSCR_CFG_ENABLE;
+               mscr &= ~MII_MSCR_CFG_VALUE = 0;
 #endif
-               mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
+               mii_write (dev, phy_addr, MII_BMCR, bmcr);
                mdelay(10);
        }
        return 0;
@@ -1627,46 +1625,45 @@ mii_set_media (struct net_device *dev)
 static int
 mii_get_media_pcs (struct net_device *dev)
 {
-       ANAR_PCS_t negotiate;
-       BMSR_t bmsr;
-       BMCR_t bmcr;
+       __u16 negotiate;
+       __u16 bmsr;
        int phy_addr;
        struct netdev_private *np;
 
        np = netdev_priv(dev);
        phy_addr = np->phy_addr;
 
-       bmsr.image = mii_read (dev, phy_addr, PCS_BMSR);
+       bmsr = mii_read (dev, phy_addr, PCS_BMSR);
        if (np->an_enable) {
-               if (!bmsr.bits.an_complete) {
+               if (!(bmsr & MII_BMSR_AN_COMPLETE)) {
                        /* Auto-Negotiation not completed */
                        return -1;
                }
-               negotiate.image = mii_read (dev, phy_addr, PCS_ANAR) &
+               negotiate = mii_read (dev, phy_addr, PCS_ANAR) &
                        mii_read (dev, phy_addr, PCS_ANLPAR);
                np->speed = 1000;
-               if (negotiate.bits.full_duplex) {
+               if (negotiate & PCS_ANAR_FULL_DUPLEX) {
                        printk (KERN_INFO "Auto 1000 Mbps, Full duplex\n");
                        np->full_duplex = 1;
                } else {
                        printk (KERN_INFO "Auto 1000 Mbps, half duplex\n");
                        np->full_duplex = 0;
                }
-               if (negotiate.bits.pause) {
+               if (negotiate & PCS_ANAR_PAUSE) {
                        np->tx_flow &= 1;
                        np->rx_flow &= 1;
-               } else if (negotiate.bits.asymmetric) {
+               } else if (negotiate & PCS_ANAR_ASYMMETRIC) {
                        np->tx_flow = 0;
                        np->rx_flow &= 1;
                }
                /* else tx_flow, rx_flow = user select  */
        } else {
-               bmcr.image = mii_read (dev, phy_addr, PCS_BMCR);
+               __u16 bmcr = mii_read (dev, phy_addr, PCS_BMCR);
                printk (KERN_INFO "Operating at 1000 Mbps, ");
-               if (bmcr.bits.duplex_mode) {
-                       printk ("Full duplex\n");
+               if (bmcr & MII_BMCR_DUPLEX_MODE) {
+                       printk (KERN_CONT "Full duplex\n");
                } else {
-                       printk ("Half duplex\n");
+                       printk (KERN_CONT "Half duplex\n");
                }
        }
        if (np->tx_flow)
@@ -1684,9 +1681,9 @@ mii_get_media_pcs (struct net_device *dev)
 static int
 mii_set_media_pcs (struct net_device *dev)
 {
-       BMCR_t bmcr;
-       ESR_t esr;
-       ANAR_PCS_t anar;
+       __u16 bmcr;
+       __u16 esr;
+       __u16 anar;
        int phy_addr;
        struct netdev_private *np;
        np = netdev_priv(dev);
@@ -1695,41 +1692,37 @@ mii_set_media_pcs (struct net_device *dev)
        /* Auto-Negotiation? */
        if (np->an_enable) {
                /* Advertise capabilities */
-               esr.image = mii_read (dev, phy_addr, PCS_ESR);
-               anar.image = mii_read (dev, phy_addr, MII_ANAR);
-               anar.bits.half_duplex =
-                       esr.bits.media_1000BT_HD | esr.bits.media_1000BX_HD;
-               anar.bits.full_duplex =
-                       esr.bits.media_1000BT_FD | esr.bits.media_1000BX_FD;
-               anar.bits.pause = 1;
-               anar.bits.asymmetric = 1;
-               mii_write (dev, phy_addr, MII_ANAR, anar.image);
+               esr = mii_read (dev, phy_addr, PCS_ESR);
+               anar = mii_read (dev, phy_addr, MII_ANAR) &
+                       ~PCS_ANAR_HALF_DUPLEX &
+                       ~PCS_ANAR_FULL_DUPLEX;
+               if (esr & (MII_ESR_1000BT_HD | MII_ESR_1000BX_HD))
+                       anar |= PCS_ANAR_HALF_DUPLEX;
+               if (esr & (MII_ESR_1000BT_FD | MII_ESR_1000BX_FD))
+                       anar |= PCS_ANAR_FULL_DUPLEX;
+               anar |= PCS_ANAR_PAUSE | PCS_ANAR_ASYMMETRIC;
+               mii_write (dev, phy_addr, MII_ANAR, anar);
 
                /* Soft reset PHY */
                mii_write (dev, phy_addr, MII_BMCR, MII_BMCR_RESET);
-               bmcr.image = 0;
-               bmcr.bits.an_enable = 1;
-               bmcr.bits.restart_an = 1;
-               bmcr.bits.reset = 1;
-               mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
+               bmcr = MII_BMCR_AN_ENABLE | MII_BMCR_RESTART_AN |
+                      MII_BMCR_RESET;
+               mii_write (dev, phy_addr, MII_BMCR, bmcr);
                mdelay(1);
        } else {
                /* Force speed setting */
                /* PHY Reset */
-               bmcr.image = 0;
-               bmcr.bits.reset = 1;
-               mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
+               bmcr = MII_BMCR_RESET;
+               mii_write (dev, phy_addr, MII_BMCR, bmcr);
                mdelay(10);
-               bmcr.image = 0;
-               bmcr.bits.an_enable = 0;
                if (np->full_duplex) {
-                       bmcr.bits.duplex_mode = 1;
+                       bmcr = MII_BMCR_DUPLEX_MODE;
                        printk (KERN_INFO "Manual full duplex\n");
                } else {
-                       bmcr.bits.duplex_mode = 0;
+                       bmcr = 0;
                        printk (KERN_INFO "Manual half duplex\n");
                }
-               mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
+               mii_write (dev, phy_addr, MII_BMCR, bmcr);
                mdelay(10);
 
                /*  Advertise nothing */
@@ -1754,7 +1747,7 @@ rio_close (struct net_device *dev)
 
        /* Stop Tx and Rx logics */
        writel (TxDisable | RxDisable | StatsDisable, ioaddr + MACCtrl);
-       synchronize_irq (dev->irq);
+
        free_irq (dev->irq, dev);
        del_timer_sync (&np->timer);