Skip to content

Commit 6e2842f

Browse files
committed
Merge branch 'qlcnic'
Shahed Shaikh says: ==================== This patch series includes following changes: * Support for spoof check configuration per VF using iproute2 tool. * Set HW mask for 8300 adapter in INT-x mode to stop generating interrupts. * Updated IRQ name for 8200 and 8300 Series adapter as per format used by other multiqueue drivers. * Remove qlcnic_config_npars module parameter. * Initialize trans_work and idc_aen_work at VF probe. * Convert netsted if-else into switch-case statement. * Change in diagnostics routine. * Modify reset recovery path in diag mode by providing diagnostics routines enough time to unwind before proceeding with reset recovery. * Implement GET_LED_STATUS command for 82xx adapter and refactor qlcnic_store_beacon() to split 8200 and 8300 specific calls. * Some cleanup and log enhancements ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents f2068b8 + 6a531b7 commit 6e2842f

File tree

13 files changed

+324
-168
lines changed

13 files changed

+324
-168
lines changed

drivers/net/ethernet/qlogic/qlcnic/qlcnic.h

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838

3939
#define _QLCNIC_LINUX_MAJOR 5
4040
#define _QLCNIC_LINUX_MINOR 2
41-
#define _QLCNIC_LINUX_SUBVERSION 42
42-
#define QLCNIC_LINUX_VERSIONID "5.2.42"
41+
#define _QLCNIC_LINUX_SUBVERSION 43
42+
#define QLCNIC_LINUX_VERSIONID "5.2.43"
4343
#define QLCNIC_DRV_IDC_VER 0x01
4444
#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
4545
(_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
@@ -303,7 +303,6 @@ extern int qlcnic_use_msi;
303303
extern int qlcnic_use_msi_x;
304304
extern int qlcnic_auto_fw_reset;
305305
extern int qlcnic_load_fw_file;
306-
extern int qlcnic_config_npars;
307306

308307
/* Number of status descriptors to handle per interrupt */
309308
#define MAX_STATUS_HANDLE (64)
@@ -443,6 +442,7 @@ struct qlcnic_hardware_context {
443442
u16 max_mtu;
444443
u32 msg_enable;
445444
u16 act_pci_func;
445+
u16 max_pci_func;
446446

447447
u32 capabilities;
448448
u32 capabilities2;
@@ -816,6 +816,7 @@ struct qlcnic_mac_list_s {
816816
#define QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG BIT_2
817817
#define QLCNIC_FW_CAP2_HW_LRO_IPV6 BIT_3
818818
#define QLCNIC_FW_CAPABILITY_2_OCBB BIT_5
819+
#define QLCNIC_FW_CAPABILITY_2_BEACON BIT_7
819820

820821
/* module types */
821822
#define LINKEVENT_MODULE_NOT_PRESENT 1
@@ -913,6 +914,9 @@ struct qlcnic_ipaddr {
913914
#define QLCNIC_IS_TSO_CAPABLE(adapter) \
914915
((adapter)->ahw->capabilities & QLCNIC_FW_CAPABILITY_TSO)
915916

917+
#define QLCNIC_BEACON_EANBLE 0xC
918+
#define QLCNIC_BEACON_DISABLE 0xD
919+
916920
#define QLCNIC_DEF_NUM_STS_DESC_RINGS 4
917921
#define QLCNIC_MSIX_TBL_SPACE 8192
918922
#define QLCNIC_PCI_REG_MSIX_TBL 0x44
@@ -932,6 +936,7 @@ struct qlcnic_ipaddr {
932936
#define __QLCNIC_SRIOV_ENABLE 10
933937
#define __QLCNIC_SRIOV_CAPABLE 11
934938
#define __QLCNIC_MBX_POLL_ENABLE 12
939+
#define __QLCNIC_DIAG_MODE 13
935940

936941
#define QLCNIC_INTERRUPT_TEST 1
937942
#define QLCNIC_LOOPBACK_TEST 2
@@ -1543,6 +1548,7 @@ int qlcnic_set_default_offload_settings(struct qlcnic_adapter *);
15431548
int qlcnic_reset_npar_config(struct qlcnic_adapter *);
15441549
int qlcnic_set_eswitch_port_config(struct qlcnic_adapter *);
15451550
void qlcnic_add_lb_filter(struct qlcnic_adapter *, struct sk_buff *, int, u16);
1551+
int qlcnic_get_beacon_state(struct qlcnic_adapter *, u8 *);
15461552
int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter);
15471553
int qlcnic_read_mac_addr(struct qlcnic_adapter *);
15481554
int qlcnic_setup_netdev(struct qlcnic_adapter *, struct net_device *, int);
@@ -1886,6 +1892,21 @@ static inline void qlcnic_enable_int(struct qlcnic_host_sds_ring *sds_ring)
18861892
writel(0xfbff, adapter->tgt_mask_reg);
18871893
}
18881894

1895+
static inline int qlcnic_get_diag_lock(struct qlcnic_adapter *adapter)
1896+
{
1897+
return test_and_set_bit(__QLCNIC_DIAG_MODE, &adapter->state);
1898+
}
1899+
1900+
static inline void qlcnic_release_diag_lock(struct qlcnic_adapter *adapter)
1901+
{
1902+
clear_bit(__QLCNIC_DIAG_MODE, &adapter->state);
1903+
}
1904+
1905+
static inline int qlcnic_check_diag_status(struct qlcnic_adapter *adapter)
1906+
{
1907+
return test_bit(__QLCNIC_DIAG_MODE, &adapter->state);
1908+
}
1909+
18891910
extern const struct ethtool_ops qlcnic_sriov_vf_ethtool_ops;
18901911
extern const struct ethtool_ops qlcnic_ethtool_ops;
18911912
extern const struct ethtool_ops qlcnic_ethtool_failed_ops;

drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,11 @@ inline void qlcnic_83xx_clear_legacy_intr_mask(struct qlcnic_adapter *adapter)
312312
writel(0, adapter->tgt_mask_reg);
313313
}
314314

315+
inline void qlcnic_83xx_set_legacy_intr_mask(struct qlcnic_adapter *adapter)
316+
{
317+
writel(1, adapter->tgt_mask_reg);
318+
}
319+
315320
/* Enable MSI-x and INT-x interrupts */
316321
void qlcnic_83xx_enable_intr(struct qlcnic_adapter *adapter,
317322
struct qlcnic_host_sds_ring *sds_ring)
@@ -458,6 +463,9 @@ void qlcnic_83xx_free_mbx_intr(struct qlcnic_adapter *adapter)
458463
{
459464
u32 num_msix;
460465

466+
if (!(adapter->flags & QLCNIC_MSIX_ENABLED))
467+
qlcnic_83xx_set_legacy_intr_mask(adapter);
468+
461469
qlcnic_83xx_disable_mbx_intr(adapter);
462470

463471
if (adapter->flags & QLCNIC_MSIX_ENABLED)
@@ -474,7 +482,6 @@ int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter)
474482
{
475483
irq_handler_t handler;
476484
u32 val;
477-
char name[32];
478485
int err = 0;
479486
unsigned long flags = 0;
480487

@@ -485,9 +492,7 @@ int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter)
485492
if (adapter->flags & QLCNIC_MSIX_ENABLED) {
486493
handler = qlcnic_83xx_handle_aen;
487494
val = adapter->msix_entries[adapter->ahw->num_msix - 1].vector;
488-
snprintf(name, (IFNAMSIZ + 4),
489-
"%s[%s]", "qlcnic", "aen");
490-
err = request_irq(val, handler, flags, name, adapter);
495+
err = request_irq(val, handler, flags, "qlcnic-MB", adapter);
491496
if (err) {
492497
dev_err(&adapter->pdev->dev,
493498
"failed to register MBX interrupt\n");
@@ -1588,16 +1593,24 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)
15881593
struct qlcnic_hardware_context *ahw = adapter->ahw;
15891594
int ret = 0, loop = 0, max_sds_rings = adapter->max_sds_rings;
15901595

1591-
QLCDB(adapter, DRV, "%s loopback test in progress\n",
1592-
mode == QLCNIC_ILB_MODE ? "internal" : "external");
15931596
if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
1594-
dev_warn(&adapter->pdev->dev,
1595-
"Loopback test not supported for non privilege function\n");
1597+
netdev_warn(netdev,
1598+
"Loopback test not supported in non privileged mode\n");
15961599
return ret;
15971600
}
15981601

1599-
if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
1602+
if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
1603+
netdev_info(netdev, "Device is resetting\n");
16001604
return -EBUSY;
1605+
}
1606+
1607+
if (qlcnic_get_diag_lock(adapter)) {
1608+
netdev_info(netdev, "Device is in diagnostics mode\n");
1609+
return -EBUSY;
1610+
}
1611+
1612+
netdev_info(netdev, "%s loopback test in progress\n",
1613+
mode == QLCNIC_ILB_MODE ? "internal" : "external");
16011614

16021615
ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST,
16031616
max_sds_rings);
@@ -1638,7 +1651,7 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)
16381651

