Merge branch 'e1000-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[pandora-kernel.git] / drivers / net / netxen / netxen_nic_main.c
index 225ff55..ab25c22 100644 (file)
@@ -41,8 +41,7 @@
 
 #include <linux/dma-mapping.h>
 #include <linux/vmalloc.h>
-
-#define PHAN_VENDOR_ID 0x4040
+#include <net/ip.h>
 
 MODULE_DESCRIPTION("NetXen Multi port (1/10) Gigabit Network Driver");
 MODULE_LICENSE("GPL");
@@ -379,6 +378,8 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                netdev->tx_timeout = netxen_tx_timeout;
                netdev->watchdog_timeo = HZ;
 
+               netxen_nic_change_mtu(netdev, netdev->mtu);
+
                SET_ETHTOOL_OPS(netdev, &netxen_nic_ethtool_ops);
                netdev->poll = netxen_nic_poll;
                netdev->weight = NETXEN_NETDEV_WEIGHT;
@@ -434,13 +435,11 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                adapter->port_count++;
                adapter->port[i] = port;
        }
-#ifndef CONFIG_PPC64
        writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
        netxen_pinit_from_rom(adapter, 0);
        udelay(500);
        netxen_load_firmware(adapter);
        netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
-#endif
        /*
         * delay a while to ensure that the Pegs are up & running.
         * Otherwise, we might see some flaky behaviour.
@@ -525,14 +524,17 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
        if (adapter == NULL)
                return;
 
+       if (adapter->irq)
+               free_irq(adapter->irq, adapter);
        netxen_nic_stop_all_ports(adapter);
        /* leave the hw in the same state as reboot */
-       netxen_pinit_from_rom(adapter, 0);
        writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
+       netxen_pinit_from_rom(adapter, 0);
+       udelay(500);
        netxen_load_firmware(adapter);
        netxen_free_adapter_offload(adapter);
 
-       udelay(500);            /* Delay for a while to drain the DMA engines */
+       mdelay(1000);           /* Delay for a while to drain the DMA engines */
        for (i = 0; i < adapter->port_count; i++) {
                port = adapter->port[i];
                if ((port) && (port->netdev)) {
@@ -543,7 +545,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
 
        if ((adapter->flags & NETXEN_NIC_MSI_ENABLED))
                pci_disable_msi(pdev);
-       pci_set_drvdata(pdev, NULL);
        if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC)
                netxen_free_hw_resources(adapter);
 
@@ -554,6 +555,7 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
 
        pci_release_regions(pdev);
        pci_disable_device(pdev);
+       pci_set_drvdata(pdev, NULL);
 
        for (ctxid = 0; ctxid < MAX_RCV_CTX; ++ctxid) {
                recv_ctx = &adapter->recv_ctx[ctxid];
@@ -672,8 +674,6 @@ static int netxen_nic_close(struct net_device *netdev)
 
        if (!adapter->active_ports) {
                netxen_nic_disable_int(adapter);
-               if (adapter->irq)
-                       free_irq(adapter->irq, adapter);
                cmd_buff = adapter->cmd_buf_arr;
                for (i = 0; i < adapter->max_tx_desc_count; i++) {
                        buffrag = cmd_buff->frag_array;
@@ -779,9 +779,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
                if (skb_shinfo(skb)->gso_size > 0) {
 
                        no_of_desc++;
-                       if (((skb->nh.iph)->ihl * sizeof(u32)) +
-                           ((skb->h.th)->doff * sizeof(u32)) +
-                           sizeof(struct ethhdr) >
+                       if ((ip_hdrlen(skb) + tcp_hdrlen(skb) +
+                            sizeof(struct ethhdr)) >
                            (sizeof(struct cmd_desc_type0) - 2)) {
                                no_of_desc++;
                        }
@@ -921,8 +920,10 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
                        /* copy the next 64 bytes - should be enough except
                         * for pathological case
                         */
-                       memcpy((void *)hwdesc, (void *)(skb->data) +
-                              first_hdr_len, hdr_len - first_hdr_len);
+                       skb_copy_from_linear_data_offset(skb, first_hdr_len,
+                                                        hwdesc,
+                                                        (hdr_len -
+                                                         first_hdr_len));
                        producer = get_next_index(producer, max_tx_desc_count);
                }
        }
@@ -1155,8 +1156,8 @@ static void __exit netxen_exit_module(void)
        /*
         * Wait for some time to allow the dma to drain, if any.
         */
-       destroy_workqueue(netxen_workq);
        pci_unregister_driver(&netxen_driver);
+       destroy_workqueue(netxen_workq);
 }
 
 module_exit(netxen_exit_module);