spidernet: Replace literal with const
[safe/jmp/linux-2.6] / drivers / net / ehea / ehea_main.c
index e6fe2cf..9e13433 100644 (file)
@@ -78,6 +78,28 @@ MODULE_PARM_DESC(sq_entries, " Number of entries for the Send Queue  "
                 __MODULE_STRING(EHEA_DEF_ENTRIES_SQ) ")");
 MODULE_PARM_DESC(use_mcs, " 0:NAPI, 1:Multiple receive queues, Default = 1 ");
 
+static int port_name_cnt = 0;
+
+static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
+                                        const struct of_device_id *id);
+
+static int __devexit ehea_remove(struct ibmebus_dev *dev);
+
+static struct of_device_id ehea_device_table[] = {
+       {
+               .name = "lhea",
+               .compatible = "IBM,lhea",
+       },
+       {},
+};
+
+static struct ibmebus_driver ehea_driver = {
+       .name = "ehea",
+       .id_table = ehea_device_table,
+       .probe = ehea_probe_adapter,
+       .remove = ehea_remove,
+};
+
 void ehea_dump(void *adr, int len, char *msg) {
        int x;
        unsigned char *deb = adr;
@@ -406,7 +428,7 @@ static struct ehea_cqe *ehea_proc_rwqes(struct net_device *dev,
                                }
                                skb_copy_to_linear_data(skb, ((char*)cqe) + 64,
                                               cqe->num_bytes_transfered - 4);
-                               ehea_fill_skb(dev, skb, cqe);
+                               ehea_fill_skb(port->netdev, skb, cqe);
                        } else if (rq == 2) {  /* RQ2 */
                                skb = get_skb_by_index(skb_arr_rq2,
                                                       skb_arr_rq2_len, cqe);
@@ -429,7 +451,8 @@ static struct ehea_cqe *ehea_proc_rwqes(struct net_device *dev,
                                processed_rq3++;
                        }
 
-                       if (cqe->status & EHEA_CQE_VLAN_TAG_XTRACT)
+                       if ((cqe->status & EHEA_CQE_VLAN_TAG_XTRACT)
+                           && port->vgrp)
                                vlan_hwaccel_receive_skb(skb, port->vgrp,
                                                         cqe->vlan_tag);
                        else
@@ -1781,10 +1804,10 @@ static inline int ehea_hash_skb(struct sk_buff *skb, int num_qps)
        u32 tmp;
 
        if ((skb->protocol == htons(ETH_P_IP)) &&
-           (skb->nh.iph->protocol == IPPROTO_TCP)) {
-               tcp = (struct tcphdr*)(skb->nh.raw + (skb->nh.iph->ihl * 4));
+           (ip_hdr(skb)->protocol == IPPROTO_TCP)) {
+               tcp = (struct tcphdr*)(skb_network_header(skb) + (ip_hdr(skb)->ihl * 4));
                tmp = (tcp->source + (tcp->dest << 16)) % 31;
-               tmp += skb->nh.iph->daddr % 31;
+               tmp += ip_hdr(skb)->daddr % 31;
                return tmp % num_qps;
        }
        else
@@ -1888,10 +1911,7 @@ static void ehea_vlan_rx_register(struct net_device *dev,
                goto out;
        }
 
-       if (grp)
-               memset(cb1->vlan_filter, 0, sizeof(cb1->vlan_filter));
-       else
-               memset(cb1->vlan_filter, 0xFF, sizeof(cb1->vlan_filter));
+       memset(cb1->vlan_filter, 0, sizeof(cb1->vlan_filter));
 
        hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
                                       H_PORT_CB1, H_PORT_CB1_ALL, cb1);
@@ -1925,7 +1945,7 @@ static void ehea_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
        }
 
        index = (vid / 64);
-       cb1->vlan_filter[index] |= ((u64)(1 << (vid & 0x3F)));
+       cb1->vlan_filter[index] |= ((u64)(0x8000000000000000 >> (vid & 0x3F)));
 
        hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
                                       H_PORT_CB1, H_PORT_CB1_ALL, cb1);
@@ -1960,7 +1980,7 @@ static void ehea_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
        }
 
        index = (vid / 64);
-       cb1->vlan_filter[index] &= ~((u64)(1 << (vid & 0x3F)));
+       cb1->vlan_filter[index] &= ~((u64)(0x8000000000000000 >> (vid & 0x3F)));
 
        hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
                                       H_PORT_CB1, H_PORT_CB1_ALL, cb1);
@@ -2111,6 +2131,28 @@ static int ehea_clean_all_portres(struct ehea_port *port)
        return ret;
 }
 
