Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[firefly-linux-kernel-4.4.55.git] / drivers / net / enic / enic_main.c
index 21be989e6a14249d15086f0526c88e6f5fd214b3..a0af48c51fb37d1860061e6358ec4dfdc64005fc 100644 (file)
@@ -702,7 +702,7 @@ static inline void enic_queue_wq_skb_csum_l4(struct enic *enic,
 {
        unsigned int head_len = skb_headlen(skb);
        unsigned int len_left = skb->len - head_len;
-       unsigned int hdr_len = skb_transport_offset(skb);
+       unsigned int hdr_len = skb_checksum_start_offset(skb);
        unsigned int csum_offset = hdr_len + skb->csum_offset;
        int eop = (len_left == 0);
 
@@ -1252,7 +1252,10 @@ static int enic_set_port_profile(struct enic *enic, u8 *mac)
 {
        struct vic_provinfo *vp;
        u8 oui[3] = VIC_PROVINFO_CISCO_OUI;
+       u16 os_type = VIC_GENERIC_PROV_OS_TYPE_LINUX;
        char uuid_str[38];
+       char client_mac_str[18];
+       u8 *client_mac;
        int err;
 
        err = enic_vnic_dev_deinit(enic);
@@ -1270,37 +1273,47 @@ static int enic_set_port_profile(struct enic *enic, u8 *mac)
                        return -EADDRNOTAVAIL;
 
                vp = vic_provinfo_alloc(GFP_KERNEL, oui,
-                       VIC_PROVINFO_LINUX_TYPE);
+                       VIC_PROVINFO_GENERIC_TYPE);
                if (!vp)
                        return -ENOMEM;
 
                vic_provinfo_add_tlv(vp,
-                       VIC_LINUX_PROV_TLV_PORT_PROFILE_NAME_STR,
+                       VIC_GENERIC_PROV_TLV_PORT_PROFILE_NAME_STR,
                        strlen(enic->pp.name) + 1, enic->pp.name);
 
                if (!is_zero_ether_addr(enic->pp.mac_addr))
-                       vic_provinfo_add_tlv(vp,
-                               VIC_LINUX_PROV_TLV_CLIENT_MAC_ADDR,
-                               ETH_ALEN, enic->pp.mac_addr);
+                       client_mac = enic->pp.mac_addr;
                else
-                       vic_provinfo_add_tlv(vp,
-                               VIC_LINUX_PROV_TLV_CLIENT_MAC_ADDR,
-                               ETH_ALEN, mac);
+                       client_mac = mac;
+
+               vic_provinfo_add_tlv(vp,
+                       VIC_GENERIC_PROV_TLV_CLIENT_MAC_ADDR,
+                       ETH_ALEN, client_mac);
+
+               sprintf(client_mac_str, "%pM", client_mac);
+               vic_provinfo_add_tlv(vp,
+                       VIC_GENERIC_PROV_TLV_CLUSTER_PORT_UUID_STR,
+                       sizeof(client_mac_str), client_mac_str);
 
                if (enic->pp.set & ENIC_SET_INSTANCE) {
                        sprintf(uuid_str, "%pUB", enic->pp.instance_uuid);
                        vic_provinfo_add_tlv(vp,
-                               VIC_LINUX_PROV_TLV_CLIENT_UUID_STR,
+                               VIC_GENERIC_PROV_TLV_CLIENT_UUID_STR,
                                sizeof(uuid_str), uuid_str);
                }
 
                if (enic->pp.set & ENIC_SET_HOST) {
                        sprintf(uuid_str, "%pUB", enic->pp.host_uuid);
                        vic_provinfo_add_tlv(vp,
-                               VIC_LINUX_PROV_TLV_HOST_UUID_STR,
+                               VIC_GENERIC_PROV_TLV_HOST_UUID_STR,
                                sizeof(uuid_str), uuid_str);
                }
 
+               os_type = htons(os_type);
+               vic_provinfo_add_tlv(vp,
+                       VIC_GENERIC_PROV_TLV_OS_TYPE,
+                       sizeof(os_type), &os_type);
+
                err = enic_dev_init_prov(enic, vp);
                vic_provinfo_free(vp);
                if (err)
@@ -2085,7 +2098,8 @@ static void enic_poll_controller(struct net_device *netdev)
        case VNIC_DEV_INTR_MODE_MSIX:
                for (i = 0; i < enic->rq_count; i++) {
                        intr = enic_msix_rq_intr(enic, i);
-                       enic_isr_msix_rq(enic->msix_entry[intr].vector, enic);
+                       enic_isr_msix_rq(enic->msix_entry[intr].vector,
+                               &enic->napi[i]);
                }
                intr = enic_msix_wq_intr(enic, i);
                enic_isr_msix_wq(enic->msix_entry[intr].vector, enic);
@@ -2821,7 +2835,7 @@ static void __devexit enic_remove(struct pci_dev *pdev)
        if (netdev) {
                struct enic *enic = netdev_priv(netdev);
 
-               flush_scheduled_work();
+               cancel_work_sync(&enic->reset);
                unregister_netdev(netdev);
                enic_dev_deinit(enic);
                vnic_dev_close(enic->vdev);