]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/igbvf/netdev.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / net / igbvf / netdev.c
index 28af019c97bb8bdd7bc413bd494a0cac6aef03dc..6352c8158e6d92f90889fe08ced2f5185d5d6550 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
   Intel(R) 82576 Virtual Function Linux driver
-  Copyright(c) 2009 Intel Corporation.
+  Copyright(c) 2009 - 2010 Intel Corporation.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms and conditions of the GNU General Public License,
 
 #include "igbvf.h"
 
-#define DRV_VERSION "1.0.0-k0"
+#define DRV_VERSION "1.0.8-k0"
 char igbvf_driver_name[] = "igbvf";
 const char igbvf_driver_version[] = DRV_VERSION;
 static const char igbvf_driver_string[] =
                                "Intel(R) Virtual Function Network Driver";
-static const char igbvf_copyright[] = "Copyright (c) 2009 Intel Corporation.";
+static const char igbvf_copyright[] =
+                               "Copyright (c) 2009 - 2010 Intel Corporation.";
 
 static int igbvf_poll(struct napi_struct *napi, int budget);
 static void igbvf_reset(struct igbvf_adapter *);
@@ -63,8 +64,16 @@ static struct igbvf_info igbvf_vf_info = {
        .init_ops               = e1000_init_function_pointers_vf,
 };
 
+static struct igbvf_info igbvf_i350_vf_info = {
+       .mac                    = e1000_vfadapt_i350,
+       .flags                  = 0,
+       .pba                    = 10,
+       .init_ops               = e1000_init_function_pointers_vf,
+};
+
 static const struct igbvf_info *igbvf_info_tbl[] = {
        [board_vf]              = &igbvf_vf_info,
+       [board_i350_vf]         = &igbvf_i350_vf_info,
 };
 
 /**
@@ -429,10 +438,9 @@ int igbvf_setup_tx_resources(struct igbvf_adapter *adapter,
        int size;
 
        size = sizeof(struct igbvf_buffer) * tx_ring->count;
-       tx_ring->buffer_info = vmalloc(size);
+       tx_ring->buffer_info = vzalloc(size);
        if (!tx_ring->buffer_info)
                goto err;
-       memset(tx_ring->buffer_info, 0, size);
 
        /* round up to nearest 4K */
        tx_ring->size = tx_ring->count * sizeof(union e1000_adv_tx_desc);
@@ -469,10 +477,9 @@ int igbvf_setup_rx_resources(struct igbvf_adapter *adapter,
        int size, desc_len;
 
        size = sizeof(struct igbvf_buffer) * rx_ring->count;
-       rx_ring->buffer_info = vmalloc(size);
+       rx_ring->buffer_info = vzalloc(size);
        if (!rx_ring->buffer_info)
                goto err;
-       memset(rx_ring->buffer_info, 0, size);
 
        desc_len = sizeof(union e1000_adv_rx_desc);
 
@@ -1851,8 +1858,6 @@ static void igbvf_watchdog_task(struct work_struct *work)
 
        if (link) {
                if (!netif_carrier_ok(netdev)) {
-                       bool txb2b = 1;
-
                        mac->ops.get_link_up_info(&adapter->hw,
                                                  &adapter->link_speed,
                                                  &adapter->link_duplex);
@@ -1862,11 +1867,9 @@ static void igbvf_watchdog_task(struct work_struct *work)
                        adapter->tx_timeout_factor = 1;
                        switch (adapter->link_speed) {
                        case SPEED_10:
-                               txb2b = 0;
                                adapter->tx_timeout_factor = 16;
                                break;
                        case SPEED_100:
-                               txb2b = 0;
                                /* maybe add some timeout factor ? */
                                break;
                        }
@@ -2830,13 +2833,14 @@ static void __devexit igbvf_remove(struct pci_dev *pdev)
        struct e1000_hw *hw = &adapter->hw;
 
        /*
-        * flush_scheduled work may reschedule our watchdog task, so
-        * explicitly disable watchdog tasks from being rescheduled
+        * The watchdog timer may be rescheduled, so explicitly
+        * disable it from being rescheduled.
         */
        set_bit(__IGBVF_DOWN, &adapter->state);
        del_timer_sync(&adapter->watchdog_timer);
 
-       flush_scheduled_work();
+       cancel_work_sync(&adapter->reset_task);
+       cancel_work_sync(&adapter->watchdog_task);
 
        unregister_netdev(netdev);
 
@@ -2869,6 +2873,7 @@ static struct pci_error_handlers igbvf_err_handler = {
 
 static DEFINE_PCI_DEVICE_TABLE(igbvf_pci_tbl) = {
        { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_VF), board_vf },
+       { PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_VF), board_i350_vf },
        { } /* terminate list */
 };
 MODULE_DEVICE_TABLE(pci, igbvf_pci_tbl);