示例#1
0
static int
qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val)
{
    int ret = 0;
    struct qlcnic_adapter *adapter = netdev_priv(netdev);
    struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;

    switch (val->flag) {
    case QLCNIC_FORCE_FW_DUMP_KEY:
        if (!fw_dump->enable) {
            netdev_info(netdev, "FW dump not enabled\n");
            return ret;
        }
        if (fw_dump->clr) {
            dev_info(&adapter->pdev->dev,
                     "Previous dump not cleared, not forcing dump\n");
            return ret;
        }
        netdev_info(netdev, "Forcing a FW dump\n");
        qlcnic_dev_request_reset(adapter);
        break;
    case QLCNIC_DISABLE_FW_DUMP:
        if (fw_dump->enable) {
            netdev_info(netdev, "Disabling FW dump\n");
            fw_dump->enable = 0;
        }
        break;
    case QLCNIC_ENABLE_FW_DUMP:
        if (!fw_dump->enable && fw_dump->tmpl_hdr) {
            netdev_info(netdev, "Enabling FW dump\n");
            fw_dump->enable = 1;
        }
        break;
    case QLCNIC_FORCE_FW_RESET:
        netdev_info(netdev, "Forcing a FW reset\n");
        qlcnic_dev_request_reset(adapter);
        adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
        break;
    default:
        if (val->flag > QLCNIC_DUMP_MASK_MAX ||
                val->flag < QLCNIC_DUMP_MASK_MIN) {
            netdev_info(netdev,
                        "Invalid dump level: 0x%x\n", val->flag);
            ret = -EINVAL;
            goto out;
        }
        fw_dump->tmpl_hdr->drv_cap_mask = val->flag & 0xff;
        netdev_info(netdev, "Driver mask changed to: 0x%x\n",
                    fw_dump->tmpl_hdr->drv_cap_mask);
    }
out:
    return ret;
}
示例#2
0
static int
qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val)
{
	int ret = 0;
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;

	if (val->flag == QLCNIC_FORCE_FW_DUMP_KEY) {
		netdev_info(netdev, "Forcing a FW dump\n");
		qlcnic_dev_request_reset(adapter);
	} else {
		if (val->flag > QLCNIC_DUMP_MASK_MAX ||
			val->flag < QLCNIC_DUMP_MASK_MIN) {
				netdev_info(netdev,
				"Invalid dump level: 0x%x\n", val->flag);
				ret = -EINVAL;
				goto out;
		}
		if (qlcnic_api_lock(adapter))
			return -EIO;
		fw_dump->tmpl_hdr->drv_cap_mask = val->flag & 0xff;
		qlcnic_api_unlock(adapter);
		netdev_info(netdev, "Driver mask changed to: 0x%x\n",
			fw_dump->tmpl_hdr->drv_cap_mask);
	}
out:
	return ret;
}
static int
qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val)
{
	int i;
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
	u32 state;

	switch (val->flag) {
	case QLCNIC_FORCE_FW_DUMP_KEY:
		if (!fw_dump->tmpl_hdr) {
			netdev_err(netdev, "FW dump not supported\n");
			return -ENOTSUPP;
		}
		if (!fw_dump->enable) {
			netdev_info(netdev, "FW dump not enabled\n");
			return 0;
		}
		if (fw_dump->clr) {
			netdev_info(netdev,
			"Previous dump not cleared, not forcing dump\n");
			return 0;
		}
		netdev_info(netdev, "Forcing a FW dump\n");
		qlcnic_dev_request_reset(adapter, val->flag);
		break;
	case QLCNIC_DISABLE_FW_DUMP:
		if (fw_dump->enable && fw_dump->tmpl_hdr) {
			netdev_info(netdev, "Disabling FW dump\n");
			fw_dump->enable = 0;
		}
		return 0;
	case QLCNIC_ENABLE_FW_DUMP:
		if (!fw_dump->tmpl_hdr) {
			netdev_err(netdev, "FW dump not supported\n");
			return -ENOTSUPP;
		}
		if (!fw_dump->enable) {
			netdev_info(netdev, "Enabling FW dump\n");
			fw_dump->enable = 1;
		}
		return 0;
	case QLCNIC_FORCE_FW_RESET:
		netdev_info(netdev, "Forcing a FW reset\n");
		qlcnic_dev_request_reset(adapter, val->flag);
		adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
		return 0;
	case QLCNIC_SET_QUIESCENT:
	case QLCNIC_RESET_QUIESCENT:
		state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE);
		if (state == QLCNIC_DEV_FAILED || (state == QLCNIC_DEV_BADBAD))
			netdev_info(netdev, "Device in FAILED state\n");
		return 0;
	default:
		if (!fw_dump->tmpl_hdr) {
			netdev_err(netdev, "FW dump not supported\n");
			return -ENOTSUPP;
		}
		for (i = 0; i < ARRAY_SIZE(qlcnic_fw_dump_level); i++) {
			if (val->flag == qlcnic_fw_dump_level[i]) {
				fw_dump->tmpl_hdr->drv_cap_mask =
							val->flag;
				netdev_info(netdev, "Driver mask changed to: 0x%x\n",
					fw_dump->tmpl_hdr->drv_cap_mask);
				return 0;
			}
		}
		netdev_info(netdev, "Invalid dump level: 0x%x\n", val->flag);
		return -EINVAL;
	}
	return 0;
}