16391652
fail_diag_alloc:
16401653
adapter->max_sds_rings = max_sds_rings;
1641-
clear_bit(__QLCNIC_RESETTING, &adapter->state);
1654+
qlcnic_release_diag_lock(adapter);
16421655
return ret;
16431656
}
16441657

@@ -2121,26 +2134,25 @@ int qlcnic_83xx_get_nic_info(struct qlcnic_adapter *adapter,
21212134
int qlcnic_83xx_get_pci_info(struct qlcnic_adapter *adapter,
21222135
struct qlcnic_pci_info *pci_info)
21232136
{
2137+
struct qlcnic_hardware_context *ahw = adapter->ahw;
2138+
struct device *dev = &adapter->pdev->dev;
2139+
struct qlcnic_cmd_args cmd;
21242140
int i, err = 0, j = 0;
21252141
u32 temp;
2126-
struct qlcnic_cmd_args cmd;
21272142

21282143
qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PCI_INFO);
21292144
err = qlcnic_issue_cmd(adapter, &cmd);
21302145

2131-
adapter->ahw->act_pci_func = 0;
2146+
ahw->act_pci_func = 0;
21322147
if (err == QLCNIC_RCODE_SUCCESS) {
2133-
pci_info->func_count = cmd.rsp.arg[1] & 0xFF;
2134-
dev_info(&adapter->pdev->dev,
2135-
"%s: total functions = %d\n",
2136-
__func__, pci_info->func_count);
2148+
ahw->max_pci_func = cmd.rsp.arg[1] & 0xFF;
21372149
for (i = 2, j = 0; j < QLCNIC_MAX_PCI_FUNC; j++, pci_info++) {
21382150
pci_info->id = cmd.rsp.arg[i] & 0xFFFF;
21392151
pci_info->active = (cmd.rsp.arg[i] & 0xFFFF0000) >> 16;
21402152
i++;
21412153
pci_info->type = cmd.rsp.arg[i] & 0xFFFF;
21422154
if (pci_info->type == QLCNIC_TYPE_NIC)
2143-
adapter->ahw->act_pci_func++;
2155+
ahw->act_pci_func++;
21442156
temp = (cmd.rsp.arg[i] & 0xFFFF0000) >> 16;
21452157
pci_info->default_port = temp;
21462158
i++;
@@ -2152,18 +2164,21 @@ int qlcnic_83xx_get_pci_info(struct qlcnic_adapter *adapter,
21522164
i++;
21532165
memcpy(pci_info->mac + sizeof(u32), &cmd.rsp.arg[i], 2);
21542166
i = i + 3;
2155-
2156-
dev_info(&adapter->pdev->dev, "%s:\n"
2157-
"\tid = %d active = %d type = %d\n"
2158-
"\tport = %d min bw = %d max bw = %d\n"
2159-
"\tmac_addr = %pM\n", __func__,
2160-
pci_info->id, pci_info->active, pci_info->type,
2161-
pci_info->default_port, pci_info->tx_min_bw,
2162-
pci_info->tx_max_bw, pci_info->mac);
2167+
if (ahw->op_mode == QLCNIC_MGMT_FUNC)
2168+
dev_info(dev, "id = %d active = %d type = %d\n"
2169+
"\tport = %d min bw = %d max bw = %d\n"
2170+
"\tmac_addr = %pM\n", pci_info->id,
2171+
pci_info->active, pci_info->type,
2172+
pci_info->default_port,
2173+
pci_info->tx_min_bw,
2174+
pci_info->tx_max_bw, pci_info->mac);
21632175
}
2176+
if (ahw->op_mode == QLCNIC_MGMT_FUNC)
2177+
dev_info(dev, "Max vNIC functions = %d, active vNIC functions = %d\n",
2178+
ahw->max_pci_func, ahw->act_pci_func);
2179+
21642180
} else {
2165-
dev_err(&adapter->pdev->dev, "Failed to get PCI Info%d\n",
2166-
err);
2181+
dev_err(dev, "Failed to get PCI Info, error = %d\n", err);
21672182
err = -EIO;
21682183
}
21692184

@@ -3113,8 +3128,10 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev)
31133128
u8 val;
31143129
int ret, max_sds_rings = adapter->max_sds_rings;
31153130

3116-
if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
3117-
return -EIO;
3131+
if (qlcnic_get_diag_lock(adapter)) {
3132+
netdev_info(netdev, "Device in diagnostics mode\n");
3133+
return -EBUSY;
3134+
}
31183135

31193136
ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST,
31203137
max_sds_rings);
@@ -3156,7 +3173,7 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev)
31563173

