Commit 988bf4f0 authored by David S. Miller's avatar David S. Miller

Merge branch 'cxgb4'

Hariprasad Shenai says:

====================
Fixes T5 adapter init, due to incorrect FW version check

This patch series fixes, Chelsio T5 adapter initialization failure due to
incorrect firmware version check. This patch series modifies the firmware
flashing mechanism for T4/T5 adapter.

The patch series moves chip type from struct adapter to struct adapter_params.
It changes the references of chip type in cxgb4 and cxgb4vf drivers such that
build failure is avoided.

Patch 3/3 is dependent on patch 1/3
Patch 2/3 is also dependent on patch 1/3

We would like to request this patch series to get merged via David Miller's
'net' tree.

We have included all the maintainers of respective drivers. Kindly review the
change and let us know in case of any review comments.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 1b85ee09 16e47624
...@@ -49,13 +49,15 @@ ...@@ -49,13 +49,15 @@
#include <asm/io.h> #include <asm/io.h>
#include "cxgb4_uld.h" #include "cxgb4_uld.h"
#define FW_VERSION_MAJOR 1 #define T4FW_VERSION_MAJOR 0x01
#define FW_VERSION_MINOR 4 #define T4FW_VERSION_MINOR 0x06
#define FW_VERSION_MICRO 0 #define T4FW_VERSION_MICRO 0x18
#define T4FW_VERSION_BUILD 0x00
#define FW_VERSION_MAJOR_T5 0 #define T5FW_VERSION_MAJOR 0x01
#define FW_VERSION_MINOR_T5 0 #define T5FW_VERSION_MINOR 0x08
#define FW_VERSION_MICRO_T5 0 #define T5FW_VERSION_MICRO 0x1C
#define T5FW_VERSION_BUILD 0x00
#define CH_WARN(adap, fmt, ...) dev_warn(adap->pdev_dev, fmt, ## __VA_ARGS__) #define CH_WARN(adap, fmt, ...) dev_warn(adap->pdev_dev, fmt, ## __VA_ARGS__)
...@@ -240,6 +242,26 @@ struct pci_params { ...@@ -240,6 +242,26 @@ struct pci_params {
unsigned char width; unsigned char width;
}; };
#define CHELSIO_CHIP_CODE(version, revision) (((version) << 4) | (revision))
#define CHELSIO_CHIP_FPGA 0x100
#define CHELSIO_CHIP_VERSION(code) (((code) >> 4) & 0xf)
#define CHELSIO_CHIP_RELEASE(code) ((code) & 0xf)
#define CHELSIO_T4 0x4
#define CHELSIO_T5 0x5
enum chip_type {
T4_A1 = CHELSIO_CHIP_CODE(CHELSIO_T4, 1),
T4_A2 = CHELSIO_CHIP_CODE(CHELSIO_T4, 2),
T4_FIRST_REV = T4_A1,
T4_LAST_REV = T4_A2,
T5_A0 = CHELSIO_CHIP_CODE(CHELSIO_T5, 0),
T5_A1 = CHELSIO_CHIP_CODE(CHELSIO_T5, 1),
T5_FIRST_REV = T5_A0,
T5_LAST_REV = T5_A1,
};
struct adapter_params { struct adapter_params {
struct tp_params tp; struct tp_params tp;
struct vpd_params vpd; struct vpd_params vpd;
...@@ -259,7 +281,7 @@ struct adapter_params { ...@@ -259,7 +281,7 @@ struct adapter_params {
unsigned char nports; /* # of ethernet ports */ unsigned char nports; /* # of ethernet ports */
unsigned char portvec; unsigned char portvec;
unsigned char rev; /* chip revision */ enum chip_type chip; /* chip code */
unsigned char offload; unsigned char offload;
unsigned char bypass; unsigned char bypass;
...@@ -267,6 +289,23 @@ struct adapter_params { ...@@ -267,6 +289,23 @@ struct adapter_params {
unsigned int ofldq_wr_cred; unsigned int ofldq_wr_cred;
}; };
#include "t4fw_api.h"
#define FW_VERSION(chip) ( \
FW_HDR_FW_VER_MAJOR_GET(chip##FW_VERSION_MAJOR) | \
FW_HDR_FW_VER_MINOR_GET(chip##FW_VERSION_MINOR) | \
FW_HDR_FW_VER_MICRO_GET(chip##FW_VERSION_MICRO) | \
FW_HDR_FW_VER_BUILD_GET(chip##FW_VERSION_BUILD))
#define FW_INTFVER(chip, intf) (FW_HDR_INTFVER_##intf)
struct fw_info {
u8 chip;
char *fs_name;
char *fw_mod_name;
struct fw_hdr fw_hdr;
};
struct trace_params { struct trace_params {
u32 data[TRACE_LEN / 4]; u32 data[TRACE_LEN / 4];
u32 mask[TRACE_LEN / 4]; u32 mask[TRACE_LEN / 4];
...@@ -512,25 +551,6 @@ struct sge { ...@@ -512,25 +551,6 @@ struct sge {
struct l2t_data; struct l2t_data;
#define CHELSIO_CHIP_CODE(version, revision) (((version) << 4) | (revision))
#define CHELSIO_CHIP_VERSION(code) ((code) >> 4)
#define CHELSIO_CHIP_RELEASE(code) ((code) & 0xf)
#define CHELSIO_T4 0x4
#define CHELSIO_T5 0x5
enum chip_type {
T4_A1 = CHELSIO_CHIP_CODE(CHELSIO_T4, 0),
T4_A2 = CHELSIO_CHIP_CODE(CHELSIO_T4, 1),
T4_A3 = CHELSIO_CHIP_CODE(CHELSIO_T4, 2),
T4_FIRST_REV = T4_A1,
T4_LAST_REV = T4_A3,
T5_A1 = CHELSIO_CHIP_CODE(CHELSIO_T5, 0),
T5_FIRST_REV = T5_A1,
T5_LAST_REV = T5_A1,
};
#ifdef CONFIG_PCI_IOV #ifdef CONFIG_PCI_IOV
/* T4 supports SRIOV on PF0-3 and T5 on PF0-7. However, the Serial /* T4 supports SRIOV on PF0-3 and T5 on PF0-7. However, the Serial
...@@ -715,12 +735,12 @@ enum { ...@@ -715,12 +735,12 @@ enum {
static inline int is_t5(enum chip_type chip) static inline int is_t5(enum chip_type chip)
{ {
return (chip >= T5_FIRST_REV && chip <= T5_LAST_REV); return CHELSIO_CHIP_VERSION(chip) == CHELSIO_T5;
} }
static inline int is_t4(enum chip_type chip) static inline int is_t4(enum chip_type chip)
{ {
return (chip >= T4_FIRST_REV && chip <= T4_LAST_REV); return CHELSIO_CHIP_VERSION(chip) == CHELSIO_T4;
} }
static inline u32 t4_read_reg(struct adapter *adap, u32 reg_addr) static inline u32 t4_read_reg(struct adapter *adap, u32 reg_addr)
...@@ -900,7 +920,11 @@ int get_vpd_params(struct adapter *adapter, struct vpd_params *p); ...@@ -900,7 +920,11 @@ int get_vpd_params(struct adapter *adapter, struct vpd_params *p);
int t4_load_fw(struct adapter *adapter, const u8 *fw_data, unsigned int size); int t4_load_fw(struct adapter *adapter, const u8 *fw_data, unsigned int size);
unsigned int t4_flash_cfg_addr(struct adapter *adapter); unsigned int t4_flash_cfg_addr(struct adapter *adapter);
int t4_load_cfg(struct adapter *adapter, const u8 *cfg_data, unsigned int size); int t4_load_cfg(struct adapter *adapter, const u8 *cfg_data, unsigned int size);
int t4_check_fw_version(struct adapter *adapter); int t4_get_fw_version(struct adapter *adapter, u32 *vers);
int t4_get_tp_version(struct adapter *adapter, u32 *vers);
int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info,
const u8 *fw_data, unsigned int fw_size,
struct fw_hdr *card_fw, enum dev_state state, int *reset);
int t4_prep_adapter(struct adapter *adapter); int t4_prep_adapter(struct adapter *adapter);
int t4_port_init(struct adapter *adap, int mbox, int pf, int vf); int t4_port_init(struct adapter *adap, int mbox, int pf, int vf);
void t4_fatal_err(struct adapter *adapter); void t4_fatal_err(struct adapter *adapter);
......
...@@ -276,9 +276,9 @@ static DEFINE_PCI_DEVICE_TABLE(cxgb4_pci_tbl) = { ...@@ -276,9 +276,9 @@ static DEFINE_PCI_DEVICE_TABLE(cxgb4_pci_tbl) = {
{ 0, } { 0, }
}; };
#define FW_FNAME "cxgb4/t4fw.bin" #define FW4_FNAME "cxgb4/t4fw.bin"
#define FW5_FNAME "cxgb4/t5fw.bin" #define FW5_FNAME "cxgb4/t5fw.bin"
#define FW_CFNAME "cxgb4/t4-config.txt" #define FW4_CFNAME "cxgb4/t4-config.txt"
#define FW5_CFNAME "cxgb4/t5-config.txt" #define FW5_CFNAME "cxgb4/t5-config.txt"
MODULE_DESCRIPTION(DRV_DESC); MODULE_DESCRIPTION(DRV_DESC);
...@@ -286,7 +286,7 @@ MODULE_AUTHOR("Chelsio Communications"); ...@@ -286,7 +286,7 @@ MODULE_AUTHOR("Chelsio Communications");
MODULE_LICENSE("Dual BSD/GPL"); MODULE_LICENSE("Dual BSD/GPL");
MODULE_VERSION(DRV_VERSION); MODULE_VERSION(DRV_VERSION);
MODULE_DEVICE_TABLE(pci, cxgb4_pci_tbl); MODULE_DEVICE_TABLE(pci, cxgb4_pci_tbl);
MODULE_FIRMWARE(FW_FNAME); MODULE_FIRMWARE(FW4_FNAME);
MODULE_FIRMWARE(FW5_FNAME); MODULE_FIRMWARE(FW5_FNAME);
/* /*
...@@ -1070,72 +1070,6 @@ freeout: t4_free_sge_resources(adap); ...@@ -1070,72 +1070,6 @@ freeout: t4_free_sge_resources(adap);
return 0; return 0;
} }
/*
* Returns 0 if new FW was successfully loaded, a positive errno if a load was
* started but failed, and a negative errno if flash load couldn't start.
*/
static int upgrade_fw(struct adapter *adap)
{
int ret;
u32 vers, exp_major;
const struct fw_hdr *hdr;
const struct firmware *fw;
struct device *dev = adap->pdev_dev;
char *fw_file_name;
switch (CHELSIO_CHIP_VERSION(adap->chip)) {
case CHELSIO_T4:
fw_file_name = FW_FNAME;
exp_major = FW_VERSION_MAJOR;
break;
case CHELSIO_T5:
fw_file_name = FW5_FNAME;
exp_major = FW_VERSION_MAJOR_T5;
break;
default:
dev_err(dev, "Unsupported chip type, %x\n", adap->chip);
return -EINVAL;
}
ret = request_firmware(&fw, fw_file_name, dev);
if (ret < 0) {
dev_err(dev, "unable to load firmware image %s, error %d\n",
fw_file_name, ret);
return ret;
}
hdr = (const struct fw_hdr *)fw->data;
vers = ntohl(hdr->fw_ver);
if (FW_HDR_FW_VER_MAJOR_GET(vers) != exp_major) {
ret = -EINVAL; /* wrong major version, won't do */
goto out;
}
/*
* If the flash FW is unusable or we found something newer, load it.
*/
if (FW_HDR_FW_VER_MAJOR_GET(adap->params.fw_vers) != exp_major ||
vers > adap->params.fw_vers) {
dev_info(dev, "upgrading firmware ...\n");
ret = t4_fw_upgrade(adap, adap->mbox, fw->data, fw->size,
/*force=*/false);
if (!ret)
dev_info(dev,
"firmware upgraded to version %pI4 from %s\n",
&hdr->fw_ver, fw_file_name);
else
dev_err(dev, "firmware upgrade failed! err=%d\n", -ret);
} else {
/*
* Tell our caller that we didn't upgrade the firmware.
*/
ret = -EINVAL;
}
out: release_firmware(fw);
return ret;
}
/* /*
* Allocate a chunk of memory using kmalloc or, if that fails, vmalloc. * Allocate a chunk of memory using kmalloc or, if that fails, vmalloc.
* The allocated memory is cleared. * The allocated memory is cleared.
...@@ -1415,7 +1349,7 @@ static int get_sset_count(struct net_device *dev, int sset) ...@@ -1415,7 +1349,7 @@ static int get_sset_count(struct net_device *dev, int sset)
static int get_regs_len(struct net_device *dev) static int get_regs_len(struct net_device *dev)
{ {
struct adapter *adap = netdev2adap(dev); struct adapter *adap = netdev2adap(dev);
if (is_t4(adap->chip)) if (is_t4(adap->params.chip))
return T4_REGMAP_SIZE; return T4_REGMAP_SIZE;
else else
return T5_REGMAP_SIZE; return T5_REGMAP_SIZE;
...@@ -1499,7 +1433,7 @@ static void get_stats(struct net_device *dev, struct ethtool_stats *stats, ...@@ -1499,7 +1433,7 @@ static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
data += sizeof(struct port_stats) / sizeof(u64); data += sizeof(struct port_stats) / sizeof(u64);
collect_sge_port_stats(adapter, pi, (struct queue_port_stats *)data); collect_sge_port_stats(adapter, pi, (struct queue_port_stats *)data);
data += sizeof(struct queue_port_stats) / sizeof(u64); data += sizeof(struct queue_port_stats) / sizeof(u64);
if (!is_t4(adapter->chip)) { if (!is_t4(adapter->params.chip)) {
t4_write_reg(adapter, SGE_STAT_CFG, STATSOURCE_T5(7)); t4_write_reg(adapter, SGE_STAT_CFG, STATSOURCE_T5(7));
val1 = t4_read_reg(adapter, SGE_STAT_TOTAL); val1 = t4_read_reg(adapter, SGE_STAT_TOTAL);
val2 = t4_read_reg(adapter, SGE_STAT_MATCH); val2 = t4_read_reg(adapter, SGE_STAT_MATCH);
...@@ -1521,8 +1455,8 @@ static void get_stats(struct net_device *dev, struct ethtool_stats *stats, ...@@ -1521,8 +1455,8 @@ static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
*/ */
static inline unsigned int mk_adap_vers(const struct adapter *ap) static inline unsigned int mk_adap_vers(const struct adapter *ap)
{ {
return CHELSIO_CHIP_VERSION(ap->chip) | return CHELSIO_CHIP_VERSION(ap->params.chip) |
(CHELSIO_CHIP_RELEASE(ap->chip) << 10) | (1 << 16); (CHELSIO_CHIP_RELEASE(ap->params.chip) << 10) | (1 << 16);
} }
static void reg_block_dump(struct adapter *ap, void *buf, unsigned int start, static void reg_block_dump(struct adapter *ap, void *buf, unsigned int start,
...@@ -2189,7 +2123,7 @@ static void get_regs(struct net_device *dev, struct ethtool_regs *regs, ...@@ -2189,7 +2123,7 @@ static void get_regs(struct net_device *dev, struct ethtool_regs *regs,
static const unsigned int *reg_ranges; static const unsigned int *reg_ranges;
int arr_size = 0, buf_size = 0; int arr_size = 0, buf_size = 0;
if (is_t4(ap->chip)) { if (is_t4(ap->params.chip)) {
reg_ranges = &t4_reg_ranges[0]; reg_ranges = &t4_reg_ranges[0];
arr_size = ARRAY_SIZE(t4_reg_ranges); arr_size = ARRAY_SIZE(t4_reg_ranges);
buf_size = T4_REGMAP_SIZE; buf_size = T4_REGMAP_SIZE;
...@@ -2967,7 +2901,7 @@ static int setup_debugfs(struct adapter *adap) ...@@ -2967,7 +2901,7 @@ static int setup_debugfs(struct adapter *adap)
size = t4_read_reg(adap, MA_EDRAM1_BAR); size = t4_read_reg(adap, MA_EDRAM1_BAR);
add_debugfs_mem(adap, "edc1", MEM_EDC1, EDRAM_SIZE_GET(size)); add_debugfs_mem(adap, "edc1", MEM_EDC1, EDRAM_SIZE_GET(size));
} }
if (is_t4(adap->chip)) { if (is_t4(adap->params.chip)) {
size = t4_read_reg(adap, MA_EXT_MEMORY_BAR); size = t4_read_reg(adap, MA_EXT_MEMORY_BAR);
if (i & EXT_MEM_ENABLE) if (i & EXT_MEM_ENABLE)
add_debugfs_mem(adap, "mc", MEM_MC, add_debugfs_mem(adap, "mc", MEM_MC,
...@@ -3419,7 +3353,7 @@ unsigned int cxgb4_dbfifo_count(const struct net_device *dev, int lpfifo) ...@@ -3419,7 +3353,7 @@ unsigned int cxgb4_dbfifo_count(const struct net_device *dev, int lpfifo)
v1 = t4_read_reg(adap, A_SGE_DBFIFO_STATUS); v1 = t4_read_reg(adap, A_SGE_DBFIFO_STATUS);
v2 = t4_read_reg(adap, SGE_DBFIFO_STATUS2); v2 = t4_read_reg(adap, SGE_DBFIFO_STATUS2);
if (is_t4(adap->chip)) { if (is_t4(adap->params.chip)) {
lp_count = G_LP_COUNT(v1); lp_count = G_LP_COUNT(v1);
hp_count = G_HP_COUNT(v1); hp_count = G_HP_COUNT(v1);
} else { } else {
...@@ -3588,7 +3522,7 @@ static void drain_db_fifo(struct adapter *adap, int usecs) ...@@ -3588,7 +3522,7 @@ static void drain_db_fifo(struct adapter *adap, int usecs)
do { do {
v1 = t4_read_reg(adap, A_SGE_DBFIFO_STATUS); v1 = t4_read_reg(adap, A_SGE_DBFIFO_STATUS);
v2 = t4_read_reg(adap, SGE_DBFIFO_STATUS2); v2 = t4_read_reg(adap, SGE_DBFIFO_STATUS2);
if (is_t4(adap->chip)) { if (is_t4(adap->params.chip)) {
lp_count = G_LP_COUNT(v1); lp_count = G_LP_COUNT(v1);
hp_count = G_HP_COUNT(v1); hp_count = G_HP_COUNT(v1);
} else { } else {
...@@ -3708,7 +3642,7 @@ static void process_db_drop(struct work_struct *work) ...@@ -3708,7 +3642,7 @@ static void process_db_drop(struct work_struct *work)
adap = container_of(work, struct adapter, db_drop_task); adap = container_of(work, struct adapter, db_drop_task);
if (is_t4(adap->chip)) { if (is_t4(adap->params.chip)) {
disable_dbs(adap); disable_dbs(adap);
notify_rdma_uld(adap, CXGB4_CONTROL_DB_DROP); notify_rdma_uld(adap, CXGB4_CONTROL_DB_DROP);
drain_db_fifo(adap, 1); drain_db_fifo(adap, 1);
...@@ -3753,7 +3687,7 @@ static void process_db_drop(struct work_struct *work) ...@@ -3753,7 +3687,7 @@ static void process_db_drop(struct work_struct *work)
void t4_db_full(struct adapter *adap) void t4_db_full(struct adapter *adap)
{ {
if (is_t4(adap->chip)) { if (is_t4(adap->params.chip)) {
t4_set_reg_field(adap, SGE_INT_ENABLE3, t4_set_reg_field(adap, SGE_INT_ENABLE3,
DBFIFO_HP_INT | DBFIFO_LP_INT, 0); DBFIFO_HP_INT | DBFIFO_LP_INT, 0);
queue_work(workq, &adap->db_full_task); queue_work(workq, &adap->db_full_task);
...@@ -3762,7 +3696,7 @@ void t4_db_full(struct adapter *adap) ...@@ -3762,7 +3696,7 @@ void t4_db_full(struct adapter *adap)
void t4_db_dropped(struct adapter *adap) void t4_db_dropped(struct adapter *adap)
{ {
if (is_t4(adap->chip)) if (is_t4(adap->params.chip))
queue_work(workq, &adap->db_drop_task); queue_work(workq, &adap->db_drop_task);
} }
...@@ -3789,7 +3723,7 @@ static void uld_attach(struct adapter *adap, unsigned int uld) ...@@ -3789,7 +3723,7 @@ static void uld_attach(struct adapter *adap, unsigned int uld)
lli.nchan = adap->params.nports; lli.nchan = adap->params.nports;
lli.nports = adap->params.nports; lli.nports = adap->params.nports;
lli.wr_cred = adap->params.ofldq_wr_cred; lli.wr_cred = adap->params.ofldq_wr_cred;
lli.adapter_type = adap->params.rev; lli.adapter_type = adap->params.chip;
lli.iscsi_iolen = MAXRXDATA_GET(t4_read_reg(adap, TP_PARA_REG2)); lli.iscsi_iolen = MAXRXDATA_GET(t4_read_reg(adap, TP_PARA_REG2));
lli.udb_density = 1 << QUEUESPERPAGEPF0_GET( lli.udb_density = 1 << QUEUESPERPAGEPF0_GET(
t4_read_reg(adap, SGE_EGRESS_QUEUES_PER_PAGE_PF) >> t4_read_reg(adap, SGE_EGRESS_QUEUES_PER_PAGE_PF) >>
...@@ -4483,7 +4417,7 @@ static void setup_memwin(struct adapter *adap) ...@@ -4483,7 +4417,7 @@ static void setup_memwin(struct adapter *adap)
u32 bar0, mem_win0_base, mem_win1_base, mem_win2_base; u32 bar0, mem_win0_base, mem_win1_base, mem_win2_base;
bar0 = pci_resource_start(adap->pdev, 0); /* truncation intentional */ bar0 = pci_resource_start(adap->pdev, 0); /* truncation intentional */
if (is_t4(adap->chip)) { if (is_t4(adap->params.chip)) {
mem_win0_base = bar0 + MEMWIN0_BASE; mem_win0_base = bar0 + MEMWIN0_BASE;
mem_win1_base = bar0 + MEMWIN1_BASE; mem_win1_base = bar0 + MEMWIN1_BASE;
mem_win2_base = bar0 + MEMWIN2_BASE; mem_win2_base = bar0 + MEMWIN2_BASE;
...@@ -4668,8 +4602,10 @@ static int adap_init0_config(struct adapter *adapter, int reset) ...@@ -4668,8 +4602,10 @@ static int adap_init0_config(struct adapter *adapter, int reset)
const struct firmware *cf; const struct firmware *cf;
unsigned long mtype = 0, maddr = 0; unsigned long mtype = 0, maddr = 0;
u32 finiver, finicsum, cfcsum; u32 finiver, finicsum, cfcsum;
int ret, using_flash; int ret;
int config_issued = 0;
char *fw_config_file, fw_config_file_path[256]; char *fw_config_file, fw_config_file_path[256];
char *config_name = NULL;
/* /*
* Reset device if necessary. * Reset device if necessary.
...@@ -4686,9 +4622,9 @@ static int adap_init0_config(struct adapter *adapter, int reset) ...@@ -4686,9 +4622,9 @@ static int adap_init0_config(struct adapter *adapter, int reset)
* then use that. Otherwise, use the configuration file stored * then use that. Otherwise, use the configuration file stored
* in the adapter flash ... * in the adapter flash ...
*/ */
switch (CHELSIO_CHIP_VERSION(adapter->chip)) { switch (CHELSIO_CHIP_VERSION(adapter->params.chip)) {
case CHELSIO_T4: case CHELSIO_T4:
fw_config_file = FW_CFNAME; fw_config_file = FW4_CFNAME;
break; break;
case CHELSIO_T5: case CHELSIO_T5:
fw_config_file = FW5_CFNAME; fw_config_file = FW5_CFNAME;
...@@ -4702,13 +4638,16 @@ static int adap_init0_config(struct adapter *adapter, int reset) ...@@ -4702,13 +4638,16 @@ static int adap_init0_config(struct adapter *adapter, int reset)
ret = request_firmware(&cf, fw_config_file, adapter->pdev_dev); ret = request_firmware(&cf, fw_config_file, adapter->pdev_dev);
if (ret < 0) { if (ret < 0) {
using_flash = 1; config_name = "On FLASH";
mtype = FW_MEMTYPE_CF_FLASH; mtype = FW_MEMTYPE_CF_FLASH;
maddr = t4_flash_cfg_addr(adapter); maddr = t4_flash_cfg_addr(adapter);
} else { } else {
u32 params[7], val[7]; u32 params[7], val[7];
using_flash = 0; sprintf(fw_config_file_path,
"/lib/firmware/%s", fw_config_file);
config_name = fw_config_file_path;
if (cf->size >= FLASH_CFG_MAX_SIZE) if (cf->size >= FLASH_CFG_MAX_SIZE)
ret = -ENOMEM; ret = -ENOMEM;
else { else {
...@@ -4776,6 +4715,26 @@ static int adap_init0_config(struct adapter *adapter, int reset) ...@@ -4776,6 +4715,26 @@ static int adap_init0_config(struct adapter *adapter, int reset)
FW_LEN16(caps_cmd)); FW_LEN16(caps_cmd));
ret = t4_wr_mbox(adapter, adapter->mbox, &caps_cmd, sizeof(caps_cmd), ret = t4_wr_mbox(adapter, adapter->mbox, &caps_cmd, sizeof(caps_cmd),
&caps_cmd); &caps_cmd);
/* If the CAPS_CONFIG failed with an ENOENT (for a Firmware
* Configuration File in FLASH), our last gasp effort is to use the
* Firmware Configuration File which is embedded in the firmware. A
* very few early versions of the firmware didn't have one embedded
* but we can ignore those.
*/
if (ret == -ENOENT) {
memset(&caps_cmd, 0, sizeof(caps_cmd));
caps_cmd.op_to_write =
htonl(FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
FW_CMD_REQUEST |
FW_CMD_READ);
caps_cmd.cfvalid_to_len16 = htonl(FW_LEN16(caps_cmd));
ret = t4_wr_mbox(adapter, adapter->mbox, &caps_cmd,
sizeof(caps_cmd), &caps_cmd);
config_name = "Firmware Default";
}
config_issued = 1;
if (ret < 0) if (ret < 0)
goto bye; goto bye;
...@@ -4816,7 +4775,6 @@ static int adap_init0_config(struct adapter *adapter, int reset) ...@@ -4816,7 +4775,6 @@ static int adap_init0_config(struct adapter *adapter, int reset)
if (ret < 0) if (ret < 0)
goto bye; goto bye;
sprintf(fw_config_file_path, "/lib/firmware/%s", fw_config_file);
/* /*
* Return successfully and note that we're operating with parameters * Return successfully and note that we're operating with parameters
* not supplied by the driver, rather than from hard-wired * not supplied by the driver, rather than from hard-wired
...@@ -4824,11 +4782,8 @@ static int adap_init0_config(struct adapter *adapter, int reset) ...@@ -4824,11 +4782,8 @@ static int adap_init0_config(struct adapter *adapter, int reset)
*/ */
adapter->flags |= USING_SOFT_PARAMS; adapter->flags |= USING_SOFT_PARAMS;
dev_info(adapter->pdev_dev, "Successfully configured using Firmware "\ dev_info(adapter->pdev_dev, "Successfully configured using Firmware "\
"Configuration File %s, version %#x, computed checksum %#x\n", "Configuration File \"%s\", version %#x, computed checksum %#x\n",
(using_flash config_name, finiver, cfcsum);
? "in device FLASH"
: fw_config_file_path),
finiver, cfcsum);
return 0; return 0;
/* /*
...@@ -4837,9 +4792,9 @@ static int adap_init0_config(struct adapter *adapter, int reset) ...@@ -4837,9 +4792,9 @@ static int adap_init0_config(struct adapter *adapter, int reset)
* want to issue a warning since this is fairly common.) * want to issue a warning since this is fairly common.)
*/ */
bye: bye:
if (ret != -ENOENT) if (config_issued && ret != -ENOENT)
dev_warn(adapter->pdev_dev, "Configuration file error %d\n", dev_warn(adapter->pdev_dev, "\"%s\" configuration file error %d\n",
-ret); config_name, -ret);
return ret; return ret;
} }
...@@ -5086,6 +5041,47 @@ static int adap_init0_no_config(struct adapter *adapter, int reset) ...@@ -5086,6 +5041,47 @@ static int adap_init0_no_config(struct adapter *adapter, int reset)
return ret; return ret;
} }
static struct fw_info fw_info_array[] = {
{
.chip = CHELSIO_T4,
.fs_name = FW4_CFNAME,
.fw_mod_name = FW4_FNAME,
.fw_hdr = {
.chip = FW_HDR_CHIP_T4,
.fw_ver = __cpu_to_be32(FW_VERSION(T4)),
.intfver_nic = FW_INTFVER(T4, NIC),
.intfver_vnic = FW_INTFVER(T4, VNIC),
.intfver_ri = FW_INTFVER(T4, RI),
.intfver_iscsi = FW_INTFVER(T4, ISCSI),
.intfver_fcoe = FW_INTFVER(T4, FCOE),
},
}, {
.chip = CHELSIO_T5,
.fs_name = FW5_CFNAME,
.fw_mod_name = FW5_FNAME,
.fw_hdr = {
.chip = FW_HDR_CHIP_T5,
.fw_ver = __cpu_to_be32(FW_VERSION(T5)),
.intfver_nic = FW_INTFVER(T5, NIC),
.intfver_vnic = FW_INTFVER(T5, VNIC),
.intfver_ri = FW_INTFVER(T5, RI),
.intfver_iscsi = FW_INTFVER(T5, ISCSI),
.intfver_fcoe = FW_INTFVER(T5, FCOE),
},
}
};
static struct fw_info *find_fw_info(int chip)
{
int i;
for (i = 0; i < ARRAY_SIZE(fw_info_array); i++) {
if (fw_info_array[i].chip == chip)
return &fw_info_array[i];
}
return NULL;
}
/* /*
* Phase 0 of initialization: contact FW, obtain config, perform basic init. * Phase 0 of initialization: contact FW, obtain config, perform basic init.
*/ */
...@@ -5123,44 +5119,54 @@ static int adap_init0(struct adapter *adap) ...@@ -5123,44 +5119,54 @@ static int adap_init0(struct adapter *adap)
* later reporting and B. to warn if the currently loaded firmware * later reporting and B. to warn if the currently loaded firmware
* is excessively mismatched relative to the driver.) * is excessively mismatched relative to the driver.)
*/ */
ret = t4_check_fw_version(adap); t4_get_fw_version(adap, &adap->params.fw_vers);
t4_get_tp_version(adap, &adap->params.tp_vers);
/* The error code -EFAULT is returned by t4_check_fw_version() if
* firmware on adapter < supported firmware. If firmware on adapter
* is too old (not supported by driver) and we're the MASTER_PF set
* adapter state to DEV_STATE_UNINIT to force firmware upgrade
* and reinitialization.
*/
if ((adap->flags & MASTER_PF) && ret == -EFAULT)
state = DEV_STATE_UNINIT;
if ((adap->flags & MASTER_PF) && state != DEV_STATE_INIT) { if ((adap->flags & MASTER_PF) && state != DEV_STATE_INIT) {
if (ret == -EINVAL || ret == -EFAULT || ret > 0) { struct fw_info *fw_info;
if (upgrade_fw(adap) >= 0) { struct fw_hdr *card_fw;
/* const struct firmware *fw;
* Note that the chip was reset as part of the const u8 *fw_data = NULL;
* firmware upgrade so we don't reset it again unsigned int fw_size = 0;
* below and grab the new firmware version.
*/ /* This is the firmware whose headers the driver was compiled
reset = 0; * against
ret = t4_check_fw_version(adap); */
} else fw_info = find_fw_info(CHELSIO_CHIP_VERSION(adap->params.chip));
if (ret == -EFAULT) { if (fw_info == NULL) {
/* dev_err(adap->pdev_dev,
* Firmware is old but still might "unable to get firmware info for chip %d.\n",
* work if we force reinitialization CHELSIO_CHIP_VERSION(adap->params.chip));
* of the adapter. Ignoring FW upgrade return -EINVAL;
* failure.
*/
dev_warn(adap->pdev_dev,
"Ignoring firmware upgrade "
"failure, and forcing driver "
"to reinitialize the "
"adapter.\n");
ret = 0;
}
} }
/* allocate memory to read the header of the firmware on the
* card
*/
card_fw = t4_alloc_mem(sizeof(*card_fw));
/* Get FW from from /lib/firmware/ */
ret = request_firmware(&fw, fw_info->fw_mod_name,
adap->pdev_dev);
if (ret < 0) {
dev_err(adap->pdev_dev,
"unable to load firmware image %s, error %d\n",
fw_info->fw_mod_name, ret);
} else {
fw_data = fw->data;
fw_size = fw->size;
}
/* upgrade FW logic */
ret = t4_prep_fw(adap, fw_info, fw_data, fw_size, card_fw,
state, &reset);
/* Cleaning up */
if (fw != NULL)
release_firmware(fw);
t4_free_mem(card_fw);
if (ret < 0) if (ret < 0)
return ret; goto bye;
} }
/* /*
...@@ -5245,7 +5251,7 @@ static int adap_init0(struct adapter *adap) ...@@ -5245,7 +5251,7 @@ static int adap_init0(struct adapter *adap)
if (ret == -ENOENT) { if (ret == -ENOENT) {
dev_info(adap->pdev_dev, dev_info(adap->pdev_dev,
"No Configuration File present " "No Configuration File present "
"on adapter. Using hard-wired " "on adapter. Using hard-wired "
"configuration parameters.\n"); "configuration parameters.\n");
ret = adap_init0_no_config(adap, reset); ret = adap_init0_no_config(adap, reset);
} }
...@@ -5787,7 +5793,7 @@ static void print_port_info(const struct net_device *dev) ...@@ -5787,7 +5793,7 @@ static void print_port_info(const struct net_device *dev)
netdev_info(dev, "Chelsio %s rev %d %s %sNIC PCIe x%d%s%s\n", netdev_info(dev, "Chelsio %s rev %d %s %sNIC PCIe x%d%s%s\n",
adap->params.vpd.id, adap->params.vpd.id,
CHELSIO_CHIP_RELEASE(adap->params.rev), buf, CHELSIO_CHIP_RELEASE(adap->params.chip), buf,
is_offload(adap) ? "R" : "", adap->params.pci.width, spd, is_offload(adap) ? "R" : "", adap->params.pci.width, spd,
(adap->flags & USING_MSIX) ? " MSI-X" : (adap->flags & USING_MSIX) ? " MSI-X" :
(adap->flags & USING_MSI) ? " MSI" : ""); (adap->flags & USING_MSI) ? " MSI" : "");
...@@ -5910,7 +5916,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -5910,7 +5916,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (err) if (err)
goto out_unmap_bar0; goto out_unmap_bar0;
if (!is_t4(adapter->chip)) { if (!is_t4(adapter->params.chip)) {
s_qpp = QUEUESPERPAGEPF1 * adapter->fn; s_qpp = QUEUESPERPAGEPF1 * adapter->fn;
qpp = 1 << QUEUESPERPAGEPF0_GET(t4_read_reg(adapter, qpp = 1 << QUEUESPERPAGEPF0_GET(t4_read_reg(adapter,
SGE_EGRESS_QUEUES_PER_PAGE_PF) >> s_qpp); SGE_EGRESS_QUEUES_PER_PAGE_PF) >> s_qpp);
...@@ -6064,7 +6070,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -6064,7 +6070,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
out_free_dev: out_free_dev:
free_some_resources(adapter); free_some_resources(adapter);
out_unmap_bar: out_unmap_bar:
if (!is_t4(adapter->chip)) if (!is_t4(adapter->params.chip))
iounmap(adapter->bar2); iounmap(adapter->bar2);
out_unmap_bar0: out_unmap_bar0:
iounmap(adapter->regs); iounmap(adapter->regs);
...@@ -6116,7 +6122,7 @@ static void remove_one(struct pci_dev *pdev) ...@@ -6116,7 +6122,7 @@ static void remove_one(struct pci_dev *pdev)
free_some_resources(adapter); free_some_resources(adapter);
iounmap(adapter->regs); iounmap(adapter->regs);
if (!is_t4(adapter->chip)) if (!is_t4(adapter->params.chip))
iounmap(adapter->bar2); iounmap(adapter->bar2);
kfree(adapter); kfree(adapter);
pci_disable_pcie_error_reporting(pdev); pci_disable_pcie_error_reporting(pdev);
......
...@@ -509,7 +509,7 @@ static inline void ring_fl_db(struct adapter *adap, struct sge_fl *q) ...@@ -509,7 +509,7 @@ static inline void ring_fl_db(struct adapter *adap, struct sge_fl *q)
u32 val; u32 val;
if (q->pend_cred >= 8) { if (q->pend_cred >= 8) {
val = PIDX(q->pend_cred / 8); val = PIDX(q->pend_cred / 8);
if (!is_t4(adap->chip)) if (!is_t4(adap->params.chip))
val |= DBTYPE(1); val |= DBTYPE(1);
wmb(); wmb();
t4_write_reg(adap, MYPF_REG(SGE_PF_KDOORBELL), DBPRIO(1) | t4_write_reg(adap, MYPF_REG(SGE_PF_KDOORBELL), DBPRIO(1) |
...@@ -847,7 +847,7 @@ static inline void ring_tx_db(struct adapter *adap, struct sge_txq *q, int n) ...@@ -847,7 +847,7 @@ static inline void ring_tx_db(struct adapter *adap, struct sge_txq *q, int n)
wmb(); /* write descriptors before telling HW */ wmb(); /* write descriptors before telling HW */
spin_lock(&q->db_lock); spin_lock(&q->db_lock);
if (!q->db_disabled) { if (!q->db_disabled) {
if (is_t4(adap->chip)) { if (is_t4(adap->params.chip)) {
t4_write_reg(adap, MYPF_REG(SGE_PF_KDOORBELL), t4_write_reg(adap, MYPF_REG(SGE_PF_KDOORBELL),
QID(q->cntxt_id) | PIDX(n)); QID(q->cntxt_id) | PIDX(n));
} else { } else {
...@@ -1596,7 +1596,7 @@ static noinline int handle_trace_pkt(struct adapter *adap, ...@@ -1596,7 +1596,7 @@ static noinline int handle_trace_pkt(struct adapter *adap,
return 0; return 0;
} }
if (is_t4(adap->chip)) if (is_t4(adap->params.chip))
__skb_pull(skb, sizeof(struct cpl_trace_pkt)); __skb_pull(skb, sizeof(struct cpl_trace_pkt));
else else
__skb_pull(skb, sizeof(struct cpl_t5_trace_pkt)); __skb_pull(skb, sizeof(struct cpl_t5_trace_pkt));
...@@ -1661,7 +1661,7 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp, ...@@ -1661,7 +1661,7 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
const struct cpl_rx_pkt *pkt; const struct cpl_rx_pkt *pkt;
struct sge_eth_rxq *rxq = container_of(q, struct sge_eth_rxq, rspq); struct sge_eth_rxq *rxq = container_of(q, struct sge_eth_rxq, rspq);
struct sge *s = &q->adap->sge; struct sge *s = &q->adap->sge;
int cpl_trace_pkt = is_t4(q->adap->chip) ? int cpl_trace_pkt = is_t4(q->adap->params.chip) ?
CPL_TRACE_PKT : CPL_TRACE_PKT_T5; CPL_TRACE_PKT : CPL_TRACE_PKT_T5;
if (unlikely(*(u8 *)rsp == cpl_trace_pkt)) if (unlikely(*(u8 *)rsp == cpl_trace_pkt))
...@@ -2182,7 +2182,7 @@ int t4_sge_alloc_rxq(struct adapter *adap, struct sge_rspq *iq, bool fwevtq, ...@@ -2182,7 +2182,7 @@ int t4_sge_alloc_rxq(struct adapter *adap, struct sge_rspq *iq, bool fwevtq,
static void init_txq(struct adapter *adap, struct sge_txq *q, unsigned int id) static void init_txq(struct adapter *adap, struct sge_txq *q, unsigned int id)
{ {
q->cntxt_id = id; q->cntxt_id = id;
if (!is_t4(adap->chip)) { if (!is_t4(adap->params.chip)) {
unsigned int s_qpp; unsigned int s_qpp;
unsigned short udb_density; unsigned short udb_density;
unsigned long qpshift; unsigned long qpshift;
...@@ -2641,7 +2641,7 @@ static int t4_sge_init_hard(struct adapter *adap) ...@@ -2641,7 +2641,7 @@ static int t4_sge_init_hard(struct adapter *adap)
* Set up to drop DOORBELL writes when the DOORBELL FIFO overflows * Set up to drop DOORBELL writes when the DOORBELL FIFO overflows
* and generate an interrupt when this occurs so we can recover. * and generate an interrupt when this occurs so we can recover.
*/ */
if (is_t4(adap->chip)) { if (is_t4(adap->params.chip)) {
t4_set_reg_field(adap, A_SGE_DBFIFO_STATUS, t4_set_reg_field(adap, A_SGE_DBFIFO_STATUS,
V_HP_INT_THRESH(M_HP_INT_THRESH) | V_HP_INT_THRESH(M_HP_INT_THRESH) |
V_LP_INT_THRESH(M_LP_INT_THRESH), V_LP_INT_THRESH(M_LP_INT_THRESH),
......
...@@ -296,7 +296,7 @@ int t4_mc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc) ...@@ -296,7 +296,7 @@ int t4_mc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc)
u32 mc_bist_cmd, mc_bist_cmd_addr, mc_bist_cmd_len; u32 mc_bist_cmd, mc_bist_cmd_addr, mc_bist_cmd_len;
u32 mc_bist_status_rdata, mc_bist_data_pattern; u32 mc_bist_status_rdata, mc_bist_data_pattern;
if (is_t4(adap->chip)) { if (is_t4(adap->params.chip)) {
mc_bist_cmd = MC_BIST_CMD; mc_bist_cmd = MC_BIST_CMD;
mc_bist_cmd_addr = MC_BIST_CMD_ADDR; mc_bist_cmd_addr = MC_BIST_CMD_ADDR;
mc_bist_cmd_len = MC_BIST_CMD_LEN; mc_bist_cmd_len = MC_BIST_CMD_LEN;
...@@ -349,7 +349,7 @@ int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc) ...@@ -349,7 +349,7 @@ int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc)
u32 edc_bist_cmd, edc_bist_cmd_addr, edc_bist_cmd_len; u32 edc_bist_cmd, edc_bist_cmd_addr, edc_bist_cmd_len;
u32 edc_bist_cmd_data_pattern, edc_bist_status_rdata; u32 edc_bist_cmd_data_pattern, edc_bist_status_rdata;
if (is_t4(adap->chip)) { if (is_t4(adap->params.chip)) {
edc_bist_cmd = EDC_REG(EDC_BIST_CMD, idx); edc_bist_cmd = EDC_REG(EDC_BIST_CMD, idx);
edc_bist_cmd_addr = EDC_REG(EDC_BIST_CMD_ADDR, idx); edc_bist_cmd_addr = EDC_REG(EDC_BIST_CMD_ADDR, idx);
edc_bist_cmd_len = EDC_REG(EDC_BIST_CMD_LEN, idx); edc_bist_cmd_len = EDC_REG(EDC_BIST_CMD_LEN, idx);
...@@ -402,7 +402,7 @@ int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc) ...@@ -402,7 +402,7 @@ int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc)
static int t4_mem_win_rw(struct adapter *adap, u32 addr, __be32 *data, int dir) static int t4_mem_win_rw(struct adapter *adap, u32 addr, __be32 *data, int dir)
{ {
int i; int i;
u32 win_pf = is_t4(adap->chip) ? 0 : V_PFNUM(adap->fn); u32 win_pf = is_t4(adap->params.chip) ? 0 : V_PFNUM(adap->fn);
/* /*
* Setup offset into PCIE memory window. Address must be a * Setup offset into PCIE memory window. Address must be a
...@@ -863,104 +863,169 @@ static int t4_write_flash(struct adapter *adapter, unsigned int addr, ...@@ -863,104 +863,169 @@ static int t4_write_flash(struct adapter *adapter, unsigned int addr,
} }
/** /**
* get_fw_version - read the firmware version * t4_get_fw_version - read the firmware version
* @adapter: the adapter * @adapter: the adapter
* @vers: where to place the version * @vers: where to place the version
* *
* Reads the FW version from flash. * Reads the FW version from flash.
*/ */
static int get_fw_version(struct adapter *adapter, u32 *vers) int t4_get_fw_version(struct adapter *adapter, u32 *vers)
{ {
return t4_read_flash(adapter, adapter->params.sf_fw_start + return t4_read_flash(adapter, FLASH_FW_START +
offsetof(struct fw_hdr, fw_ver), 1, vers, 0); offsetof(struct fw_hdr, fw_ver), 1,
vers, 0);
} }
/** /**
* get_tp_version - read the TP microcode version * t4_get_tp_version - read the TP microcode version
* @adapter: the adapter * @adapter: the adapter
* @vers: where to place the version * @vers: where to place the version
* *
* Reads the TP microcode version from flash. * Reads the TP microcode version from flash.
*/ */
static int get_tp_version(struct adapter *adapter, u32 *vers) int t4_get_tp_version(struct adapter *adapter, u32 *vers)
{ {
return t4_read_flash(adapter, adapter->params.sf_fw_start + return t4_read_flash(adapter, FLASH_FW_START +
offsetof(struct fw_hdr, tp_microcode_ver), offsetof(struct fw_hdr, tp_microcode_ver),
1, vers, 0); 1, vers, 0);
} }
/** /* Is the given firmware API compatible with the one the driver was compiled
* t4_check_fw_version - check if the FW is compatible with this driver * with?
* @adapter: the adapter
*
* Checks if an adapter's FW is compatible with the driver. Returns 0
* if there's exact match, a negative error if the version could not be
* read or there's a major version mismatch, and a positive value if the
* expected major version is found but there's a minor version mismatch.
*/ */
int t4_check_fw_version(struct adapter *adapter) static int fw_compatible(const struct fw_hdr *hdr1, const struct fw_hdr *hdr2)
{ {
u32 api_vers[2];
int ret, major, minor, micro;
int exp_major, exp_minor, exp_micro;
ret = get_fw_version(adapter, &adapter->params.fw_vers); /* short circuit if it's the exact same firmware version */
if (!ret) if (hdr1->chip == hdr2->chip && hdr1->fw_ver == hdr2->fw_ver)
ret = get_tp_version(adapter, &adapter->params.tp_vers); return 1;
if (!ret)
ret = t4_read_flash(adapter, adapter->params.sf_fw_start +
offsetof(struct fw_hdr, intfver_nic),
2, api_vers, 1);
if (ret)
return ret;
major = FW_HDR_FW_VER_MAJOR_GET(adapter->params.fw_vers); #define SAME_INTF(x) (hdr1->intfver_##x == hdr2->intfver_##x)
minor = FW_HDR_FW_VER_MINOR_GET(adapter->params.fw_vers); if (hdr1->chip == hdr2->chip && SAME_INTF(nic) && SAME_INTF(vnic) &&
micro = FW_HDR_FW_VER_MICRO_GET(adapter->params.fw_vers); SAME_INTF(ri) && SAME_INTF(iscsi) && SAME_INTF(fcoe))
return 1;
#undef SAME_INTF
switch (CHELSIO_CHIP_VERSION(adapter->chip)) { return 0;
case CHELSIO_T4: }
exp_major = FW_VERSION_MAJOR;
exp_minor = FW_VERSION_MINOR;
exp_micro = FW_VERSION_MICRO;
break;
case CHELSIO_T5:
exp_major = FW_VERSION_MAJOR_T5;
exp_minor = FW_VERSION_MINOR_T5;
exp_micro = FW_VERSION_MICRO_T5;
break;
default:
dev_err(adapter->pdev_dev, "Unsupported chip type, %x\n",
adapter->chip);
return -EINVAL;
}
memcpy(adapter->params.api_vers, api_vers, /* The firmware in the filesystem is usable, but should it be installed?
sizeof(adapter->params.api_vers)); * This routine explains itself in detail if it indicates the filesystem
* firmware should be installed.
*/
static int should_install_fs_fw(struct adapter *adap, int card_fw_usable,
int k, int c)
{
const char *reason;
if (major < exp_major || (major == exp_major && minor < exp_minor) || if (!card_fw_usable) {
(major == exp_major && minor == exp_minor && micro < exp_micro)) { reason = "incompatible or unusable";
dev_err(adapter->pdev_dev, goto install;
"Card has firmware version %u.%u.%u, minimum "
"supported firmware is %u.%u.%u.\n", major, minor,
micro, exp_major, exp_minor, exp_micro);
return -EFAULT;
} }
if (major != exp_major) { /* major mismatch - fail */ if (k > c) {
dev_err(adapter->pdev_dev, reason = "older than the version supported with this driver";
"card FW has major version %u, driver wants %u\n", goto install;
major, exp_major);
return -EINVAL;
} }
if (minor == exp_minor && micro == exp_micro) return 0;
return 0; /* perfect match */
install:
dev_err(adap->pdev_dev, "firmware on card (%u.%u.%u.%u) is %s, "
"installing firmware %u.%u.%u.%u on card.\n",
FW_HDR_FW_VER_MAJOR_GET(c), FW_HDR_FW_VER_MINOR_GET(c),
FW_HDR_FW_VER_MICRO_GET(c), FW_HDR_FW_VER_BUILD_GET(c), reason,
FW_HDR_FW_VER_MAJOR_GET(k), FW_HDR_FW_VER_MINOR_GET(k),
FW_HDR_FW_VER_MICRO_GET(k), FW_HDR_FW_VER_BUILD_GET(k));
/* Minor/micro version mismatch. Report it but often it's OK. */
return 1; return 1;
} }
int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info,
const u8 *fw_data, unsigned int fw_size,
struct fw_hdr *card_fw, enum dev_state state,
int *reset)
{
int ret, card_fw_usable, fs_fw_usable;
const struct fw_hdr *fs_fw;
const struct fw_hdr *drv_fw;
drv_fw = &fw_info->fw_hdr;
/* Read the header of the firmware on the card */
ret = -t4_read_flash(adap, FLASH_FW_START,
sizeof(*card_fw) / sizeof(uint32_t),
(uint32_t *)card_fw, 1);
if (ret == 0) {
card_fw_usable = fw_compatible(drv_fw, (const void *)card_fw);
} else {
dev_err(adap->pdev_dev,
"Unable to read card's firmware header: %d\n", ret);
card_fw_usable = 0;
}
if (fw_data != NULL) {
fs_fw = (const void *)fw_data;
fs_fw_usable = fw_compatible(drv_fw, fs_fw);
} else {
fs_fw = NULL;
fs_fw_usable = 0;
}
if (card_fw_usable && card_fw->fw_ver == drv_fw->fw_ver &&
(!fs_fw_usable || fs_fw->fw_ver == drv_fw->fw_ver)) {
/* Common case: the firmware on the card is an exact match and
* the filesystem one is an exact match too, or the filesystem
* one is absent/incompatible.
*/
} else if (fs_fw_usable && state == DEV_STATE_UNINIT &&
should_install_fs_fw(adap, card_fw_usable,
be32_to_cpu(fs_fw->fw_ver),
be32_to_cpu(card_fw->fw_ver))) {
ret = -t4_fw_upgrade(adap, adap->mbox, fw_data,
fw_size, 0);
if (ret != 0) {
dev_err(adap->pdev_dev,
"failed to install firmware: %d\n", ret);
goto bye;
}
/* Installed successfully, update the cached header too. */
memcpy(card_fw, fs_fw, sizeof(*card_fw));
card_fw_usable = 1;
*reset = 0; /* already reset as part of load_fw */
}
if (!card_fw_usable) {
uint32_t d, c, k;
d = be32_to_cpu(drv_fw->fw_ver);
c = be32_to_cpu(card_fw->fw_ver);
k = fs_fw ? be32_to_cpu(fs_fw->fw_ver) : 0;
dev_err(adap->pdev_dev, "Cannot find a usable firmware: "
"chip state %d, "
"driver compiled with %d.%d.%d.%d, "
"card has %d.%d.%d.%d, filesystem has %d.%d.%d.%d\n",
state,
FW_HDR_FW_VER_MAJOR_GET(d), FW_HDR_FW_VER_MINOR_GET(d),
FW_HDR_FW_VER_MICRO_GET(d), FW_HDR_FW_VER_BUILD_GET(d),
FW_HDR_FW_VER_MAJOR_GET(c), FW_HDR_FW_VER_MINOR_GET(c),
FW_HDR_FW_VER_MICRO_GET(c), FW_HDR_FW_VER_BUILD_GET(c),
FW_HDR_FW_VER_MAJOR_GET(k), FW_HDR_FW_VER_MINOR_GET(k),
FW_HDR_FW_VER_MICRO_GET(k), FW_HDR_FW_VER_BUILD_GET(k));
ret = EINVAL;
goto bye;
}
/* We're using whatever's on the card and it's known to be good. */
adap->params.fw_vers = be32_to_cpu(card_fw->fw_ver);
adap->params.tp_vers = be32_to_cpu(card_fw->tp_microcode_ver);
bye:
return ret;
}
/** /**
* t4_flash_erase_sectors - erase a range of flash sectors * t4_flash_erase_sectors - erase a range of flash sectors
* @adapter: the adapter * @adapter: the adapter
...@@ -1368,7 +1433,7 @@ static void pcie_intr_handler(struct adapter *adapter) ...@@ -1368,7 +1433,7 @@ static void pcie_intr_handler(struct adapter *adapter)
PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS, PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS,
pcie_port_intr_info) + pcie_port_intr_info) +
t4_handle_intr_status(adapter, PCIE_INT_CAUSE, t4_handle_intr_status(adapter, PCIE_INT_CAUSE,
is_t4(adapter->chip) ? is_t4(adapter->params.chip) ?
pcie_intr_info : t5_pcie_intr_info); pcie_intr_info : t5_pcie_intr_info);
if (fat) if (fat)
...@@ -1782,7 +1847,7 @@ static void xgmac_intr_handler(struct adapter *adap, int port) ...@@ -1782,7 +1847,7 @@ static void xgmac_intr_handler(struct adapter *adap, int port)
{ {
u32 v, int_cause_reg; u32 v, int_cause_reg;
if (is_t4(adap->chip)) if (is_t4(adap->params.chip))
int_cause_reg = PORT_REG(port, XGMAC_PORT_INT_CAUSE); int_cause_reg = PORT_REG(port, XGMAC_PORT_INT_CAUSE);
else else
int_cause_reg = T5_PORT_REG(port, MAC_PORT_INT_CAUSE); int_cause_reg = T5_PORT_REG(port, MAC_PORT_INT_CAUSE);
...@@ -2250,7 +2315,7 @@ void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p) ...@@ -2250,7 +2315,7 @@ void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p)
#define GET_STAT(name) \ #define GET_STAT(name) \
t4_read_reg64(adap, \ t4_read_reg64(adap, \
(is_t4(adap->chip) ? PORT_REG(idx, MPS_PORT_STAT_##name##_L) : \ (is_t4(adap->params.chip) ? PORT_REG(idx, MPS_PORT_STAT_##name##_L) : \
T5_PORT_REG(idx, MPS_PORT_STAT_##name##_L))) T5_PORT_REG(idx, MPS_PORT_STAT_##name##_L)))
#define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L) #define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L)
...@@ -2332,7 +2397,7 @@ void t4_wol_magic_enable(struct adapter *adap, unsigned int port, ...@@ -2332,7 +2397,7 @@ void t4_wol_magic_enable(struct adapter *adap, unsigned int port,
{ {
u32 mag_id_reg_l, mag_id_reg_h, port_cfg_reg; u32 mag_id_reg_l, mag_id_reg_h, port_cfg_reg;
if (is_t4(adap->chip)) { if (is_t4(adap->params.chip)) {
mag_id_reg_l = PORT_REG(port, XGMAC_PORT_MAGIC_MACID_LO); mag_id_reg_l = PORT_REG(port, XGMAC_PORT_MAGIC_MACID_LO);
mag_id_reg_h = PORT_REG(port, XGMAC_PORT_MAGIC_MACID_HI); mag_id_reg_h = PORT_REG(port, XGMAC_PORT_MAGIC_MACID_HI);
port_cfg_reg = PORT_REG(port, XGMAC_PORT_CFG2); port_cfg_reg = PORT_REG(port, XGMAC_PORT_CFG2);
...@@ -2374,7 +2439,7 @@ int t4_wol_pat_enable(struct adapter *adap, unsigned int port, unsigned int map, ...@@ -2374,7 +2439,7 @@ int t4_wol_pat_enable(struct adapter *adap, unsigned int port, unsigned int map,
int i; int i;
u32 port_cfg_reg; u32 port_cfg_reg;
if (is_t4(adap->chip)) if (is_t4(adap->params.chip))
port_cfg_reg = PORT_REG(port, XGMAC_PORT_CFG2); port_cfg_reg = PORT_REG(port, XGMAC_PORT_CFG2);
else else
port_cfg_reg = T5_PORT_REG(port, MAC_PORT_CFG2); port_cfg_reg = T5_PORT_REG(port, MAC_PORT_CFG2);
...@@ -2387,7 +2452,7 @@ int t4_wol_pat_enable(struct adapter *adap, unsigned int port, unsigned int map, ...@@ -2387,7 +2452,7 @@ int t4_wol_pat_enable(struct adapter *adap, unsigned int port, unsigned int map,
return -EINVAL; return -EINVAL;
#define EPIO_REG(name) \ #define EPIO_REG(name) \
(is_t4(adap->chip) ? PORT_REG(port, XGMAC_PORT_EPIO_##name) : \ (is_t4(adap->params.chip) ? PORT_REG(port, XGMAC_PORT_EPIO_##name) : \
T5_PORT_REG(port, MAC_PORT_EPIO_##name)) T5_PORT_REG(port, MAC_PORT_EPIO_##name))
t4_write_reg(adap, EPIO_REG(DATA1), mask0 >> 32); t4_write_reg(adap, EPIO_REG(DATA1), mask0 >> 32);
...@@ -2474,7 +2539,7 @@ int t4_fwaddrspace_write(struct adapter *adap, unsigned int mbox, ...@@ -2474,7 +2539,7 @@ int t4_fwaddrspace_write(struct adapter *adap, unsigned int mbox,
int t4_mem_win_read_len(struct adapter *adap, u32 addr, __be32 *data, int len) int t4_mem_win_read_len(struct adapter *adap, u32 addr, __be32 *data, int len)
{ {
int i, off; int i, off;
u32 win_pf = is_t4(adap->chip) ? 0 : V_PFNUM(adap->fn); u32 win_pf = is_t4(adap->params.chip) ? 0 : V_PFNUM(adap->fn);
/* Align on a 2KB boundary. /* Align on a 2KB boundary.
*/ */
...@@ -3306,7 +3371,7 @@ int t4_alloc_mac_filt(struct adapter *adap, unsigned int mbox, ...@@ -3306,7 +3371,7 @@ int t4_alloc_mac_filt(struct adapter *adap, unsigned int mbox,
int i, ret; int i, ret;
struct fw_vi_mac_cmd c; struct fw_vi_mac_cmd c;
struct fw_vi_mac_exact *p; struct fw_vi_mac_exact *p;
unsigned int max_naddr = is_t4(adap->chip) ? unsigned int max_naddr = is_t4(adap->params.chip) ?
NUM_MPS_CLS_SRAM_L_INSTANCES : NUM_MPS_CLS_SRAM_L_INSTANCES :
NUM_MPS_T5_CLS_SRAM_L_INSTANCES; NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
...@@ -3368,7 +3433,7 @@ int t4_change_mac(struct adapter *adap, unsigned int mbox, unsigned int viid, ...@@ -3368,7 +3433,7 @@ int t4_change_mac(struct adapter *adap, unsigned int mbox, unsigned int viid,
int ret, mode; int ret, mode;
struct fw_vi_mac_cmd c; struct fw_vi_mac_cmd c;
struct fw_vi_mac_exact *p = c.u.exact; struct fw_vi_mac_exact *p = c.u.exact;
unsigned int max_mac_addr = is_t4(adap->chip) ? unsigned int max_mac_addr = is_t4(adap->params.chip) ?
NUM_MPS_CLS_SRAM_L_INSTANCES : NUM_MPS_CLS_SRAM_L_INSTANCES :
NUM_MPS_T5_CLS_SRAM_L_INSTANCES; NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
...@@ -3699,13 +3764,14 @@ int t4_prep_adapter(struct adapter *adapter) ...@@ -3699,13 +3764,14 @@ int t4_prep_adapter(struct adapter *adapter)
{ {
int ret, ver; int ret, ver;
uint16_t device_id; uint16_t device_id;
u32 pl_rev;
ret = t4_wait_dev_ready(adapter); ret = t4_wait_dev_ready(adapter);
if (ret < 0) if (ret < 0)
return ret; return ret;
get_pci_mode(adapter, &adapter->params.pci); get_pci_mode(adapter, &adapter->params.pci);
adapter->params.rev = t4_read_reg(adapter, PL_REV); pl_rev = G_REV(t4_read_reg(adapter, PL_REV));
ret = get_flash_params(adapter); ret = get_flash_params(adapter);
if (ret < 0) { if (ret < 0) {
...@@ -3717,14 +3783,13 @@ int t4_prep_adapter(struct adapter *adapter) ...@@ -3717,14 +3783,13 @@ int t4_prep_adapter(struct adapter *adapter)
*/ */
pci_read_config_word(adapter->pdev, PCI_DEVICE_ID, &device_id); pci_read_config_word(adapter->pdev, PCI_DEVICE_ID, &device_id);
ver = device_id >> 12; ver = device_id >> 12;
adapter->params.chip = 0;
switch (ver) { switch (ver) {
case CHELSIO_T4: case CHELSIO_T4:
adapter->chip = CHELSIO_CHIP_CODE(CHELSIO_T4, adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T4, pl_rev);
adapter->params.rev);
break; break;
case CHELSIO_T5: case CHELSIO_T5:
adapter->chip = CHELSIO_CHIP_CODE(CHELSIO_T5, adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T5, pl_rev);
adapter->params.rev);
break; break;
default: default:
dev_err(adapter->pdev_dev, "Device %d is not supported\n", dev_err(adapter->pdev_dev, "Device %d is not supported\n",
...@@ -3732,9 +3797,6 @@ int t4_prep_adapter(struct adapter *adapter) ...@@ -3732,9 +3797,6 @@ int t4_prep_adapter(struct adapter *adapter)
return -EINVAL; return -EINVAL;
} }
/* Reassign the updated revision field */
adapter->params.rev = adapter->chip;
init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd); init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd);
/* /*
......
...@@ -1092,6 +1092,11 @@ ...@@ -1092,6 +1092,11 @@
#define PL_REV 0x1943c #define PL_REV 0x1943c
#define S_REV 0
#define M_REV 0xfU
#define V_REV(x) ((x) << S_REV)
#define G_REV(x) (((x) >> S_REV) & M_REV)
#define LE_DB_CONFIG 0x19c04 #define LE_DB_CONFIG 0x19c04
#define HASHEN 0x00100000U #define HASHEN 0x00100000U
...@@ -1199,4 +1204,13 @@ ...@@ -1199,4 +1204,13 @@
#define EDC_STRIDE_T5 (EDC_T51_BASE_ADDR - EDC_T50_BASE_ADDR) #define EDC_STRIDE_T5 (EDC_T51_BASE_ADDR - EDC_T50_BASE_ADDR)
#define EDC_REG_T5(reg, idx) (reg + EDC_STRIDE_T5 * idx) #define EDC_REG_T5(reg, idx) (reg + EDC_STRIDE_T5 * idx)
#define A_PL_VF_REV 0x4
#define A_PL_VF_WHOAMI 0x0
#define A_PL_VF_REVISION 0x8
#define S_CHIPID 4
#define M_CHIPID 0xfU
#define V_CHIPID(x) ((x) << S_CHIPID)
#define G_CHIPID(x) (((x) >> S_CHIPID) & M_CHIPID)
#endif /* __T4_REGS_H */ #endif /* __T4_REGS_H */
...@@ -2157,7 +2157,7 @@ struct fw_debug_cmd { ...@@ -2157,7 +2157,7 @@ struct fw_debug_cmd {
struct fw_hdr { struct fw_hdr {
u8 ver; u8 ver;
u8 reserved1; u8 chip; /* terminator chip type */
__be16 len512; /* bin length in units of 512-bytes */ __be16 len512; /* bin length in units of 512-bytes */
__be32 fw_ver; /* firmware version */ __be32 fw_ver; /* firmware version */
__be32 tp_microcode_ver; __be32 tp_microcode_ver;
...@@ -2176,6 +2176,11 @@ struct fw_hdr { ...@@ -2176,6 +2176,11 @@ struct fw_hdr {
__be32 reserved6[23]; __be32 reserved6[23];
}; };
enum fw_hdr_chip {
FW_HDR_CHIP_T4,
FW_HDR_CHIP_T5
};
#define FW_HDR_FW_VER_MAJOR_GET(x) (((x) >> 24) & 0xff) #define FW_HDR_FW_VER_MAJOR_GET(x) (((x) >> 24) & 0xff)
#define FW_HDR_FW_VER_MINOR_GET(x) (((x) >> 16) & 0xff) #define FW_HDR_FW_VER_MINOR_GET(x) (((x) >> 16) & 0xff)
#define FW_HDR_FW_VER_MICRO_GET(x) (((x) >> 8) & 0xff) #define FW_HDR_FW_VER_MICRO_GET(x) (((x) >> 8) & 0xff)
......
...@@ -344,7 +344,6 @@ struct adapter { ...@@ -344,7 +344,6 @@ struct adapter {
unsigned long registered_device_map; unsigned long registered_device_map;
unsigned long open_device_map; unsigned long open_device_map;
unsigned long flags; unsigned long flags;
enum chip_type chip;
struct adapter_params params; struct adapter_params params;
/* queue and interrupt resources */ /* queue and interrupt resources */
......
...@@ -1064,7 +1064,7 @@ static inline unsigned int mk_adap_vers(const struct adapter *adapter) ...@@ -1064,7 +1064,7 @@ static inline unsigned int mk_adap_vers(const struct adapter *adapter)
/* /*
* Chip version 4, revision 0x3f (cxgb4vf). * Chip version 4, revision 0x3f (cxgb4vf).
*/ */
return CHELSIO_CHIP_VERSION(adapter->chip) | (0x3f << 10); return CHELSIO_CHIP_VERSION(adapter->params.chip) | (0x3f << 10);
} }
/* /*
...@@ -1551,9 +1551,13 @@ static void cxgb4vf_get_regs(struct net_device *dev, ...@@ -1551,9 +1551,13 @@ static void cxgb4vf_get_regs(struct net_device *dev,
reg_block_dump(adapter, regbuf, reg_block_dump(adapter, regbuf,
T4VF_MPS_BASE_ADDR + T4VF_MOD_MAP_MPS_FIRST, T4VF_MPS_BASE_ADDR + T4VF_MOD_MAP_MPS_FIRST,
T4VF_MPS_BASE_ADDR + T4VF_MOD_MAP_MPS_LAST); T4VF_MPS_BASE_ADDR + T4VF_MOD_MAP_MPS_LAST);
/* T5 adds new registers in the PL Register map.
*/
reg_block_dump(adapter, regbuf, reg_block_dump(adapter, regbuf,
T4VF_PL_BASE_ADDR + T4VF_MOD_MAP_PL_FIRST, T4VF_PL_BASE_ADDR + T4VF_MOD_MAP_PL_FIRST,
T4VF_PL_BASE_ADDR + T4VF_MOD_MAP_PL_LAST); T4VF_PL_BASE_ADDR + (is_t4(adapter->params.chip)
? A_PL_VF_WHOAMI : A_PL_VF_REVISION));
reg_block_dump(adapter, regbuf, reg_block_dump(adapter, regbuf,
T4VF_CIM_BASE_ADDR + T4VF_MOD_MAP_CIM_FIRST, T4VF_CIM_BASE_ADDR + T4VF_MOD_MAP_CIM_FIRST,
T4VF_CIM_BASE_ADDR + T4VF_MOD_MAP_CIM_LAST); T4VF_CIM_BASE_ADDR + T4VF_MOD_MAP_CIM_LAST);
...@@ -2087,6 +2091,7 @@ static int adap_init0(struct adapter *adapter) ...@@ -2087,6 +2091,7 @@ static int adap_init0(struct adapter *adapter)
unsigned int ethqsets; unsigned int ethqsets;
int err; int err;
u32 param, val = 0; u32 param, val = 0;
unsigned int chipid;
/* /*
* Wait for the device to become ready before proceeding ... * Wait for the device to become ready before proceeding ...
...@@ -2114,12 +2119,14 @@ static int adap_init0(struct adapter *adapter) ...@@ -2114,12 +2119,14 @@ static int adap_init0(struct adapter *adapter)
return err; return err;
} }
adapter->params.chip = 0;
switch (adapter->pdev->device >> 12) { switch (adapter->pdev->device >> 12) {
case CHELSIO_T4: case CHELSIO_T4:
adapter->chip = CHELSIO_CHIP_CODE(CHELSIO_T4, 0); adapter->params.chip = CHELSIO_CHIP_CODE(CHELSIO_T4, 0);
break; break;
case CHELSIO_T5: case CHELSIO_T5:
adapter->chip = CHELSIO_CHIP_CODE(CHELSIO_T5, 0); chipid = G_REV(t4_read_reg(adapter, A_PL_VF_REV));
adapter->params.chip |= CHELSIO_CHIP_CODE(CHELSIO_T5, chipid);
break; break;
} }
......
...@@ -537,7 +537,7 @@ static inline void ring_fl_db(struct adapter *adapter, struct sge_fl *fl) ...@@ -537,7 +537,7 @@ static inline void ring_fl_db(struct adapter *adapter, struct sge_fl *fl)
*/ */
if (fl->pend_cred >= FL_PER_EQ_UNIT) { if (fl->pend_cred >= FL_PER_EQ_UNIT) {
val = PIDX(fl->pend_cred / FL_PER_EQ_UNIT); val = PIDX(fl->pend_cred / FL_PER_EQ_UNIT);
if (!is_t4(adapter->chip)) if (!is_t4(adapter->params.chip))
val |= DBTYPE(1); val |= DBTYPE(1);
wmb(); wmb();
t4_write_reg(adapter, T4VF_SGE_BASE_ADDR + SGE_VF_KDOORBELL, t4_write_reg(adapter, T4VF_SGE_BASE_ADDR + SGE_VF_KDOORBELL,
......
...@@ -39,21 +39,28 @@ ...@@ -39,21 +39,28 @@
#include "../cxgb4/t4fw_api.h" #include "../cxgb4/t4fw_api.h"
#define CHELSIO_CHIP_CODE(version, revision) (((version) << 4) | (revision)) #define CHELSIO_CHIP_CODE(version, revision) (((version) << 4) | (revision))
#define CHELSIO_CHIP_VERSION(code) ((code) >> 4) #define CHELSIO_CHIP_VERSION(code) (((code) >> 4) & 0xf)
#define CHELSIO_CHIP_RELEASE(code) ((code) & 0xf) #define CHELSIO_CHIP_RELEASE(code) ((code) & 0xf)
/* All T4 and later chips have their PCI-E Device IDs encoded as 0xVFPP where:
*
* V = "4" for T4; "5" for T5, etc. or
* = "a" for T4 FPGA; "b" for T4 FPGA, etc.
* F = "0" for PF 0..3; "4".."7" for PF4..7; and "8" for VFs
* PP = adapter product designation
*/
#define CHELSIO_T4 0x4 #define CHELSIO_T4 0x4
#define CHELSIO_T5 0x5 #define CHELSIO_T5 0x5
enum chip_type { enum chip_type {
T4_A1 = CHELSIO_CHIP_CODE(CHELSIO_T4, 0), T4_A1 = CHELSIO_CHIP_CODE(CHELSIO_T4, 1),
T4_A2 = CHELSIO_CHIP_CODE(CHELSIO_T4, 1), T4_A2 = CHELSIO_CHIP_CODE(CHELSIO_T4, 2),
T4_A3 = CHELSIO_CHIP_CODE(CHELSIO_T4, 2),
T4_FIRST_REV = T4_A1, T4_FIRST_REV = T4_A1,
T4_LAST_REV = T4_A3, T4_LAST_REV = T4_A2,
T5_A1 = CHELSIO_CHIP_CODE(CHELSIO_T5, 0), T5_A0 = CHELSIO_CHIP_CODE(CHELSIO_T5, 0),
T5_FIRST_REV = T5_A1, T5_A1 = CHELSIO_CHIP_CODE(CHELSIO_T5, 1),
T5_FIRST_REV = T5_A0,
T5_LAST_REV = T5_A1, T5_LAST_REV = T5_A1,
}; };
...@@ -203,6 +210,7 @@ struct adapter_params { ...@@ -203,6 +210,7 @@ struct adapter_params {
struct vpd_params vpd; /* Vital Product Data */ struct vpd_params vpd; /* Vital Product Data */
struct rss_params rss; /* Receive Side Scaling */ struct rss_params rss; /* Receive Side Scaling */
struct vf_resources vfres; /* Virtual Function Resource limits */ struct vf_resources vfres; /* Virtual Function Resource limits */
enum chip_type chip; /* chip code */
u8 nports; /* # of Ethernet "ports" */ u8 nports; /* # of Ethernet "ports" */
}; };
...@@ -253,7 +261,7 @@ static inline int t4vf_wr_mbox_ns(struct adapter *adapter, const void *cmd, ...@@ -253,7 +261,7 @@ static inline int t4vf_wr_mbox_ns(struct adapter *adapter, const void *cmd,
static inline int is_t4(enum chip_type chip) static inline int is_t4(enum chip_type chip)
{ {
return (chip >= T4_FIRST_REV && chip <= T4_LAST_REV); return CHELSIO_CHIP_VERSION(chip) == CHELSIO_T4;
} }
int t4vf_wait_dev_ready(struct adapter *); int t4vf_wait_dev_ready(struct adapter *);
......
...@@ -1027,7 +1027,7 @@ int t4vf_alloc_mac_filt(struct adapter *adapter, unsigned int viid, bool free, ...@@ -1027,7 +1027,7 @@ int t4vf_alloc_mac_filt(struct adapter *adapter, unsigned int viid, bool free,
unsigned nfilters = 0; unsigned nfilters = 0;
unsigned int rem = naddr; unsigned int rem = naddr;
struct fw_vi_mac_cmd cmd, rpl; struct fw_vi_mac_cmd cmd, rpl;
unsigned int max_naddr = is_t4(adapter->chip) ? unsigned int max_naddr = is_t4(adapter->params.chip) ?
NUM_MPS_CLS_SRAM_L_INSTANCES : NUM_MPS_CLS_SRAM_L_INSTANCES :
NUM_MPS_T5_CLS_SRAM_L_INSTANCES; NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
...@@ -1121,7 +1121,7 @@ int t4vf_change_mac(struct adapter *adapter, unsigned int viid, ...@@ -1121,7 +1121,7 @@ int t4vf_change_mac(struct adapter *adapter, unsigned int viid,
struct fw_vi_mac_exact *p = &cmd.u.exact[0]; struct fw_vi_mac_exact *p = &cmd.u.exact[0];
size_t len16 = DIV_ROUND_UP(offsetof(struct fw_vi_mac_cmd, size_t len16 = DIV_ROUND_UP(offsetof(struct fw_vi_mac_cmd,
u.exact[1]), 16); u.exact[1]), 16);
unsigned int max_naddr = is_t4(adapter->chip) ? unsigned int max_naddr = is_t4(adapter->params.chip) ?
NUM_MPS_CLS_SRAM_L_INSTANCES : NUM_MPS_CLS_SRAM_L_INSTANCES :
NUM_MPS_T5_CLS_SRAM_L_INSTANCES; NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment