be2net: fix to limit max vlans supported in certain skews
[safe/jmp/linux-2.6] / drivers / net / atp.c
index cec2e36..a841feb 100644 (file)
@@ -199,13 +199,13 @@ static int net_open(struct net_device *dev);
 static void hardware_init(struct net_device *dev);
 static void write_packet(long ioaddr, int length, unsigned char *packet, int pad, int mode);
 static void trigger_send(long ioaddr, int length);
-static int     atp_send_packet(struct sk_buff *skb, struct net_device *dev);
+static netdev_tx_t atp_send_packet(struct sk_buff *skb,
+                                  struct net_device *dev);
 static irqreturn_t atp_interrupt(int irq, void *dev_id);
 static void net_rx(struct net_device *dev);
 static void read_block(long ioaddr, int length, unsigned char *buffer, int data_mode);
 static int net_close(struct net_device *dev);
-static void set_rx_mode_8002(struct net_device *dev);
-static void set_rx_mode_8012(struct net_device *dev);
+static void set_rx_mode(struct net_device *dev);
 static void tx_timeout(struct net_device *dev);
 
 
@@ -242,6 +242,17 @@ static int __init atp_init(void)
        return -ENODEV;
 }
 
+static const struct net_device_ops atp_netdev_ops = {
+       .ndo_open               = net_open,
+       .ndo_stop               = net_close,
+       .ndo_start_xmit         = atp_send_packet,
+       .ndo_set_multicast_list = set_rx_mode,
+       .ndo_tx_timeout         = tx_timeout,
+       .ndo_change_mtu         = eth_change_mtu,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+};
+
 static int __init atp_probe1(long ioaddr)
 {
        struct net_device *dev = NULL;
@@ -322,10 +333,9 @@ static int __init atp_probe1(long ioaddr)
                printk(KERN_INFO "%s", version);
 #endif
 
-       printk(KERN_NOTICE "%s: Pocket adapter found at %#3lx, IRQ %d, SAPROM "
-                  "%02X:%02X:%02X:%02X:%02X:%02X.\n", dev->name, dev->base_addr,
-                  dev->irq, dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-                  dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+       printk(KERN_NOTICE "%s: Pocket adapter found at %#3lx, IRQ %d, "
+              "SAPROM %pM.\n",
+              dev->name, dev->base_addr, dev->irq, dev->dev_addr);
 
        /* Reset the ethernet hardware and activate the printer pass-through. */
        write_reg_high(ioaddr, CMR1, CMR1h_RESET | CMR1h_MUX);
@@ -343,12 +353,7 @@ static int __init atp_probe1(long ioaddr)
        if (dev->mem_end & 0xf)
                net_debug = dev->mem_end & 7;
 
-       dev->open               = net_open;
-       dev->stop               = net_close;
-       dev->hard_start_xmit    = atp_send_packet;
-       dev->set_multicast_list =
-         lp->chip_type == RTL8002 ? &set_rx_mode_8002 : &set_rx_mode_8012;
-       dev->tx_timeout         = tx_timeout;
+       dev->netdev_ops         = &atp_netdev_ops;
        dev->watchdog_timeo     = TX_TIMEOUT;
 
        res = register_netdev(dev);
@@ -378,8 +383,8 @@ static void __init get_node_ID(struct net_device *dev)
                sa_offset = 15;
 
        for (i = 0; i < 3; i++)
-               ((u16 *)dev->dev_addr)[i] =
-                       be16_to_cpu(eeprom_op(ioaddr, EE_READ(sa_offset + i)));
+               ((__be16 *)dev->dev_addr)[i] =
+                       cpu_to_be16(eeprom_op(ioaddr, EE_READ(sa_offset + i)));
 
        write_reg(ioaddr, CMR2, CMR2_NULL);
 }
@@ -421,7 +426,7 @@ static unsigned short __init eeprom_op(long ioaddr, u32 cmd)
    registers that "should" only need to be set once at boot, so that
    there is non-reboot way to recover if something goes wrong.
 
-   This is an attachable device: if there is no dev->priv entry then it wasn't
+   This is an attachable device: if there is no private entry then it wasn't
    probed for at boot-time, and we need to probe for it again.
    */
 static int net_open(struct net_device *dev)
@@ -432,7 +437,7 @@ static int net_open(struct net_device *dev)
        /* The interrupt line is turned off (tri-stated) when the device isn't in
           use.  That's especially important for "attached" interfaces where the
           port or interrupt may be shared. */
-       ret = request_irq(dev->irq, &atp_interrupt, 0, dev->name, dev);
+       ret = request_irq(dev->irq, atp_interrupt, 0, dev->name, dev);
        if (ret)
                return ret;
 
@@ -548,7 +553,8 @@ static void tx_timeout(struct net_device *dev)
        dev->stats.tx_errors++;
 }
 
-static int atp_send_packet(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t atp_send_packet(struct sk_buff *skb,
+                                  struct net_device *dev)
 {
        struct net_local *lp = netdev_priv(dev);
        long ioaddr = dev->base_addr;
@@ -583,7 +589,7 @@ static int atp_send_packet(struct sk_buff *skb, struct net_device *dev)
 
        dev->trans_start = jiffies;
        dev_kfree_skb (skb);
-       return 0;
+       return NETDEV_TX_OK;
 }
 
 
@@ -667,8 +673,8 @@ static irqreturn_t atp_interrupt(int irq, void *dev_instance)
                                netif_wake_queue(dev);  /* Inform upper layers. */
                        }
                        num_tx_since_rx++;