31573174
fail_diag_irq:
31583175
adapter->max_sds_rings = max_sds_rings;
3159-
clear_bit(__QLCNIC_RESETTING, &adapter->state);
3176+
qlcnic_release_diag_lock(adapter);
31603177
return ret;
31613178
}
31623179

drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ struct qlc_83xx_idc {
314314
u8 vnic_state;
315315
u8 vnic_wait_limit;
316316
u8 quiesce_req;
317+
u8 delay_reset;
317318
char **name;
318319
};
319320

drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,7 @@ static void qlcnic_83xx_idc_update_idc_params(struct qlcnic_adapter *adapter)
649649
ahw->idc.collect_dump = 0;
650650
ahw->reset_context = 0;
651651
adapter->tx_timeo_cnt = 0;
652+
ahw->idc.delay_reset = 0;
652653

653654
clear_bit(__QLCNIC_RESETTING, &adapter->state);
654655
}
@@ -883,21 +884,41 @@ static int qlcnic_83xx_idc_need_reset_state(struct qlcnic_adapter *adapter)
883884
int ret = 0;
884885

885886
if (adapter->ahw->idc.prev_state != QLC_83XX_IDC_DEV_NEED_RESET) {
886-
qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
887887
qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
888888
set_bit(__QLCNIC_RESETTING, &adapter->state);
889889
clear_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status);
890890
if (adapter->ahw->nic_mode == QLC_83XX_VIRTUAL_NIC_MODE)
891891
qlcnic_83xx_disable_vnic_mode(adapter, 1);
892-
qlcnic_83xx_idc_detach_driver(adapter);
892+
893+
if (qlcnic_check_diag_status(adapter)) {
894+
dev_info(&adapter->pdev->dev,
895+
"%s: Wait for diag completion\n", __func__);
896+
adapter->ahw->idc.delay_reset = 1;
897+
return 0;
898+
} else {
899+
qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
900+
qlcnic_83xx_idc_detach_driver(adapter);
901+
}
893902
}
894903

