|
@@ -114,57 +114,51 @@ static int qlcnic_validate_beacon(struct qlcnic_adapter *adapter, u16 beacon,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static ssize_t qlcnic_store_beacon(struct device *dev,
|
|
|
- struct device_attribute *attr,
|
|
|
- const char *buf, size_t len)
|
|
|
+static int qlcnic_83xx_store_beacon(struct qlcnic_adapter *adapter,
|
|
|
+ const char *buf, size_t len)
|
|
|
{
|
|
|
- struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
|
|
|
struct qlcnic_hardware_context *ahw = adapter->ahw;
|
|
|
- int err, max_sds_rings = adapter->max_sds_rings;
|
|
|
- u16 beacon;
|
|
|
- u8 b_state, b_rate;
|
|
|
unsigned long h_beacon;
|
|
|
+ int err;
|
|
|
|
|
|
- if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
|
|
|
- dev_warn(dev,
|
|
|
- "LED test not supported in non privileged mode\n");
|
|
|
- return -EOPNOTSUPP;
|
|
|
- }
|
|
|
+ if (test_bit(__QLCNIC_RESETTING, &adapter->state))
|
|
|
+ return -EIO;
|
|
|
|
|
|
- if (qlcnic_83xx_check(adapter) &&
|
|
|
- !test_bit(__QLCNIC_RESETTING, &adapter->state)) {
|
|
|
- if (kstrtoul(buf, 2, &h_beacon))
|
|
|
- return -EINVAL;
|
|
|
+ if (kstrtoul(buf, 2, &h_beacon))
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- if (ahw->beacon_state == h_beacon)
|
|
|
- return len;
|
|
|
+ if (ahw->beacon_state == h_beacon)
|
|
|
+ return len;
|
|
|
|
|
|
- rtnl_lock();
|
|
|
- if (!ahw->beacon_state) {
|
|
|
- if (test_and_set_bit(__QLCNIC_LED_ENABLE,
|
|
|
- &adapter->state)) {
|
|
|
- rtnl_unlock();
|
|
|
- return -EBUSY;
|
|
|
- }
|
|
|
- }
|
|
|
- if (h_beacon) {
|
|
|
- err = qlcnic_83xx_config_led(adapter, 1, h_beacon);
|
|
|
- if (err)
|
|
|
- goto beacon_err;
|
|
|
- } else {
|
|
|
- err = qlcnic_83xx_config_led(adapter, 0, !h_beacon);
|
|
|
- if (err)
|
|
|
- goto beacon_err;
|
|
|
+ rtnl_lock();
|
|
|
+ if (!ahw->beacon_state) {
|
|
|
+ if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) {
|
|
|
+ rtnl_unlock();
|
|
|
+ return -EBUSY;
|
|
|
}
|
|
|
- /* set the current beacon state */
|
|
|
+ }
|
|
|
+
|
|
|
+ if (h_beacon)
|
|
|
+ err = qlcnic_83xx_config_led(adapter, 1, h_beacon);
|
|
|
+ else
|
|
|
+ err = qlcnic_83xx_config_led(adapter, 0, !h_beacon);
|
|
|
+ if (!err)
|
|
|
ahw->beacon_state = h_beacon;
|
|
|
-beacon_err:
|
|
|
- if (!ahw->beacon_state)
|
|
|
- clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
|
|
|
|
|
|
- rtnl_unlock();
|
|
|
- return len;
|
|
|
- }
|
|
|
+ if (!ahw->beacon_state)
|
|
|
+ clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
|
|
|
+
|
|
|
+ rtnl_unlock();
|
|
|
+ return len;
|
|
|
+}
|
|
|
+
|
|
|
+static int qlcnic_82xx_store_beacon(struct qlcnic_adapter *adapter,
|
|
|
+ const char *buf, size_t len)
|
|
|
+{
|
|
|
+ struct qlcnic_hardware_context *ahw = adapter->ahw;
|
|
|
+ int err, max_sds_rings = adapter->max_sds_rings;
|
|
|
+ u16 beacon;
|
|
|
+ u8 h_beacon_state, b_state, b_rate;
|
|
|
|
|
|
if (len != sizeof(u16))
|
|
|
return QL_STATUS_INVALID_PARAM;
|
|
@@ -174,16 +168,29 @@ beacon_err:
|
|
|
if (err)
|
|
|
return err;
|
|
|
|
|
|
- if (adapter->ahw->beacon_state == b_state)
|
|
|
+ if ((ahw->capabilities2 & QLCNIC_FW_CAPABILITY_2_BEACON)) {
|
|
|
+ err = qlcnic_get_beacon_state(adapter, &h_beacon_state);
|
|
|
+ if (!err) {
|
|
|
+ dev_info(&adapter->pdev->dev,
|
|
|
+ "Failed to get current beacon state\n");
|
|
|
+ } else {
|
|
|
+ if (h_beacon_state == QLCNIC_BEACON_DISABLE)
|
|
|
+ ahw->beacon_state = 0;
|
|
|
+ else if (h_beacon_state == QLCNIC_BEACON_EANBLE)
|
|
|
+ ahw->beacon_state = 2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ahw->beacon_state == b_state)
|
|
|
return len;
|
|
|
|
|
|
rtnl_lock();
|
|
|
-
|
|
|
- if (!adapter->ahw->beacon_state)
|
|
|
+ if (!ahw->beacon_state) {
|
|
|
if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) {
|
|
|
rtnl_unlock();
|
|
|
return -EBUSY;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
|
|
|
err = -EIO;
|
|
@@ -206,14 +213,37 @@ beacon_err:
|
|
|
if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state))
|
|
|
qlcnic_diag_free_res(adapter->netdev, max_sds_rings);
|
|
|
|
|
|
- out:
|
|
|
- if (!adapter->ahw->beacon_state)
|
|
|
+out:
|
|
|
+ if (!ahw->beacon_state)
|
|
|
clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
|
|
|
rtnl_unlock();
|
|
|
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static ssize_t qlcnic_store_beacon(struct device *dev,
|
|
|
+ struct device_attribute *attr,
|
|
|
+ const char *buf, size_t len)
|
|
|
+{
|
|
|
+ struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
|
|
|
+ int err = 0;
|
|
|
+
|
|
|
+ if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
|
|
|
+ dev_warn(dev,
|
|
|
+ "LED test not supported in non privileged mode\n");
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (qlcnic_82xx_check(adapter))
|
|
|
+ err = qlcnic_82xx_store_beacon(adapter, buf, len);
|
|
|
+ else if (qlcnic_83xx_check(adapter))
|
|
|
+ err = qlcnic_83xx_store_beacon(adapter, buf, len);
|
|
|
+ else
|
|
|
+ return -EIO;
|
|
|
+
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
static ssize_t qlcnic_show_beacon(struct device *dev,
|
|
|
struct device_attribute *attr, char *buf)
|
|
|
{
|