Skip to content

Commit fc48b7a

Browse files
Yuval Mintzdavem330
authored andcommitted
qed/qede: use 8.7.3.0 FW.
This patch moves the qed* driver into utilizing the 8.7.3.0 FW. This new FW is required for a lot of new SW features, including: - Vlan filtering offload - Encapsulation offload support - HW ingress aggregations As well as paving the way for the possibility of adding storage protocols in the future. V2: - Fix kbuild test robot error/warnings. Signed-off-by: Yuval Mintz <[email protected]> Signed-off-by: Sudarsana Reddy Kalluru <[email protected]> Signed-off-by: Manish Chopra <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7530e44 commit fc48b7a

File tree

17 files changed

+1795
-1770
lines changed

17 files changed

+1795
-1770
lines changed

drivers/net/ethernet/qlogic/qed/qed.h

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ struct qed_sb_sp_info;
7070
struct qed_mcp_info;
7171

7272
struct qed_rt_data {
73-
u32 init_val;
74-
bool b_valid;
73+
u32 *init_val;
74+
bool *b_valid;
7575
};
7676

7777
/* The PCI personality is not quite synonymous to protocol ID:
@@ -120,6 +120,10 @@ enum QED_PORT_MODE {
120120
QED_PORT_MODE_DE_1X25G
121121
};
122122

123+
enum qed_dev_cap {
124+
QED_DEV_CAP_ETH,
125+
};
126+
123127
struct qed_hw_info {
124128
/* PCI personality */
125129
enum qed_pci_personality personality;
@@ -151,6 +155,7 @@ struct qed_hw_info {
151155

152156
u32 port_mode;
153157
u32 hw_mode;
158+
unsigned long device_capabilities;
154159
};
155160

156161
struct qed_hw_cid_data {
@@ -267,7 +272,7 @@ struct qed_hwfn {
267272
struct qed_hw_info hw_info;
268273

269274
/* rt_array (for init-tool) */
270-
struct qed_rt_data *rt_data;
275+
struct qed_rt_data rt_data;
271276

272277
/* SPQ */
273278
struct qed_spq *p_spq;
@@ -350,9 +355,20 @@ struct qed_dev {
350355
char name[NAME_SIZE];
351356

352357
u8 type;
353-
#define QED_DEV_TYPE_BB_A0 (0 << 0)
354-
#define QED_DEV_TYPE_MASK (0x3)
355-
#define QED_DEV_TYPE_SHIFT (0)
358+
#define QED_DEV_TYPE_BB (0 << 0)
359+
#define QED_DEV_TYPE_AH BIT(0)
360+
/* Translate type/revision combo into the proper conditions */
361+
#define QED_IS_BB(dev) ((dev)->type == QED_DEV_TYPE_BB)
362+
#define QED_IS_BB_A0(dev) (QED_IS_BB(dev) && \
363+
CHIP_REV_IS_A0(dev))
364+
#define QED_IS_BB_B0(dev) (QED_IS_BB(dev) && \
365+
CHIP_REV_IS_B0(dev))
366+
367+
#define QED_GET_TYPE(dev) (QED_IS_BB_A0(dev) ? CHIP_BB_A0 : \
368+
QED_IS_BB_B0(dev) ? CHIP_BB_B0 : CHIP_K2)
369+
370+
u16 vendor_id;
371+
u16 device_id;
356372

357373
u16 chip_num;
358374
#define CHIP_NUM_MASK 0xffff
@@ -361,6 +377,8 @@ struct qed_dev {
361377
u16 chip_rev;
362378
#define CHIP_REV_MASK 0xf
363379
#define CHIP_REV_SHIFT 12
380+
#define CHIP_REV_IS_A0(_cdev) (!(_cdev)->chip_rev)
381+
#define CHIP_REV_IS_B0(_cdev) ((_cdev)->chip_rev == 1)
364382

365383
u16 chip_metal;
366384
#define CHIP_METAL_MASK 0xff
@@ -375,10 +393,10 @@ struct qed_dev {
375393
u8 num_funcs_in_port;
376394

377395
u8 path_id;
378-
enum mf_mode mf_mode;
379-
#define IS_MF(_p_hwfn) (((_p_hwfn)->cdev)->mf_mode != SF)
380-
#define IS_MF_SI(_p_hwfn) (((_p_hwfn)->cdev)->mf_mode == MF_NPAR)
381-
#define IS_MF_SD(_p_hwfn) (((_p_hwfn)->cdev)->mf_mode == MF_OVLAN)
396+
enum qed_mf_mode mf_mode;
397+
#define IS_MF_DEFAULT(_p_hwfn) (((_p_hwfn)->cdev)->mf_mode == QED_MF_DEFAULT)
398+
#define IS_MF_SI(_p_hwfn) (((_p_hwfn)->cdev)->mf_mode == QED_MF_NPAR)
399+
#define IS_MF_SD(_p_hwfn) (((_p_hwfn)->cdev)->mf_mode == QED_MF_OVLAN)
382400

383401
int pcie_width;
384402
int pcie_speed;
@@ -441,11 +459,6 @@ struct qed_dev {
441459
const struct firmware *firmware;
442460
};
443461

444-
#define QED_GET_TYPE(dev) (((dev)->type & QED_DEV_TYPE_MASK) >> \
445-
QED_DEV_TYPE_SHIFT)
446-
#define QED_IS_BB_A0(dev) (QED_GET_TYPE(dev) == QED_DEV_TYPE_BB_A0)
447-
#define QED_IS_BB(dev) (QED_IS_BB_A0(dev))
448-
449462
#define NUM_OF_SBS(dev) MAX_SB_PER_PATH_BB
450463
#define NUM_OF_ENG_PFS(dev) MAX_NUM_PFS_BB
451464

drivers/net/ethernet/qlogic/qed/qed_cxt.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,8 @@ void qed_qm_init_pf(struct qed_hwfn *p_hwfn)
581581
params.num_pf_cids = iids.cids;
582582
params.start_pq = qm_info->start_pq;
583583
params.num_pf_pqs = qm_info->num_pqs;
584-
params.start_vport = qm_info->num_vports;
584+
params.start_vport = qm_info->start_vport;
585+
params.num_vports = qm_info->num_vports;
585586
params.pf_wfq = qm_info->pf_wfq;
586587
params.pf_rl = qm_info->pf_rl;
587588
params.pq_params = qm_info->qm_pq_params;

drivers/net/ethernet/qlogic/qed/qed_dev.c

Lines changed: 42 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -341,11 +341,6 @@ void qed_resc_setup(struct qed_dev *cdev)
341341
}
342342
}
343343

344-
#define FINAL_CLEANUP_CMD_OFFSET (0)
345-
#define FINAL_CLEANUP_CMD (0x1)
346-
#define FINAL_CLEANUP_VALID_OFFSET (6)
347-
#define FINAL_CLEANUP_VFPF_ID_SHIFT (7)
348-
#define FINAL_CLEANUP_COMP (0x2)
349344
#define FINAL_CLEANUP_POLL_CNT (100)
350345
#define FINAL_CLEANUP_POLL_TIME (10)
351346
int qed_final_cleanup(struct qed_hwfn *p_hwfn,
@@ -355,12 +350,14 @@ int qed_final_cleanup(struct qed_hwfn *p_hwfn,
355350
u32 command = 0, addr, count = FINAL_CLEANUP_POLL_CNT;
356351
int rc = -EBUSY;
357352

358-
addr = GTT_BAR0_MAP_REG_USDM_RAM + USTORM_FLR_FINAL_ACK_OFFSET;
353+
addr = GTT_BAR0_MAP_REG_USDM_RAM +
354+
USTORM_FLR_FINAL_ACK_OFFSET(p_hwfn->rel_pf_id);
359355

360-
command |= FINAL_CLEANUP_CMD << FINAL_CLEANUP_CMD_OFFSET;
361-
command |= 1 << FINAL_CLEANUP_VALID_OFFSET;
362-
command |= id << FINAL_CLEANUP_VFPF_ID_SHIFT;
363-
command |= FINAL_CLEANUP_COMP << SDM_OP_GEN_COMP_TYPE_SHIFT;
356+
command |= X_FINAL_CLEANUP_AGG_INT <<
357+
SDM_AGG_INT_COMP_PARAMS_AGG_INT_INDEX_SHIFT;
358+
command |= 1 << SDM_AGG_INT_COMP_PARAMS_AGG_VECTOR_ENABLE_SHIFT;
359+
command |= id << SDM_AGG_INT_COMP_PARAMS_AGG_VECTOR_BIT_SHIFT;
360+
command |= SDM_COMP_TYPE_AGG_INT << SDM_OP_GEN_COMP_TYPE_SHIFT;
364361

365362
/* Make sure notification is not set before initiating final cleanup */
366363
if (REG_RD(p_hwfn, addr)) {
@@ -415,18 +412,16 @@ static void qed_calc_hw_mode(struct qed_hwfn *p_hwfn)
415412
}
416413

417414
switch (p_hwfn->cdev->mf_mode) {
418-
case SF:
419-
hw_mode |= 1 << MODE_SF;
415+
case QED_MF_DEFAULT:
416+
case QED_MF_NPAR:
417+
hw_mode |= 1 << MODE_MF_SI;
420418
break;
421-
case MF_OVLAN:
419+
case QED_MF_OVLAN:
422420
hw_mode |= 1 << MODE_MF_SD;
423421
break;
424-
case MF_NPAR:
425-
hw_mode |= 1 << MODE_MF_SI;
426-
break;
427422
default:
428-
DP_NOTICE(p_hwfn, "Unsupported MF mode, init as SF\n");
429-
hw_mode |= 1 << MODE_SF;
423+
DP_NOTICE(p_hwfn, "Unsupported MF mode, init as DEFAULT\n");
424+
hw_mode |= 1 << MODE_MF_SI;
430425
}
431426

432427
hw_mode |= 1 << MODE_ASIC;
@@ -1018,8 +1013,7 @@ static void qed_hw_get_resc(struct qed_hwfn *p_hwfn)
10181013
u32 *resc_num = p_hwfn->hw_info.resc_num;
10191014
int num_funcs, i;
10201015

1021-
num_funcs = IS_MF(p_hwfn) ? MAX_NUM_PFS_BB
1022-
: p_hwfn->cdev->num_ports_in_engines;
1016+
num_funcs = MAX_NUM_PFS_BB;
10231017

10241018
resc_num[QED_SB] = min_t(u32,
10251019
(MAX_SB_PER_PATH_BB / num_funcs),
@@ -1071,7 +1065,7 @@ static int qed_hw_get_nvm_info(struct qed_hwfn *p_hwfn,
10711065
struct qed_ptt *p_ptt)
10721066
{
10731067
u32 nvm_cfg1_offset, mf_mode, addr, generic_cont0, core_cfg;
1074-
u32 port_cfg_addr, link_temp, val, nvm_cfg_addr;
1068+
u32 port_cfg_addr, link_temp, nvm_cfg_addr, device_capabilities;
10751069
struct qed_mcp_link_params *link;
10761070

10771071
/* Read global nvm_cfg address */
@@ -1134,21 +1128,6 @@ static int qed_hw_get_nvm_info(struct qed_hwfn *p_hwfn,
11341128
break;
11351129
}
11361130

1137-
addr = MCP_REG_SCRATCH + nvm_cfg1_offset +
1138-
offsetof(struct nvm_cfg1, func[MCP_PF_ID(p_hwfn)]) +
1139-
offsetof(struct nvm_cfg1_func, device_id);
1140-
val = qed_rd(p_hwfn, p_ptt, addr);
1141-
1142-
if (IS_MF(p_hwfn)) {
1143-
p_hwfn->hw_info.device_id =
1144-
(val & NVM_CFG1_FUNC_MF_VENDOR_DEVICE_ID_MASK) >>
1145-
NVM_CFG1_FUNC_MF_VENDOR_DEVICE_ID_OFFSET;
1146-
} else {
1147-
p_hwfn->hw_info.device_id =
1148-
(val & NVM_CFG1_FUNC_VENDOR_DEVICE_ID_MASK) >>
1149-
NVM_CFG1_FUNC_VENDOR_DEVICE_ID_OFFSET;
1150-
}
1151-
11521131
/* Read default link configuration */
11531132
link = &p_hwfn->mcp_info->link_input;
11541133
port_cfg_addr = MCP_REG_SCRATCH + nvm_cfg1_offset +
@@ -1220,18 +1199,28 @@ static int qed_hw_get_nvm_info(struct qed_hwfn *p_hwfn,
12201199

12211200
switch (mf_mode) {
12221201
case NVM_CFG1_GLOB_MF_MODE_MF_ALLOWED:
1223-
p_hwfn->cdev->mf_mode = MF_OVLAN;
1202+
p_hwfn->cdev->mf_mode = QED_MF_OVLAN;
12241203
break;
12251204
case NVM_CFG1_GLOB_MF_MODE_NPAR1_0:
1226-
p_hwfn->cdev->mf_mode = MF_NPAR;
1205+
p_hwfn->cdev->mf_mode = QED_MF_NPAR;
12271206
break;
1228-
case NVM_CFG1_GLOB_MF_MODE_FORCED_SF:
1229-
p_hwfn->cdev->mf_mode = SF;
1207+
case NVM_CFG1_GLOB_MF_MODE_DEFAULT:
1208+
p_hwfn->cdev->mf_mode = QED_MF_DEFAULT;
12301209
break;
12311210
}
12321211
DP_INFO(p_hwfn, "Multi function mode is %08x\n",
12331212
p_hwfn->cdev->mf_mode);
12341213

1214+
/* Read Multi-function information from shmem */
1215+
addr = MCP_REG_SCRATCH + nvm_cfg1_offset +
1216+
offsetof(struct nvm_cfg1, glob) +
1217+
offsetof(struct nvm_cfg1_glob, device_capabilities);
1218+
1219+
device_capabilities = qed_rd(p_hwfn, p_ptt, addr);
1220+
if (device_capabilities & NVM_CFG1_GLOB_DEVICE_CAPABILITIES_ETHERNET)
1221+
__set_bit(QED_DEV_CAP_ETH,
1222+
&p_hwfn->hw_info.device_capabilities);
1223+
12351224
return qed_mcp_fill_shmem_func_info(p_hwfn, p_ptt);
12361225
}
12371226

@@ -1293,29 +1282,36 @@ qed_get_hw_info(struct qed_hwfn *p_hwfn,
12931282

12941283
static void qed_get_dev_info(struct qed_dev *cdev)
12951284
{
1285+
struct qed_hwfn *p_hwfn = QED_LEADING_HWFN(cdev);
12961286
u32 tmp;
12971287

1298-
cdev->chip_num = (u16)qed_rd(cdev->hwfns, cdev->hwfns[0].p_main_ptt,
1288+
/* Read Vendor Id / Device Id */
1289+
pci_read_config_word(cdev->pdev, PCI_VENDOR_ID,
1290+
&cdev->vendor_id);
1291+
pci_read_config_word(cdev->pdev, PCI_DEVICE_ID,
1292+
&cdev->device_id);
1293+
cdev->chip_num = (u16)qed_rd(p_hwfn, p_hwfn->p_main_ptt,
12991294
MISCS_REG_CHIP_NUM);
1300-
cdev->chip_rev = (u16)qed_rd(cdev->hwfns, cdev->hwfns[0].p_main_ptt,
1295+
cdev->chip_rev = (u16)qed_rd(p_hwfn, p_hwfn->p_main_ptt,
13011296
MISCS_REG_CHIP_REV);
13021297
MASK_FIELD(CHIP_REV, cdev->chip_rev);
13031298

1299+
cdev->type = QED_DEV_TYPE_BB;
13041300
/* Learn number of HW-functions */
1305-
tmp = qed_rd(cdev->hwfns, cdev->hwfns[0].p_main_ptt,
1301+
tmp = qed_rd(p_hwfn, p_hwfn->p_main_ptt,
13061302
MISCS_REG_CMT_ENABLED_FOR_PAIR);
13071303

1308-
if (tmp & (1 << cdev->hwfns[0].rel_pf_id)) {
1304+
if (tmp & (1 << p_hwfn->rel_pf_id)) {
13091305
DP_NOTICE(cdev->hwfns, "device in CMT mode\n");
13101306
cdev->num_hwfns = 2;
13111307
} else {
13121308
cdev->num_hwfns = 1;
13131309
}
13141310

1315-
cdev->chip_bond_id = qed_rd(cdev->hwfns, cdev->hwfns[0].p_main_ptt,
1311+
cdev->chip_bond_id = qed_rd(p_hwfn, p_hwfn->p_main_ptt,
13161312
MISCS_REG_CHIP_TEST_REG) >> 4;
13171313
MASK_FIELD(CHIP_BOND_ID, cdev->chip_bond_id);
1318-
cdev->chip_metal = (u16)qed_rd(cdev->hwfns, cdev->hwfns[0].p_main_ptt,
1314+
cdev->chip_metal = (u16)qed_rd(p_hwfn, p_hwfn->p_main_ptt,
13191315
MISCS_REG_CHIP_METAL);
13201316
MASK_FIELD(CHIP_METAL, cdev->chip_metal);
13211317

0 commit comments

Comments
 (0)