895-
/* Check ACK from other functions */
896-
ret = qlcnic_83xx_idc_check_reset_ack_reg(adapter);
897-
if (ret) {
904+
if (qlcnic_check_diag_status(adapter)) {
898905
dev_info(&adapter->pdev->dev,
899-
"%s: Waiting for reset ACK\n", __func__);
900-
return 0;
906+
"%s: Wait for diag completion\n", __func__);
907+
return -1;
908+
} else {
909+
if (adapter->ahw->idc.delay_reset) {
910+
qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
911+
qlcnic_83xx_idc_detach_driver(adapter);
912+
adapter->ahw->idc.delay_reset = 0;
913+
}
914+
915+
/* Check for ACK from other functions */
916+
ret = qlcnic_83xx_idc_check_reset_ack_reg(adapter);
917+
if (ret) {
918+
dev_info(&adapter->pdev->dev,
919+
"%s: Waiting for reset ACK\n", __func__);
920+
return -1;
921+
}
901922
}
902923

903924
/* Transit to INIT state and restart the HW */

drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,18 @@ int qlcnic_83xx_disable_vnic_mode(struct qlcnic_adapter *adapter, int lock)
4242
static int qlcnic_83xx_set_vnic_opmode(struct qlcnic_adapter *adapter)
4343
{
4444
u8 id;
45-
int i, ret = -EBUSY;
45+
int ret = -EBUSY;
4646
u32 data = QLCNIC_MGMT_FUNC;
4747
struct qlcnic_hardware_context *ahw = adapter->ahw;
4848

4949
if (qlcnic_83xx_lock_driver(adapter))
5050
return ret;
5151

52-
if (qlcnic_config_npars) {
53-
for (i = 0; i < ahw->act_pci_func; i++) {
54-
id = adapter->npars[i].pci_func;
55-
if (id == ahw->pci_func)
56-
continue;
57-
data |= qlcnic_config_npars &
58-
QLC_83XX_SET_FUNC_OPMODE(0x3, id);
59-
}
60-
} else {
61-
data = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE);
62-
data = (data & ~QLC_83XX_SET_FUNC_OPMODE(0x3, ahw->pci_func)) |
63-
QLC_83XX_SET_FUNC_OPMODE(QLCNIC_MGMT_FUNC,
64-
ahw->pci_func);
65-
}
52+
id = ahw->pci_func;
53+
data = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE);
54+
data = (data & ~QLC_83XX_SET_FUNC_OPMODE(0x3, id)) |
55+
QLC_83XX_SET_FUNC_OPMODE(QLCNIC_MGMT_FUNC, id);
56+
6657
QLCWRX(adapter->ahw, QLC_83XX_DRV_OP_MODE, data);
6758