-               } else if (num_tx_since_rx > 8
-                                  && time_after(jiffies, dev->last_rx + HZ)) {
+               } else if (num_tx_since_rx > 8 &&
+                          time_after(jiffies, dev->last_rx + HZ)) {
                        if (net_debug > 2)
                                printk(KERN_DEBUG "%s: Missed packet? No Rx after %d Tx and "
                                           "%ld jiffies status %02x  CMR1 %02x.\n", dev->name,
@@ -803,21 +809,22 @@ static void net_rx(struct net_device *dev)
 
 static void read_block(long ioaddr, int length, unsigned char *p, int data_mode)
 {
-
        if (data_mode <= 3) { /* Mode 0 or 1 */
                outb(Ctrl_LNibRead, ioaddr + PAR_CONTROL);
                outb(length == 8  ?  RdAddr | HNib | MAR  :  RdAddr | MAR,
                         ioaddr + PAR_DATA);
                if (data_mode <= 1) { /* Mode 0 or 1 */
-                       do  *p++ = read_byte_mode0(ioaddr);  while (--length > 0);
-               } else  /* Mode 2 or 3 */
-                       do  *p++ = read_byte_mode2(ioaddr);  while (--length > 0);
-       } else if (data_mode <= 5)
-               do      *p++ = read_byte_mode4(ioaddr);  while (--length > 0);
-       else
-               do      *p++ = read_byte_mode6(ioaddr);  while (--length > 0);
+                       do { *p++ = read_byte_mode0(ioaddr); } while (--length > 0);
+               } else { /* Mode 2 or 3 */
+                       do { *p++ = read_byte_mode2(ioaddr); } while (--length > 0);
+               }
+       } else if (data_mode <= 5) {
+               do { *p++ = read_byte_mode4(ioaddr); } while (--length > 0);
+       } else {
+               do { *p++ = read_byte_mode6(ioaddr); } while (--length > 0);
+       }
 
-    outb(EOC+HNib+MAR, ioaddr + PAR_DATA);
+       outb(EOC+HNib+MAR, ioaddr + PAR_DATA);
        outb(Ctrl_SelData, ioaddr + PAR_CONTROL);
 }
 
@@ -854,14 +861,9 @@ static void set_rx_mode_8002(struct net_device *dev)
        struct net_local *lp = netdev_priv(dev);
        long ioaddr = dev->base_addr;
 
-       if ( dev->mc_count > 0 || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC))) {
-               /* We must make the kernel realise we had to move
-                *      into promisc mode or we start all out war on
-                *      the cable. - AC
-                */
-               dev->flags|=IFF_PROMISC;
+       if (!netdev_mc_empty(dev) || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC)))
                lp->addr_mode = CMR2h_PROMISC;
-       else
+       else
                lp->addr_mode = CMR2h_Normal;
        write_reg_high(ioaddr, CMR2, lp->addr_mode);
 }
@@ -875,7 +877,8 @@ static void set_rx_mode_8012(struct net_device *dev)
 
        if (dev->flags & IFF_PROMISC) {                 /* Set promiscuous. */
                new_mode = CMR2h_PROMISC;
-       } else if ((dev->mc_count > 1000)  ||  (dev->flags & IFF_ALLMULTI)) {
+       } else if ((netdev_mc_count(dev) > 1000) ||
+                  (dev->flags & IFF_ALLMULTI)) {
                /* Too many to filter perfectly -- accept all multicasts. */
                memset(mc_filter, 0xff, sizeof(mc_filter));
                new_mode = CMR2h_Normal;
@@ -883,7 +886,7 @@ static void set_rx_mode_8012(struct net_device *dev)
                struct dev_mc_list *mclist;
 
                memset(mc_filter, 0, sizeof(mc_filter));
-               for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
+               for (i = 0, mclist = dev->mc_list; mclist && i < netdev_mc_count(dev);
                         i++, mclist = mclist->next)
                {
                        int filterbit = ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f;
@@ -908,6 +911,17 @@ static void set_rx_mode_8012(struct net_device *dev)
     write_reg(ioaddr, CMR2, CMR2_IRQOUT); /* Switch back to page 0 */
 }
 
+static void set_rx_mode(struct net_device *dev)
+{
+       struct net_local *lp = netdev_priv(dev);
+
+       if (lp->chip_type == RTL8002)
+               return set_rx_mode_8002(dev);
+       else
+               return set_rx_mode_8012(dev);
+}
+
+
 static int __init atp_init_module(void) {
        if (debug)                                      /* Emit version even if no cards detected. */
                printk(KERN_INFO "%s", version);
@@ -918,7 +932,8 @@ static void __exit atp_cleanup_module(void) {
        struct net_device *next_dev;
 
        while (root_atp_dev) {
-               next_dev = ((struct net_local *)root_atp_dev->priv)->next_module;
+               struct net_local *atp_local = netdev_priv(root_atp_dev);
+               next_dev = atp_local->next_module;
                unregister_netdev(root_atp_dev);
                /* No need to release_region(), since we never snarf it. */
                free_netdev(root_atp_dev);