+static void ehea_remove_adapter_mr (struct ehea_adapter *adapter)
+{
+       int i;
+
+       for (i=0; i < EHEA_MAX_PORTS; i++)
+               if (adapter->port[i])
+                       return;
+
+       ehea_rem_mr(&adapter->mr);
+}
+
+static int ehea_add_adapter_mr (struct ehea_adapter *adapter)
+{
+       int i;
+
+       for (i=0; i < EHEA_MAX_PORTS; i++)
+               if (adapter->port[i])
+                       return 0;
+
+       return ehea_reg_kernel_mr(adapter, &adapter->mr);
+}
+
 static int ehea_up(struct net_device *dev)
 {
        int ret, i;
@@ -2364,6 +2406,34 @@ static void __devinit logical_port_release(struct device *dev)
        of_node_put(port->ofdev.node);
 }
 
+static int ehea_driver_sysfs_add(struct device *dev,
+                                 struct device_driver *driver)
+{
+       int ret;
+
+       ret = sysfs_create_link(&driver->kobj, &dev->kobj,
+                               kobject_name(&dev->kobj));
+       if (ret == 0) {
+               ret = sysfs_create_link(&dev->kobj, &driver->kobj,
+                                       "driver");
+               if (ret)
+                       sysfs_remove_link(&driver->kobj,
+                                         kobject_name(&dev->kobj));
+       }
+       return ret;
+}
+
+static void ehea_driver_sysfs_remove(struct device *dev,
+                                     struct device_driver *driver)
+{
+       struct device_driver *drv = driver;
+
+       if (drv) {
+               sysfs_remove_link(&drv->kobj, kobject_name(&dev->kobj));
+               sysfs_remove_link(&dev->kobj, "driver");
+       }
+}
+
 static struct device *ehea_register_port(struct ehea_port *port,
                                         struct device_node *dn)
 {
@@ -2371,8 +2441,9 @@ static struct device *ehea_register_port(struct ehea_port *port,
 
        port->ofdev.node = of_node_get(dn);
        port->ofdev.dev.parent = &port->adapter->ebus_dev->ofdev.dev;
+       port->ofdev.dev.bus = &ibmebus_bus_type;
 
-       sprintf(port->ofdev.dev.bus_id, "port%d", port->logical_port_id);
+       sprintf(port->ofdev.dev.bus_id, "port%d", port_name_cnt++);
        port->ofdev.dev.release = logical_port_release;
 
        ret = of_device_register(&port->ofdev);
@@ -2387,8 +2458,16 @@ static struct device *ehea_register_port(struct ehea_port *port,
                goto out_unreg_of_dev;
        }
 
+       ret = ehea_driver_sysfs_add(&port->ofdev.dev, &ehea_driver.driver);
+       if (ret) {
+               ehea_error("failed to register sysfs driver link");
+               goto out_rem_dev_file;
+       }
+
        return &port->ofdev.dev;
 
+out_rem_dev_file:
+       device_remove_file(&port->ofdev.dev, &dev_attr_log_port_id);
 out_unreg_of_dev:
        of_device_unregister(&port->ofdev);
 out:
@@ -2397,6 +2476,7 @@ out:
 
 static void ehea_unregister_port(struct ehea_port *port)
 {
+       ehea_driver_sysfs_remove(&port->ofdev.dev, &ehea_driver.driver);
        device_remove_file(&port->ofdev.dev, &dev_attr_log_port_id);
        of_device_unregister(&port->ofdev);
 }
@@ -2521,15 +2601,13 @@ static int ehea_setup_ports(struct ehea_adapter *adapter)
 {
        struct device_node *lhea_dn;
        struct device_node *eth_dn = NULL;
-
-       u32 *dn_log_port_id;
-       int port_setup_ok = 0;
+       const u32 *dn_log_port_id;
        int i = 0;
 
        lhea_dn = adapter->ebus_dev->ofdev.node;
        while ((eth_dn = of_get_next_child(lhea_dn, eth_dn))) {
 
-               dn_log_port_id = (u32*)get_property(eth_dn, "ibm,hea-port-no",
+               dn_log_port_id = of_get_property(eth_dn, "ibm,hea-port-no",
                                                    NULL);
                if (!dn_log_port_id) {
                        ehea_error("bad device node: eth_dn name=%s",
@@ -2537,6 +2615,12 @@ static int ehea_setup_ports(struct ehea_adapter *adapter)
                        continue;
                }
 
+               if (ehea_add_adapter_mr(adapter)) {
+                       ehea_error("creating MR failed");
+                       of_node_put(eth_dn);
+                       return -EIO;
+               }
+
                adapter->port[i] = ehea_setup_single_port(adapter,
                                                          *dn_log_port_id,
                                                          eth_dn);
@@ -2544,18 +2628,13 @@ static int ehea_setup_ports(struct ehea_adapter *adapter)
                        ehea_info("%s -> logical port id #%d",
                                  adapter->port[i]->netdev->name,
                                  *dn_log_port_id);
+               else
+                       ehea_remove_adapter_mr(adapter);
+
                i++;
        };
 
-       /* Check for succesfully set up ports */
-       for (i = 0; i < EHEA_MAX_PORTS; i++)
-               if (adapter->port[i])
-                       port_setup_ok++;
-
-       if (port_setup_ok)
-               return 0;       /* At least some ports are setup correctly */
-
-       return -EINVAL;
+       return 0;
 }
 
 static struct device_node *ehea_get_eth_dn(struct ehea_adapter *adapter,
@@ -2563,12 +2642,12 @@ static struct device_node *ehea_get_eth_dn(struct ehea_adapter *adapter,
 {
        struct device_node *lhea_dn;
        struct device_node *eth_dn = NULL;
-       u32 *dn_log_port_id;
+       const u32 *dn_log_port_id;
 
        lhea_dn = adapter->ebus_dev->ofdev.node;
        while ((eth_dn = of_get_next_child(lhea_dn, eth_dn))) {
 
-               dn_log_port_id = (u32*)get_property(eth_dn, "ibm,hea-port-no",
+               dn_log_port_id = of_get_property(eth_dn, "ibm,hea-port-no",
                                                    NULL);
                if (dn_log_port_id)
                        if (*dn_log_port_id == logical_port_id)
@@ -2607,6 +2686,11 @@ static ssize_t ehea_probe_port(struct device *dev,
                return -EINVAL;
        }
 
+       if (ehea_add_adapter_mr(adapter)) {
+               ehea_error("creating MR failed");
+               return -EIO;
+       }
+
        port = ehea_setup_single_port(adapter, logical_port_id, eth_dn);
 
        of_node_put(eth_dn);
@@ -2620,8 +2704,10 @@ static ssize_t ehea_probe_port(struct device *dev,
 
                ehea_info("added %s (logical port id=%d)", port->netdev->name,
                          logical_port_id);
-       } else
+       } else {
+               ehea_remove_adapter_mr(adapter);
                return -EIO;
+       }
 
        return (ssize_t) count;
 }
@@ -2656,6 +2742,8 @@ static ssize_t ehea_remove_port(struct device *dev,
                return -EINVAL;
        }
 
+       ehea_remove_adapter_mr(adapter);
+
        return (ssize_t) count;
 }
 
@@ -2683,7 +2771,7 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
                                        const struct of_device_id *id)
 {
        struct ehea_adapter *adapter;
-       u64 *adapter_handle;
+       const u64 *adapter_handle;
        int ret;
 
        if (!dev || !dev->ofdev.node) {
@@ -2700,7 +2788,7 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
 
        adapter->ebus_dev = dev;
 
-       adapter_handle = (u64*)get_property(dev->ofdev.node, "ibm,hea-handle",
+       adapter_handle = of_get_property(dev->ofdev.node, "ibm,hea-handle",
                                            NULL);
        if (adapter_handle)
                adapter->handle = *adapter_handle;
@@ -2716,18 +2804,13 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
 
        dev->ofdev.dev.driver_data = adapter;
 
-       ret = ehea_reg_kernel_mr(adapter, &adapter->mr);
-       if (ret) {
-               dev_err(&dev->ofdev.dev, "reg_mr_adapter failed\n");
-               goto out_free_ad;
-       }
 
        /* initialize adapter and ports */
        /* get adapter properties */
        ret = ehea_sense_adapter_attr(adapter);
        if (ret) {
                dev_err(&dev->ofdev.dev, "sense_adapter_attr failed: %d", ret);
-               goto out_free_res;
+               goto out_free_ad;
        }
 
        adapter->neq = ehea_create_eq(adapter,
@@ -2735,7 +2818,7 @@ static int __devinit ehea_probe_adapter(struct ibmebus_dev *dev,
        if (!adapter->neq) {
                ret = -EIO;
                dev_err(&dev->ofdev.dev, "NEQ creation failed");
-               goto out_free_res;
+               goto out_free_ad;
        }
 
        tasklet_init(&adapter->neq_tasklet, ehea_neq_tasklet,
@@ -2780,9 +2863,6 @@ out_free_irq:
 out_kill_eq:
        ehea_destroy_eq(adapter->neq);
 
-out_free_res:
-       ehea_rem_mr(&adapter->mr);
-
 out_free_ad:
        kfree(adapter);
 out:
@@ -2808,7 +2888,7 @@ static int __devexit ehea_remove(struct ibmebus_dev *dev)
        tasklet_kill(&adapter->neq_tasklet);
 
        ehea_destroy_eq(adapter->neq);
-       ehea_rem_mr(&adapter->mr);
+       ehea_remove_adapter_mr(adapter);
        kfree(adapter);
        return 0;
 }
@@ -2841,21 +2921,6 @@ static int check_module_parm(void)
        return ret;
 }
 
-static struct of_device_id ehea_device_table[] = {
-       {
-               .name = "lhea",
-               .compatible = "IBM,lhea",
-       },
-       {},
-};
-
-static struct ibmebus_driver ehea_driver = {
-       .name = "ehea",
-       .id_table = ehea_device_table,
-       .probe = ehea_probe_adapter,
-       .remove = ehea_remove,
-};
-
 int __init ehea_module_init(void)
 {
        int ret;