]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/qlcnic/qlcnic_main.c
Merge branch 'vhost-net-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mst...
[mv-sheeva.git] / drivers / net / qlcnic / qlcnic_main.c
index f047c7c48314ccd48c76df8d68babb5d24c796d5..788850e2ba4e910d65896c4eaaea734cbceba483 100644 (file)
@@ -1,25 +1,8 @@
 /*
- * Copyright (C) 2009 - QLogic Corporation.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
- * MA  02111-1307, USA.
- *
- * The full GNU General Public License is included in this distribution
- * in the file called "COPYING".
+ * QLogic qlcnic NIC Driver
+ * Copyright (c)  2009-2010 QLogic Corporation
  *
+ * See LICENSE.qlcnic for copyright and licensing details.
  */
 
 #include <linux/slab.h>
@@ -656,13 +639,23 @@ qlcnic_check_options(struct qlcnic_adapter *adapter)
 
        dev_info(&pdev->dev, "firmware v%d.%d.%d\n",
                        fw_major, fw_minor, fw_build);
-
        if (adapter->ahw.port_type == QLCNIC_XGBE) {
-               adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G;
+               if (adapter->flags & QLCNIC_ESWITCH_ENABLED) {
+                       adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF;
+                       adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF;
+               } else {
+                       adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G;
+                       adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G;
+               }
+
                adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
+               adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
+
        } else if (adapter->ahw.port_type == QLCNIC_GBE) {
                adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
                adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
+               adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
+               adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G;
        }
 
        adapter->msix_supported = !!use_msi_x;
@@ -1440,7 +1433,6 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter,
        netdev->irq = adapter->msix_entries[0].vector;
 
        netif_carrier_off(netdev);
-       netif_stop_queue(netdev);
 
        err = register_netdev(netdev);
        if (err) {
@@ -1476,6 +1468,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        uint8_t revision_id;
        uint8_t pci_using_dac;
        char brd_name[QLCNIC_MAX_BOARD_NAME_LEN];
+       u32 val;
 
        err = pci_enable_device(pdev);
        if (err)
@@ -1537,6 +1530,10 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (err)
                goto err_out_iounmap;
 
+       val = QLCRD32(adapter, QLCNIC_CRB_DRV_ACTIVE);
+       if (QLC_DEV_CHECK_ACTIVE(val, adapter->portnum))
+               adapter->flags |= QLCNIC_NEED_FLR;
+
        err = adapter->nic_ops->start_firmware(adapter);
        if (err) {
                dev_err(&pdev->dev, "Loading fw failed.Please Reboot\n");
@@ -1860,6 +1857,11 @@ qlcnic_send_filter(struct qlcnic_adapter *adapter,
        hlist_for_each_entry_safe(tmp_fil, tmp_hnode, n, head, fnode) {
                if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) &&
                            tmp_fil->vlan_id == vlan_id) {
+
+                       if (jiffies >
+                           (QLCNIC_READD_AGE * HZ + tmp_fil->ftime))
+                               qlcnic_change_filter(adapter, src_addr, vlan_id,
+                                                               tx_ring);
                        tmp_fil->ftime = jiffies;
                        return;
                }
@@ -2840,61 +2842,6 @@ qlcnic_set_npar_non_operational(struct qlcnic_adapter *adapter)
        qlcnic_api_unlock(adapter);
 }
 
-/* Caller should held RESETTING bit.
- * This should be call in sync with qlcnic_request_quiscent_mode.
- */
-void qlcnic_clear_quiscent_mode(struct qlcnic_adapter *adapter)
-{
-       qlcnic_clr_drv_state(adapter);
-       qlcnic_api_lock(adapter);
-       QLCWR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY);
-       qlcnic_api_unlock(adapter);
-}
-
-/* Caller should held RESETTING bit.
- */
-int qlcnic_request_quiscent_mode(struct qlcnic_adapter *adapter)
-{
-       u8 timeo = adapter->dev_init_timeo / 2;
-       u32 state;
-
-       if (qlcnic_api_lock(adapter))
-               return -EIO;
-
-       state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE);
-       if (state != QLCNIC_DEV_READY)
-               return -EIO;
-
-       QLCWR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_NEED_QUISCENT);
-       qlcnic_api_unlock(adapter);
-       QLCDB(adapter, DRV, "NEED QUISCENT state set\n");
-       qlcnic_idc_debug_info(adapter, 0);
-
-       qlcnic_set_drv_state(adapter, QLCNIC_DEV_NEED_QUISCENT);
-
-       do {
-               msleep(2000);
-               state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE);
-               if (state == QLCNIC_DEV_QUISCENT)
-                       return 0;
-               if (!qlcnic_check_drv_state(adapter)) {
-                       if (qlcnic_api_lock(adapter))
-                               return -EIO;
-                       QLCWR32(adapter, QLCNIC_CRB_DEV_STATE,
-                                                       QLCNIC_DEV_QUISCENT);
-                       qlcnic_api_unlock(adapter);
-                       QLCDB(adapter, DRV, "QUISCENT mode set\n");
-                       return 0;
-               }
-       } while (--timeo);
-
-       dev_err(&adapter->pdev->dev, "Failed to quiesce device, DRV_STATE=%08x"
-               " DRV_ACTIVE=%08x\n", QLCRD32(adapter, QLCNIC_CRB_DRV_STATE),
-               QLCRD32(adapter, QLCNIC_CRB_DRV_ACTIVE));
-       qlcnic_clear_quiscent_mode(adapter);
-       return -EIO;
-}
-
 /*Transit to RESET state from READY state only */
 static void
 qlcnic_dev_request_reset(struct qlcnic_adapter *adapter)
@@ -3573,9 +3520,12 @@ validate_esw_config(struct qlcnic_adapter *adapter,
                case QLCNIC_PORT_DEFAULTS:
                        if (QLC_DEV_GET_DRV(op_mode, pci_func) !=
                                                QLCNIC_NON_PRIV_FUNC) {
-                               esw_cfg[i].mac_anti_spoof = 0;
-                               esw_cfg[i].mac_override = 1;
-                               esw_cfg[i].promisc_mode = 1;
+                               if (esw_cfg[i].mac_anti_spoof != 0)
+                                       return QL_STATUS_INVALID_PARAM;
+                               if (esw_cfg[i].mac_override != 1)
+                                       return QL_STATUS_INVALID_PARAM;
+                               if (esw_cfg[i].promisc_mode != 1)
+                                       return QL_STATUS_INVALID_PARAM;
                        }
                        break;
                case QLCNIC_ADD_VLAN: