OSDN Git Service

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[uclinux-h8/linux.git] / drivers / net / ethernet / emulex / benet / be_cmds.c
index c5e1d0a..9eac322 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005 - 2014 Emulex
+ * Copyright (C) 2005 - 2015 Emulex
  * All rights reserved.
  *
  * This program is free software; you can redistribute it and/or
@@ -93,7 +93,7 @@ static void be_mcc_notify(struct be_adapter *adapter)
        struct be_queue_info *mccq = &adapter->mcc_obj.q;
        u32 val = 0;
 
-       if (be_error(adapter))
+       if (be_check_error(adapter, BE_ERROR_ANY))
                return;
 
        val |= mccq->id & DB_MCCQ_RING_ID_MASK;
@@ -140,6 +140,7 @@ static bool be_skip_err_log(u8 opcode, u16 base_status, u16 addl_status)
        if (base_status == MCC_STATUS_NOT_SUPPORTED ||
            base_status == MCC_STATUS_ILLEGAL_REQUEST ||
            addl_status == MCC_ADDL_STATUS_TOO_MANY_INTERFACES ||
+           addl_status == MCC_ADDL_STATUS_INSUFFICIENT_VLANS ||
            (opcode == OPCODE_COMMON_WRITE_FLASHROM &&
            (base_status == MCC_STATUS_ILLEGAL_FIELD ||
             addl_status == MCC_ADDL_STATUS_FLASH_IMAGE_CRC_MISMATCH)))
@@ -191,10 +192,12 @@ static void be_async_cmd_process(struct be_adapter *adapter,
                if (base_status == MCC_STATUS_SUCCESS) {
                        struct be_cmd_resp_get_cntl_addnl_attribs *resp =
                                                        (void *)resp_hdr;
-                       adapter->drv_stats.be_on_die_temperature =
+                       adapter->hwmon_info.be_on_die_temp =
                                                resp->on_die_temperature;
                } else {
                        adapter->be_get_temp_freq = 0;
+                       adapter->hwmon_info.be_on_die_temp =
+                                               BE_INVALID_DIE_TEMP;
                }
                return;
        }
@@ -330,6 +333,21 @@ static void be_async_grp5_pvid_state_process(struct be_adapter *adapter,
        }
 }
 
+#define MGMT_ENABLE_MASK       0x4
+static void be_async_grp5_fw_control_process(struct be_adapter *adapter,
+                                            struct be_mcc_compl *compl)
+{
+       struct be_async_fw_control *evt = (struct be_async_fw_control *)compl;
+       u32 evt_dw1 = le32_to_cpu(evt->event_data_word1);
+
+       if (evt_dw1 & MGMT_ENABLE_MASK) {
+               adapter->flags |= BE_FLAGS_OS2BMC;
+               adapter->bmc_filt_mask = le32_to_cpu(evt->event_data_word2);
+       } else {
+               adapter->flags &= ~BE_FLAGS_OS2BMC;
+       }
+}
+
 static void be_async_grp5_evt_process(struct be_adapter *adapter,
                                      struct be_mcc_compl *compl)
 {
@@ -346,6 +364,10 @@ static void be_async_grp5_evt_process(struct be_adapter *adapter,
        case ASYNC_EVENT_PVID_STATE:
                be_async_grp5_pvid_state_process(adapter, compl);
                break;
+       /* Async event to disable/enable os2bmc and/or mac-learning */
+       case ASYNC_EVENT_FW_CONTROL:
+               be_async_grp5_fw_control_process(adapter, compl);
+               break;
        default:
                break;
        }
@@ -486,7 +508,7 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
        struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
 
        for (i = 0; i < mcc_timeout; i++) {
-               if (be_error(adapter))
+               if (be_check_error(adapter, BE_ERROR_ANY))
                        return -EIO;
 
                local_bh_disable();
@@ -499,7 +521,7 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
        }
        if (i == mcc_timeout) {
                dev_err(&adapter->pdev->dev, "FW not responding\n");
-               adapter->fw_timeout = true;
+               be_set_error(adapter, BE_ERROR_FW);
                return -EIO;
        }
        return status;
@@ -538,7 +560,7 @@ static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db)
        u32 ready;
 
        do {
-               if (be_error(adapter))
+               if (be_check_error(adapter, BE_ERROR_ANY))
                        return -EIO;
 
                ready = ioread32(db);
@@ -551,7 +573,7 @@ static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db)
 
                if (msecs > 4000) {
                        dev_err(&adapter->pdev->dev, "FW not responding\n");
-                       adapter->fw_timeout = true;
+                       be_set_error(adapter, BE_ERROR_FW);
                        be_detect_error(adapter);
                        return -1;
                }
@@ -1457,7 +1479,7 @@ int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, u32 en_flags,
                *if_handle = le32_to_cpu(resp->interface_id);
 
                /* Hack to retrieve VF's pmac-id on BE3 */
-               if (BE3_chip(adapter) && !be_physfn(adapter))
+               if (BE3_chip(adapter) && be_virtfn(adapter))
                        adapter->pmac_id[0] = le32_to_cpu(resp->pmac_id);
        }
        return status;
@@ -3156,7 +3178,7 @@ int be_cmd_set_mac(struct be_adapter *adapter, u8 *mac, int if_id, u32 dom)
 }
 
 int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
-                         u32 domain, u16 intf_id, u16 hsw_mode)
+                         u32 domain, u16 intf_id, u16 hsw_mode, u8 spoofchk)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_set_hsw_config *req;
@@ -3192,6 +3214,14 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
                              ctxt, hsw_mode);
        }
 
+       /* Enable/disable both mac and vlan spoof checking */
+       if (!BEx_chip(adapter) && spoofchk) {
+               AMAP_SET_BITS(struct amap_set_hsw_context, mac_spoofchk,
+                             ctxt, spoofchk);
+               AMAP_SET_BITS(struct amap_set_hsw_context, vlan_spoofchk,
+                             ctxt, spoofchk);
+       }
+
        be_dws_cpu_to_le(req->context, sizeof(req->context));
        status = be_mcc_notify_wait(adapter);
 
@@ -3202,7 +3232,7 @@ err:
 
 /* Get Hyper switch config */
 int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
-                         u32 domain, u16 intf_id, u8 *mode)
+                         u32 domain, u16 intf_id, u8 *mode, bool *spoofchk)
 {
        struct be_mcc_wrb *wrb;
        struct be_cmd_req_get_hsw_config *req;
@@ -3250,6 +3280,10 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
                if (mode)
                        *mode = AMAP_GET_BITS(struct amap_get_hsw_resp_context,
                                              port_fwd_type, &resp->context);
+               if (spoofchk)
+                       *spoofchk =
+                               AMAP_GET_BITS(struct amap_get_hsw_resp_context,
+                                             spoofchk, &resp->context);
        }
 
 err:
@@ -3261,7 +3295,7 @@ static bool be_is_wol_excluded(struct be_adapter *adapter)
 {
        struct pci_dev *pdev = adapter->pdev;
 
-       if (!be_physfn(adapter))
+       if (be_virtfn(adapter))
                return true;
 
        switch (pdev->subsystem_device) {