net: wireless: sd8797: Marvell sd8797 Wi-Fi driver
[linux-2.6.git] / drivers / net / iseries_veth.c
index 16c9191..53dd39e 100644 (file)
@@ -69,6 +69,7 @@
 #include <linux/mm.h>
 #include <linux/ethtool.h>
 #include <linux/if_ether.h>
+#include <linux/slab.h>
 
 #include <asm/abs_addr.h>
 #include <asm/iseries/mf.h>
@@ -384,7 +385,7 @@ static struct attribute *veth_cnx_default_attrs[] = {
        NULL
 };
 
-static struct sysfs_ops veth_cnx_sysfs_ops = {
+static const struct sysfs_ops veth_cnx_sysfs_ops = {
                .show = veth_cnx_attribute_show
 };
 
@@ -441,7 +442,7 @@ static struct attribute *veth_port_default_attrs[] = {
        NULL
 };
 
-static struct sysfs_ops veth_port_sysfs_ops = {
+static const struct sysfs_ops veth_port_sysfs_ops = {
        .show = veth_port_attribute_show
 };
 
@@ -537,7 +538,7 @@ static void veth_handle_ack(struct veth_lpevent *event)
        default:
                veth_error("Unknown ack type %d from LPAR %d.\n",
                                event->base_event.xSubtype, rlp);
-       };
+       }
 }
 
 static void veth_handle_int(struct veth_lpevent *event)
@@ -583,7 +584,7 @@ static void veth_handle_int(struct veth_lpevent *event)
        default:
                veth_error("Unknown interrupt type %d from LPAR %d.\n",
                                event->base_event.xSubtype, rlp);
-       };
+       }
 }
 
 static void veth_handle_event(struct HvLpEvent *event)
@@ -884,17 +885,8 @@ static void veth_stop_connection(struct veth_lpar_connection *cnx)
        veth_kick_statemachine(cnx);
        spin_unlock_irq(&cnx->lock);
 
-       /* There's a slim chance the reset code has just queued the
-        * statemachine to run in five seconds. If so we need to cancel
-        * that and requeue the work to run now. */
-       if (cancel_delayed_work(&cnx->statemachine_wq)) {
-               spin_lock_irq(&cnx->lock);
-               veth_kick_statemachine(cnx);
-               spin_unlock_irq(&cnx->lock);
-       }
-
-       /* Wait for the state machine to run. */
-       flush_scheduled_work();
+       /* ensure the statemachine runs now and waits for its completion */
+       flush_delayed_work_sync(&cnx->statemachine_wq);
 }
 
 static void veth_destroy_connection(struct veth_lpar_connection *cnx)
@@ -958,27 +950,23 @@ static void veth_set_multicast_list(struct net_device *dev)
        write_lock_irqsave(&port->mcast_gate, flags);
 
        if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI) ||
-                       (dev->mc_count > VETH_MAX_MCAST)) {
+                       (netdev_mc_count(dev) > VETH_MAX_MCAST)) {
                port->promiscuous = 1;
        } else {
-               struct dev_mc_list *dmi = dev->mc_list;
-               int i;
+               struct netdev_hw_addr *ha;
 
                port->promiscuous = 0;
 
                /* Update table */
                port->num_mcast = 0;
 
-               for (i = 0; i < dev->mc_count; i++) {
-                       u8 *addr = dmi->dmi_addr;
+               netdev_for_each_mc_addr(ha, dev) {
+                       u8 *addr = ha->addr;
                        u64 xaddr = 0;
 
-                       if (addr[0] & 0x01) {/* multicast address? */
-                               memcpy(&xaddr, addr, ETH_ALEN);
-                               port->mcast_addr[port->num_mcast] = xaddr;
-                               port->num_mcast++;
-                       }
-                       dmi = dmi->next;
+                       memcpy(&xaddr, addr, ETH_ALEN);
+                       port->mcast_addr[port->num_mcast] = xaddr;
+                       port->num_mcast++;
                }
        }
 
@@ -1010,15 +998,10 @@ static int veth_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
        return 0;
 }
 
-static u32 veth_get_link(struct net_device *dev)
-{
-       return 1;
-}
-
 static const struct ethtool_ops ops = {
        .get_drvinfo = veth_get_drvinfo,
        .get_settings = veth_get_settings,
-       .get_link = veth_get_link,
+       .get_link = ethtool_op_get_link,
 };
 
 static const struct net_device_ops veth_netdev_ops = {
@@ -1199,7 +1182,7 @@ static int veth_start_xmit(struct sk_buff *skb, struct net_device *dev)
        struct veth_port *port = netdev_priv(dev);
        HvLpIndexMap lpmask;
 
-       if (! (frame[0] & 0x01)) {
+       if (is_unicast_ether_addr(frame)) {
                /* unicast packet */
                HvLpIndex rlp = frame[5];
 
@@ -1525,7 +1508,7 @@ static void veth_receive(struct veth_lpar_connection *cnx,
 
                skb_put(skb, length);
                skb->protocol = eth_type_trans(skb, dev);
-               skb->ip_summed = CHECKSUM_NONE;
+               skb_checksum_none_assert(skb);
                netif_rx(skb);  /* send it up */
                dev->stats.rx_packets++;
                dev->stats.rx_bytes += length;
@@ -1606,7 +1589,7 @@ static int veth_probe(struct vio_dev *vdev, const struct vio_device_id *id)
        }
        veth_dev[i] = dev;
 
-       port = (struct veth_port*)netdev_priv(dev);
+       port = netdev_priv(dev);
 
        /* Start the state machine on each connection on this vlan. If we're
         * the first dev to do so this will commence link negotiation */
@@ -1659,15 +1642,14 @@ static void __exit veth_module_cleanup(void)
        /* Disconnect our "irq" to stop events coming from the Hypervisor. */
        HvLpEvent_unregisterHandler(HvLpEvent_Type_VirtualLan);
 
-       /* Make sure any work queued from Hypervisor callbacks is finished. */
-       flush_scheduled_work();
-
        for (i = 0; i < HVMAXARCHITECTEDLPS; ++i) {
                cnx = veth_cnx[i];
 
                if (!cnx)
                        continue;
 
+               /* Cancel work queued from Hypervisor callbacks */
+               cancel_delayed_work_sync(&cnx->statemachine_wq);
                /* Remove the connection from sysfs */
                kobject_del(&cnx->kobject);
                /* Drop the driver's reference to the connection */