Commit 622c62b5 authored by Santosh Rastapur's avatar Santosh Rastapur Committed by David S. Miller

cxgb4vf: Add support for Chelsio T5 adapter

Signed-off-by: default avatarSantosh Rastapur <santosh@chelsio.com>
Signed-off-by: default avatarVipul Pandya <vipul@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7d6727cf
...@@ -344,6 +344,7 @@ struct adapter { ...@@ -344,6 +344,7 @@ 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 */
......
...@@ -54,8 +54,8 @@ ...@@ -54,8 +54,8 @@
/* /*
* Generic information about the driver. * Generic information about the driver.
*/ */
#define DRV_VERSION "1.0.0" #define DRV_VERSION "2.0.0-ko"
#define DRV_DESC "Chelsio T4 Virtual Function (VF) Network Driver" #define DRV_DESC "Chelsio T4/T5 Virtual Function (VF) Network Driver"
/* /*
* Module Parameters. * Module Parameters.
...@@ -1050,7 +1050,7 @@ static inline unsigned int mk_adap_vers(const struct adapter *adapter) ...@@ -1050,7 +1050,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 4 | (0x3f << 10); return CHELSIO_CHIP_VERSION(adapter->chip) | (0x3f << 10);
} }
/* /*
...@@ -2099,6 +2099,15 @@ static int adap_init0(struct adapter *adapter) ...@@ -2099,6 +2099,15 @@ static int adap_init0(struct adapter *adapter)
return err; return err;
} }
switch (adapter->pdev->device >> 12) {
case CHELSIO_T4:
adapter->chip = CHELSIO_CHIP_CODE(CHELSIO_T4, 0);
break;
case CHELSIO_T5:
adapter->chip = CHELSIO_CHIP_CODE(CHELSIO_T5, 0);
break;
}
/* /*
* Grab basic operational parameters. These will predominantly have * Grab basic operational parameters. These will predominantly have
* been set up by the Physical Function Driver or will be hard coded * been set up by the Physical Function Driver or will be hard coded
...@@ -2888,6 +2897,26 @@ static struct pci_device_id cxgb4vf_pci_tbl[] = { ...@@ -2888,6 +2897,26 @@ static struct pci_device_id cxgb4vf_pci_tbl[] = {
CH_DEVICE(0x480a, 0), /* T404-bt */ CH_DEVICE(0x480a, 0), /* T404-bt */
CH_DEVICE(0x480d, 0), /* T480-cr */ CH_DEVICE(0x480d, 0), /* T480-cr */
CH_DEVICE(0x480e, 0), /* T440-lp-cr */ CH_DEVICE(0x480e, 0), /* T440-lp-cr */
CH_DEVICE(0x5800, 0), /* T580-dbg */
CH_DEVICE(0x5801, 0), /* T520-cr */
CH_DEVICE(0x5802, 0), /* T522-cr */
CH_DEVICE(0x5803, 0), /* T540-cr */
CH_DEVICE(0x5804, 0), /* T520-bch */
CH_DEVICE(0x5805, 0), /* T540-bch */
CH_DEVICE(0x5806, 0), /* T540-ch */
CH_DEVICE(0x5807, 0), /* T520-so */
CH_DEVICE(0x5808, 0), /* T520-cx */
CH_DEVICE(0x5809, 0), /* T520-bt */
CH_DEVICE(0x580a, 0), /* T504-bt */
CH_DEVICE(0x580b, 0), /* T520-sr */
CH_DEVICE(0x580c, 0), /* T504-bt */
CH_DEVICE(0x580d, 0), /* T580-cr */
CH_DEVICE(0x580e, 0), /* T540-lp-cr */
CH_DEVICE(0x580f, 0), /* Amsterdam */
CH_DEVICE(0x5810, 0), /* T580-lp-cr */
CH_DEVICE(0x5811, 0), /* T520-lp-cr */
CH_DEVICE(0x5812, 0), /* T560-cr */
CH_DEVICE(0x5813, 0), /* T580-cr */
{ 0, } { 0, }
}; };
......
...@@ -528,17 +528,21 @@ static void unmap_rx_buf(struct adapter *adapter, struct sge_fl *fl) ...@@ -528,17 +528,21 @@ static void unmap_rx_buf(struct adapter *adapter, struct sge_fl *fl)
*/ */
static inline void ring_fl_db(struct adapter *adapter, struct sge_fl *fl) static inline void ring_fl_db(struct adapter *adapter, struct sge_fl *fl)
{ {
u32 val;
/* /*
* The SGE keeps track of its Producer and Consumer Indices in terms * The SGE keeps track of its Producer and Consumer Indices in terms
* of Egress Queue Units so we can only tell it about integral numbers * of Egress Queue Units so we can only tell it about integral numbers
* of multiples of Free List Entries per Egress Queue Units ... * of multiples of Free List Entries per Egress Queue Units ...
*/ */
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);
if (!is_t4(adapter->chip))
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,
DBPRIO(1) | DBPRIO(1) |
QID(fl->cntxt_id) | QID(fl->cntxt_id) | val);
PIDX(fl->pend_cred / FL_PER_EQ_UNIT));
fl->pend_cred %= FL_PER_EQ_UNIT; fl->pend_cred %= FL_PER_EQ_UNIT;
} }
} }
......
...@@ -38,6 +38,25 @@ ...@@ -38,6 +38,25 @@
#include "../cxgb4/t4fw_api.h" #include "../cxgb4/t4fw_api.h"
#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,
};
/* /*
* The "len16" field of a Firmware Command Structure ... * The "len16" field of a Firmware Command Structure ...
*/ */
...@@ -232,6 +251,11 @@ static inline int t4vf_wr_mbox_ns(struct adapter *adapter, const void *cmd, ...@@ -232,6 +251,11 @@ static inline int t4vf_wr_mbox_ns(struct adapter *adapter, const void *cmd,
return t4vf_wr_mbox_core(adapter, cmd, size, rpl, false); return t4vf_wr_mbox_core(adapter, cmd, size, rpl, false);
} }
static inline int is_t4(enum chip_type chip)
{
return (chip >= T4_FIRST_REV && chip <= T4_LAST_REV);
}
int t4vf_wait_dev_ready(struct adapter *); int t4vf_wait_dev_ready(struct adapter *);
int t4vf_port_init(struct adapter *, int); int t4vf_port_init(struct adapter *, int);
......
...@@ -1027,8 +1027,11 @@ int t4vf_alloc_mac_filt(struct adapter *adapter, unsigned int viid, bool free, ...@@ -1027,8 +1027,11 @@ 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) ?
NUM_MPS_CLS_SRAM_L_INSTANCES :
NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
if (naddr > FW_CLS_TCAM_NUM_ENTRIES) if (naddr > max_naddr)
return -EINVAL; return -EINVAL;
for (offset = 0; offset < naddr; /**/) { for (offset = 0; offset < naddr; /**/) {
...@@ -1069,10 +1072,10 @@ int t4vf_alloc_mac_filt(struct adapter *adapter, unsigned int viid, bool free, ...@@ -1069,10 +1072,10 @@ int t4vf_alloc_mac_filt(struct adapter *adapter, unsigned int viid, bool free,
if (idx) if (idx)
idx[offset+i] = idx[offset+i] =
(index >= FW_CLS_TCAM_NUM_ENTRIES (index >= max_naddr
? 0xffff ? 0xffff
: index); : index);
if (index < FW_CLS_TCAM_NUM_ENTRIES) if (index < max_naddr)
nfilters++; nfilters++;
else if (hash) else if (hash)
*hash |= (1ULL << hash_mac_addr(addr[offset+i])); *hash |= (1ULL << hash_mac_addr(addr[offset+i]));
...@@ -1118,6 +1121,9 @@ int t4vf_change_mac(struct adapter *adapter, unsigned int viid, ...@@ -1118,6 +1121,9 @@ 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) ?
NUM_MPS_CLS_SRAM_L_INSTANCES :
NUM_MPS_T5_CLS_SRAM_L_INSTANCES;
/* /*
* If this is a new allocation, determine whether it should be * If this is a new allocation, determine whether it should be
...@@ -1140,7 +1146,7 @@ int t4vf_change_mac(struct adapter *adapter, unsigned int viid, ...@@ -1140,7 +1146,7 @@ int t4vf_change_mac(struct adapter *adapter, unsigned int viid,
if (ret == 0) { if (ret == 0) {
p = &rpl.u.exact[0]; p = &rpl.u.exact[0];
ret = FW_VI_MAC_CMD_IDX_GET(be16_to_cpu(p->valid_to_idx)); ret = FW_VI_MAC_CMD_IDX_GET(be16_to_cpu(p->valid_to_idx));
if (ret >= FW_CLS_TCAM_NUM_ENTRIES) if (ret >= max_naddr)
ret = -ENOMEM; ret = -ENOMEM;
} }
return ret; return ret;
......
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