mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-29 23:24:11 +08:00
qlcnic: Add support for 'set driver version' in 83XX
Issue 'set driver version' during driver load and after reset recovery to notify the driver version to the firmware. Signed-off-by: Pratik Pujar <pratik.pujar@qlogic.com> Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
db13178644
commit
8af3f33db0
@ -819,7 +819,7 @@ struct qlcnic_mac_list_s {
|
||||
|
||||
#define QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG BIT_2
|
||||
#define QLCNIC_FW_CAP2_HW_LRO_IPV6 BIT_3
|
||||
#define QLCNIC_FW_CAPABILITY_2_OCBB BIT_5
|
||||
#define QLCNIC_FW_CAPABILITY_SET_DRV_VER BIT_5
|
||||
#define QLCNIC_FW_CAPABILITY_2_BEACON BIT_7
|
||||
|
||||
/* module types */
|
||||
@ -1476,7 +1476,7 @@ int qlcnic_nic_del_mac(struct qlcnic_adapter *, const u8 *);
|
||||
void qlcnic_82xx_free_mac_list(struct qlcnic_adapter *adapter);
|
||||
|
||||
int qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu);
|
||||
int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *);
|
||||
int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *, u32);
|
||||
int qlcnic_change_mtu(struct net_device *netdev, int new_mtu);
|
||||
netdev_features_t qlcnic_fix_features(struct net_device *netdev,
|
||||
netdev_features_t features);
|
||||
@ -1500,6 +1500,7 @@ int qlcnic_validate_max_rss(struct qlcnic_adapter *, __u32);
|
||||
void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter);
|
||||
void qlcnic_82xx_set_mac_filter_count(struct qlcnic_adapter *);
|
||||
int qlcnic_enable_msix(struct qlcnic_adapter *, u32);
|
||||
void qlcnic_set_drv_version(struct qlcnic_adapter *);
|
||||
|
||||
/* eSwitch management functions */
|
||||
int qlcnic_config_switch_port(struct qlcnic_adapter *,
|
||||
|
@ -63,6 +63,7 @@ static const struct qlcnic_mailbox_metadata qlcnic_83xx_mbx_tbl[] = {
|
||||
{QLCNIC_CMD_STOP_NIC_FUNC, 2, 1},
|
||||
{QLCNIC_CMD_SET_LED_CONFIG, 5, 1},
|
||||
{QLCNIC_CMD_GET_LED_CONFIG, 1, 5},
|
||||
{QLCNIC_CMD_83XX_SET_DRV_VER, 4, 1},
|
||||
{QLCNIC_CMD_ADD_RCV_RINGS, 130, 26},
|
||||
{QLCNIC_CMD_CONFIG_VPORT, 4, 4},
|
||||
{QLCNIC_CMD_BC_EVENT_SETUP, 2, 1},
|
||||
@ -2186,16 +2187,17 @@ int qlcnic_83xx_get_nic_info(struct qlcnic_adapter *adapter,
|
||||
u32 temp;
|
||||
u8 op = 0;
|
||||
struct qlcnic_cmd_args cmd;
|
||||
struct qlcnic_hardware_context *ahw = adapter->ahw;
|
||||
|
||||
err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (func_id != adapter->ahw->pci_func) {
|
||||
if (func_id != ahw->pci_func) {
|
||||
temp = func_id << 16;
|
||||
cmd.req.arg[1] = op | BIT_31 | temp;
|
||||
} else {
|
||||
cmd.req.arg[1] = adapter->ahw->pci_func << 16;
|
||||
cmd.req.arg[1] = ahw->pci_func << 16;
|
||||
}
|
||||
err = qlcnic_issue_cmd(adapter, &cmd);
|
||||
if (err) {
|
||||
@ -2222,6 +2224,9 @@ int qlcnic_83xx_get_nic_info(struct qlcnic_adapter *adapter,
|
||||
temp = (cmd.rsp.arg[8] & 0x7FFE0000) >> 17;
|
||||
npar_info->max_linkspeed_reg_offset = temp;
|
||||
}
|
||||
if (npar_info->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS)
|
||||
memcpy(ahw->extra_capability, &cmd.rsp.arg[16],
|
||||
sizeof(ahw->extra_capability));
|
||||
|
||||
out:
|
||||
qlcnic_free_mbx_args(&cmd);
|
||||
|
@ -629,6 +629,7 @@ static int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
qlcnic_set_drv_version(adapter);
|
||||
qlcnic_83xx_idc_attach_driver(adapter);
|
||||
|
||||
return 0;
|
||||
|
@ -36,7 +36,7 @@ static const struct qlcnic_mailbox_metadata qlcnic_mbx_tbl[] = {
|
||||
{QLCNIC_CMD_CONFIG_PORT, 4, 1},
|
||||
{QLCNIC_CMD_TEMP_SIZE, 4, 4},
|
||||
{QLCNIC_CMD_GET_TEMP_HDR, 4, 1},
|
||||
{QLCNIC_CMD_SET_DRV_VER, 4, 1},
|
||||
{QLCNIC_CMD_82XX_SET_DRV_VER, 4, 1},
|
||||
{QLCNIC_CMD_GET_LED_STATUS, 4, 2},
|
||||
};
|
||||
|
||||
@ -182,7 +182,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
|
||||
return cmd->rsp.arg[0];
|
||||
}
|
||||
|
||||
int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter)
|
||||
int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter, u32 fw_cmd)
|
||||
{
|
||||
struct qlcnic_cmd_args cmd;
|
||||
u32 arg1, arg2, arg3;
|
||||
@ -194,7 +194,7 @@ int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter)
|
||||
_QLCNIC_LINUX_MAJOR, _QLCNIC_LINUX_MINOR,
|
||||
_QLCNIC_LINUX_SUBVERSION);
|
||||
|
||||
err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_DRV_VER);
|
||||
err = qlcnic_alloc_mbx_args(&cmd, adapter, fw_cmd);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -86,7 +86,7 @@ enum qlcnic_regs {
|
||||
#define QLCNIC_CMD_BC_EVENT_SETUP 0x31
|
||||
#define QLCNIC_CMD_CONFIG_VPORT 0x32
|
||||
#define QLCNIC_CMD_GET_MAC_STATS 0x37
|
||||
#define QLCNIC_CMD_SET_DRV_VER 0x38
|
||||
#define QLCNIC_CMD_82XX_SET_DRV_VER 0x38
|
||||
#define QLCNIC_CMD_GET_LED_STATUS 0x3C
|
||||
#define QLCNIC_CMD_CONFIGURE_RSS 0x41
|
||||
#define QLCNIC_CMD_CONFIG_INTR_COAL 0x43
|
||||
@ -103,6 +103,7 @@ enum qlcnic_regs {
|
||||
#define QLCNIC_CMD_GET_LINK_STATUS 0x68
|
||||
#define QLCNIC_CMD_SET_LED_CONFIG 0x69
|
||||
#define QLCNIC_CMD_GET_LED_CONFIG 0x6A
|
||||
#define QLCNIC_CMD_83XX_SET_DRV_VER 0x6F
|
||||
#define QLCNIC_CMD_ADD_RCV_RINGS 0x0B
|
||||
|
||||
#define QLCNIC_INTRPT_INTX 1
|
||||
|
@ -1985,6 +1985,21 @@ int qlcnic_alloc_tx_rings(struct qlcnic_adapter *adapter,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void qlcnic_set_drv_version(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
struct qlcnic_hardware_context *ahw = adapter->ahw;
|
||||
u32 fw_cmd = 0;
|
||||
|
||||
if (qlcnic_82xx_check(adapter))
|
||||
fw_cmd = QLCNIC_CMD_82XX_SET_DRV_VER;
|
||||
else if (qlcnic_83xx_check(adapter))
|
||||
fw_cmd = QLCNIC_CMD_83XX_SET_DRV_VER;
|
||||
|
||||
if ((ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) &&
|
||||
(ahw->extra_capability[0] & QLCNIC_FW_CAPABILITY_SET_DRV_VER))
|
||||
qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd);
|
||||
}
|
||||
|
||||
static int
|
||||
qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
@ -1992,7 +2007,6 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
struct qlcnic_adapter *adapter = NULL;
|
||||
struct qlcnic_hardware_context *ahw;
|
||||
int err, pci_using_dac = -1;
|
||||
u32 capab2;
|
||||
char board_name[QLCNIC_MAX_BOARD_NAME_LEN + 19]; /* MAC + ": " + name */
|
||||
|
||||
if (pdev->is_virtfn)
|
||||
@ -2147,13 +2161,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (err)
|
||||
goto err_out_disable_mbx_intr;
|
||||
|
||||
if (qlcnic_82xx_check(adapter)) {
|
||||
if (ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
|
||||
capab2 = QLCRD32(adapter, CRB_FW_CAPABILITIES_2);
|
||||
if (capab2 & QLCNIC_FW_CAPABILITY_2_OCBB)
|
||||
qlcnic_fw_cmd_set_drv_version(adapter);
|
||||
}
|
||||
}
|
||||
qlcnic_set_drv_version(adapter);
|
||||
|
||||
pci_set_drvdata(pdev, adapter);
|
||||
|
||||
@ -3124,6 +3132,7 @@ done:
|
||||
adapter->fw_fail_cnt = 0;
|
||||
adapter->flags &= ~QLCNIC_FW_HANG;
|
||||
clear_bit(__QLCNIC_RESETTING, &adapter->state);
|
||||
qlcnic_set_drv_version(adapter);
|
||||
|
||||
if (!qlcnic_clr_drv_state(adapter))
|
||||
qlcnic_schedule_work(adapter, qlcnic_fw_poll_work,
|
||||
|
Loading…
Reference in New Issue
Block a user