6859
qlcnic_83xx_unlock_driver(adapter);
@@ -196,20 +187,24 @@ int qlcnic_83xx_config_vnic_opmode(struct qlcnic_adapter *adapter)
196187
else
197188
priv_level = QLC_83XX_GET_FUNC_PRIVILEGE(op_mode,
198189
ahw->pci_func);
199-
200-
if (priv_level == QLCNIC_NON_PRIV_FUNC) {
190+
switch (priv_level) {
191+
case QLCNIC_NON_PRIV_FUNC:
201192
ahw->op_mode = QLCNIC_NON_PRIV_FUNC;
202193
ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
203194
nic_ops->init_driver = qlcnic_83xx_init_non_privileged_vnic;
204-
} else if (priv_level == QLCNIC_PRIV_FUNC) {
195+
break;
196+
case QLCNIC_PRIV_FUNC:
205197
ahw->op_mode = QLCNIC_PRIV_FUNC;
206198
ahw->idc.state_entry = qlcnic_83xx_idc_vnic_pf_entry;
207199
nic_ops->init_driver = qlcnic_83xx_init_privileged_vnic;
208-
} else if (priv_level == QLCNIC_MGMT_FUNC) {
200+
break;
201+
case QLCNIC_MGMT_FUNC:
209202
ahw->op_mode = QLCNIC_MGMT_FUNC;
210203
ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
211204
nic_ops->init_driver = qlcnic_83xx_init_mgmt_vnic;
212-
} else {
205+
break;
206+
default:
207+
dev_err(&adapter->pdev->dev, "Invalid Virtual NIC opmode\n");
213208
return -EIO;
214209
}
215210

@@ -218,8 +213,8 @@ int qlcnic_83xx_config_vnic_opmode(struct qlcnic_adapter *adapter)
218213
else
219214
adapter->flags &= ~QLCNIC_ESWITCH_ENABLED;
220215

221-
adapter->ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER;
222-
adapter->ahw->idc.vnic_wait_limit = QLCNIC_DEV_NPAR_OPER_TIMEO;
216+
ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER;
217+
ahw->idc.vnic_wait_limit = QLCNIC_DEV_NPAR_OPER_TIMEO;
223218

224219
return 0;
225220
}

0 commit comments

Comments
 (0)