Commit 9f605acf authored by David S. Miller's avatar David S. Miller

Merge branch 'bna'

Rasesh Mody says:

====================
bna: Update the Driver to v3.2.23.0

This patch set consists of feature additions like s/w timestamping support,
multi-buffer RX, firmware patch simplification, enhancements for RX filters,
RX processing changes, bug fixes and updates the firmware version to v3.2.3.0.
The patch set addressed the review commnets recieved.

This patch set updates the BNA driver to v3.2.23.0 and was tested against
net-next 3.12.0-rc6 kernel.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents e3fec2f7 ae01320c
This diff is collapsed.
...@@ -215,6 +215,13 @@ struct bfa_ioc_hwif { ...@@ -215,6 +215,13 @@ struct bfa_ioc_hwif {
void (*ioc_sync_ack) (struct bfa_ioc *ioc); void (*ioc_sync_ack) (struct bfa_ioc *ioc);
bool (*ioc_sync_complete) (struct bfa_ioc *ioc); bool (*ioc_sync_complete) (struct bfa_ioc *ioc);
bool (*ioc_lpu_read_stat) (struct bfa_ioc *ioc); bool (*ioc_lpu_read_stat) (struct bfa_ioc *ioc);
void (*ioc_set_fwstate) (struct bfa_ioc *ioc,
enum bfi_ioc_state fwstate);
enum bfi_ioc_state (*ioc_get_fwstate) (struct bfa_ioc *ioc);
void (*ioc_set_alt_fwstate) (struct bfa_ioc *ioc,
enum bfi_ioc_state fwstate);
enum bfi_ioc_state (*ioc_get_alt_fwstate) (struct bfa_ioc *ioc);
}; };
#define bfa_ioc_pcifn(__ioc) ((__ioc)->pcidev.pci_func) #define bfa_ioc_pcifn(__ioc) ((__ioc)->pcidev.pci_func)
...@@ -291,6 +298,7 @@ void bfa_nw_ioc_error_isr(struct bfa_ioc *ioc); ...@@ -291,6 +298,7 @@ void bfa_nw_ioc_error_isr(struct bfa_ioc *ioc);
bool bfa_nw_ioc_is_disabled(struct bfa_ioc *ioc); bool bfa_nw_ioc_is_disabled(struct bfa_ioc *ioc);
bool bfa_nw_ioc_is_operational(struct bfa_ioc *ioc); bool bfa_nw_ioc_is_operational(struct bfa_ioc *ioc);
void bfa_nw_ioc_get_attr(struct bfa_ioc *ioc, struct bfa_ioc_attr *ioc_attr); void bfa_nw_ioc_get_attr(struct bfa_ioc *ioc, struct bfa_ioc_attr *ioc_attr);
enum bfa_status bfa_nw_ioc_fwsig_invalidate(struct bfa_ioc *ioc);
void bfa_nw_ioc_notify_register(struct bfa_ioc *ioc, void bfa_nw_ioc_notify_register(struct bfa_ioc *ioc,
struct bfa_ioc_notify *notify); struct bfa_ioc_notify *notify);
bool bfa_nw_ioc_sem_get(void __iomem *sem_reg); bool bfa_nw_ioc_sem_get(void __iomem *sem_reg);
......
...@@ -48,6 +48,12 @@ static void bfa_ioc_ct_sync_join(struct bfa_ioc *ioc); ...@@ -48,6 +48,12 @@ static void bfa_ioc_ct_sync_join(struct bfa_ioc *ioc);
static void bfa_ioc_ct_sync_leave(struct bfa_ioc *ioc); static void bfa_ioc_ct_sync_leave(struct bfa_ioc *ioc);
static void bfa_ioc_ct_sync_ack(struct bfa_ioc *ioc); static void bfa_ioc_ct_sync_ack(struct bfa_ioc *ioc);
static bool bfa_ioc_ct_sync_complete(struct bfa_ioc *ioc); static bool bfa_ioc_ct_sync_complete(struct bfa_ioc *ioc);
static void bfa_ioc_ct_set_cur_ioc_fwstate(
struct bfa_ioc *ioc, enum bfi_ioc_state fwstate);
static enum bfi_ioc_state bfa_ioc_ct_get_cur_ioc_fwstate(struct bfa_ioc *ioc);
static void bfa_ioc_ct_set_alt_ioc_fwstate(
struct bfa_ioc *ioc, enum bfi_ioc_state fwstate);
static enum bfi_ioc_state bfa_ioc_ct_get_alt_ioc_fwstate(struct bfa_ioc *ioc);
static enum bfa_status bfa_ioc_ct_pll_init(void __iomem *rb, static enum bfa_status bfa_ioc_ct_pll_init(void __iomem *rb,
enum bfi_asic_mode asic_mode); enum bfi_asic_mode asic_mode);
static enum bfa_status bfa_ioc_ct2_pll_init(void __iomem *rb, static enum bfa_status bfa_ioc_ct2_pll_init(void __iomem *rb,
...@@ -68,6 +74,10 @@ static const struct bfa_ioc_hwif nw_hwif_ct = { ...@@ -68,6 +74,10 @@ static const struct bfa_ioc_hwif nw_hwif_ct = {
.ioc_sync_leave = bfa_ioc_ct_sync_leave, .ioc_sync_leave = bfa_ioc_ct_sync_leave,
.ioc_sync_ack = bfa_ioc_ct_sync_ack, .ioc_sync_ack = bfa_ioc_ct_sync_ack,
.ioc_sync_complete = bfa_ioc_ct_sync_complete, .ioc_sync_complete = bfa_ioc_ct_sync_complete,
.ioc_set_fwstate = bfa_ioc_ct_set_cur_ioc_fwstate,
.ioc_get_fwstate = bfa_ioc_ct_get_cur_ioc_fwstate,
.ioc_set_alt_fwstate = bfa_ioc_ct_set_alt_ioc_fwstate,
.ioc_get_alt_fwstate = bfa_ioc_ct_get_alt_ioc_fwstate,
}; };
static const struct bfa_ioc_hwif nw_hwif_ct2 = { static const struct bfa_ioc_hwif nw_hwif_ct2 = {
...@@ -85,6 +95,10 @@ static const struct bfa_ioc_hwif nw_hwif_ct2 = { ...@@ -85,6 +95,10 @@ static const struct bfa_ioc_hwif nw_hwif_ct2 = {
.ioc_sync_leave = bfa_ioc_ct_sync_leave, .ioc_sync_leave = bfa_ioc_ct_sync_leave,
.ioc_sync_ack = bfa_ioc_ct_sync_ack, .ioc_sync_ack = bfa_ioc_ct_sync_ack,
.ioc_sync_complete = bfa_ioc_ct_sync_complete, .ioc_sync_complete = bfa_ioc_ct_sync_complete,
.ioc_set_fwstate = bfa_ioc_ct_set_cur_ioc_fwstate,
.ioc_get_fwstate = bfa_ioc_ct_get_cur_ioc_fwstate,
.ioc_set_alt_fwstate = bfa_ioc_ct_set_alt_ioc_fwstate,
.ioc_get_alt_fwstate = bfa_ioc_ct_get_alt_ioc_fwstate,
}; };
/* Called from bfa_ioc_attach() to map asic specific calls. */ /* Called from bfa_ioc_attach() to map asic specific calls. */
...@@ -565,6 +579,32 @@ bfa_ioc_ct_sync_complete(struct bfa_ioc *ioc) ...@@ -565,6 +579,32 @@ bfa_ioc_ct_sync_complete(struct bfa_ioc *ioc)
return false; return false;
} }
static void
bfa_ioc_ct_set_cur_ioc_fwstate(struct bfa_ioc *ioc,
enum bfi_ioc_state fwstate)
{
writel(fwstate, ioc->ioc_regs.ioc_fwstate);
}
static enum bfi_ioc_state
bfa_ioc_ct_get_cur_ioc_fwstate(struct bfa_ioc *ioc)
{
return (enum bfi_ioc_state)readl(ioc->ioc_regs.ioc_fwstate);
}
static void
bfa_ioc_ct_set_alt_ioc_fwstate(struct bfa_ioc *ioc,
enum bfi_ioc_state fwstate)
{
writel(fwstate, ioc->ioc_regs.alt_ioc_fwstate);
}
static enum bfi_ioc_state
bfa_ioc_ct_get_alt_ioc_fwstate(struct bfa_ioc *ioc)
{
return (enum bfi_ioc_state)readl(ioc->ioc_regs.alt_ioc_fwstate);
}
static enum bfa_status static enum bfa_status
bfa_ioc_ct_pll_init(void __iomem *rb, enum bfi_asic_mode asic_mode) bfa_ioc_ct_pll_init(void __iomem *rb, enum bfi_asic_mode asic_mode)
{ {
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
/* BFI FW image type */ /* BFI FW image type */
#define BFI_FLASH_CHUNK_SZ 256 /*!< Flash chunk size */ #define BFI_FLASH_CHUNK_SZ 256 /*!< Flash chunk size */
#define BFI_FLASH_CHUNK_SZ_WORDS (BFI_FLASH_CHUNK_SZ/sizeof(u32)) #define BFI_FLASH_CHUNK_SZ_WORDS (BFI_FLASH_CHUNK_SZ/sizeof(u32))
#define BFI_FLASH_IMAGE_SZ 0x100000
/* Msg header common to all msgs */ /* Msg header common to all msgs */
struct bfi_mhdr { struct bfi_mhdr {
...@@ -233,7 +234,29 @@ struct bfi_ioc_getattr_reply { ...@@ -233,7 +234,29 @@ struct bfi_ioc_getattr_reply {
#define BFI_IOC_TRC_HDR_SZ 32 #define BFI_IOC_TRC_HDR_SZ 32
#define BFI_IOC_FW_SIGNATURE (0xbfadbfad) #define BFI_IOC_FW_SIGNATURE (0xbfadbfad)
#define BFI_IOC_FW_INV_SIGN (0xdeaddead)
#define BFI_IOC_MD5SUM_SZ 4 #define BFI_IOC_MD5SUM_SZ 4
struct bfi_ioc_fwver {
#ifdef __BIG_ENDIAN
u8 patch;
u8 maint;
u8 minor;
u8 major;
u8 rsvd[2];
u8 build;
u8 phase;
#else
u8 major;
u8 minor;
u8 maint;
u8 patch;
u8 phase;
u8 build;
u8 rsvd[2];
#endif
};
struct bfi_ioc_image_hdr { struct bfi_ioc_image_hdr {
u32 signature; /*!< constant signature */ u32 signature; /*!< constant signature */
u8 asic_gen; /*!< asic generation */ u8 asic_gen; /*!< asic generation */
...@@ -242,10 +265,18 @@ struct bfi_ioc_image_hdr { ...@@ -242,10 +265,18 @@ struct bfi_ioc_image_hdr {
u8 port1_mode; /*!< device mode for port 1 */ u8 port1_mode; /*!< device mode for port 1 */
u32 exec; /*!< exec vector */ u32 exec; /*!< exec vector */
u32 bootenv; /*!< firmware boot env */ u32 bootenv; /*!< firmware boot env */
u32 rsvd_b[4]; u32 rsvd_b[2];
struct bfi_ioc_fwver fwver;
u32 md5sum[BFI_IOC_MD5SUM_SZ]; u32 md5sum[BFI_IOC_MD5SUM_SZ];
}; };
enum bfi_ioc_img_ver_cmp {
BFI_IOC_IMG_VER_INCOMP,
BFI_IOC_IMG_VER_OLD,
BFI_IOC_IMG_VER_SAME,
BFI_IOC_IMG_VER_BETTER
};
#define BFI_FWBOOT_DEVMODE_OFF 4 #define BFI_FWBOOT_DEVMODE_OFF 4
#define BFI_FWBOOT_TYPE_OFF 8 #define BFI_FWBOOT_TYPE_OFF 8
#define BFI_FWBOOT_ENV_OFF 12 #define BFI_FWBOOT_ENV_OFF 12
......
...@@ -472,7 +472,8 @@ enum bfi_enet_hds_type { ...@@ -472,7 +472,8 @@ enum bfi_enet_hds_type {
struct bfi_enet_rx_cfg { struct bfi_enet_rx_cfg {
u8 rxq_type; u8 rxq_type;
u8 rsvd[3]; u8 rsvd[1];
u16 frame_size;
struct { struct {
u8 max_header_size; u8 max_header_size;
......
...@@ -354,6 +354,14 @@ do { \ ...@@ -354,6 +354,14 @@ do { \
} \ } \
} while (0) } while (0)
#define bna_mcam_mod_free_q(_bna) (&(_bna)->mcam_mod.free_q)
#define bna_mcam_mod_del_q(_bna) (&(_bna)->mcam_mod.del_q)
#define bna_ucam_mod_free_q(_bna) (&(_bna)->ucam_mod.free_q)
#define bna_ucam_mod_del_q(_bna) (&(_bna)->ucam_mod.del_q)
/* Inline functions */ /* Inline functions */
static inline struct bna_mac *bna_mac_find(struct list_head *q, u8 *addr) static inline struct bna_mac *bna_mac_find(struct list_head *q, u8 *addr)
...@@ -391,12 +399,8 @@ int bna_num_rxp_set(struct bna *bna, int num_rxp); ...@@ -391,12 +399,8 @@ int bna_num_rxp_set(struct bna *bna, int num_rxp);
void bna_hw_stats_get(struct bna *bna); void bna_hw_stats_get(struct bna *bna);
/* APIs for RxF */ /* APIs for RxF */
struct bna_mac *bna_ucam_mod_mac_get(struct bna_ucam_mod *ucam_mod); struct bna_mac *bna_cam_mod_mac_get(struct list_head *head);
void bna_ucam_mod_mac_put(struct bna_ucam_mod *ucam_mod, void bna_cam_mod_mac_put(struct list_head *tail, struct bna_mac *mac);
struct bna_mac *mac);
struct bna_mac *bna_mcam_mod_mac_get(struct bna_mcam_mod *mcam_mod);
void bna_mcam_mod_mac_put(struct bna_mcam_mod *mcam_mod,
struct bna_mac *mac);
struct bna_mcam_handle *bna_mcam_mod_handle_get(struct bna_mcam_mod *mod); struct bna_mcam_handle *bna_mcam_mod_handle_get(struct bna_mcam_mod *mod);
void bna_mcam_mod_handle_put(struct bna_mcam_mod *mcam_mod, void bna_mcam_mod_handle_put(struct bna_mcam_mod *mcam_mod,
struct bna_mcam_handle *handle); struct bna_mcam_handle *handle);
...@@ -493,11 +497,17 @@ enum bna_cb_status ...@@ -493,11 +497,17 @@ enum bna_cb_status
bna_rx_ucast_del(struct bna_rx *rx, u8 *ucmac, bna_rx_ucast_del(struct bna_rx *rx, u8 *ucmac,
void (*cbfn)(struct bnad *, struct bna_rx *)); void (*cbfn)(struct bnad *, struct bna_rx *));
enum bna_cb_status enum bna_cb_status
bna_rx_ucast_listset(struct bna_rx *rx, int count, u8 *uclist,
void (*cbfn)(struct bnad *, struct bna_rx *));
enum bna_cb_status
bna_rx_mcast_add(struct bna_rx *rx, u8 *mcmac, bna_rx_mcast_add(struct bna_rx *rx, u8 *mcmac,
void (*cbfn)(struct bnad *, struct bna_rx *)); void (*cbfn)(struct bnad *, struct bna_rx *));
enum bna_cb_status enum bna_cb_status
bna_rx_mcast_listset(struct bna_rx *rx, int count, u8 *mcmac, bna_rx_mcast_listset(struct bna_rx *rx, int count, u8 *mcmac,
void (*cbfn)(struct bnad *, struct bna_rx *)); void (*cbfn)(struct bnad *, struct bna_rx *));
void
bna_rx_mcast_delall(struct bna_rx *rx,
void (*cbfn)(struct bnad *, struct bna_rx *));
enum bna_cb_status enum bna_cb_status
bna_rx_mode_set(struct bna_rx *rx, enum bna_rxmode rxmode, bna_rx_mode_set(struct bna_rx *rx, enum bna_rxmode rxmode,
enum bna_rxmode bitmask, enum bna_rxmode bitmask,
...@@ -505,6 +515,8 @@ bna_rx_mode_set(struct bna_rx *rx, enum bna_rxmode rxmode, ...@@ -505,6 +515,8 @@ bna_rx_mode_set(struct bna_rx *rx, enum bna_rxmode rxmode,
void bna_rx_vlan_add(struct bna_rx *rx, int vlan_id); void bna_rx_vlan_add(struct bna_rx *rx, int vlan_id);
void bna_rx_vlan_del(struct bna_rx *rx, int vlan_id); void bna_rx_vlan_del(struct bna_rx *rx, int vlan_id);
void bna_rx_vlanfilter_enable(struct bna_rx *rx); void bna_rx_vlanfilter_enable(struct bna_rx *rx);
void bna_rx_vlan_strip_enable(struct bna_rx *rx);
void bna_rx_vlan_strip_disable(struct bna_rx *rx);
/* ENET */ /* ENET */
/* API for RX */ /* API for RX */
......
...@@ -1811,6 +1811,13 @@ bna_ucam_mod_init(struct bna_ucam_mod *ucam_mod, struct bna *bna, ...@@ -1811,6 +1811,13 @@ bna_ucam_mod_init(struct bna_ucam_mod *ucam_mod, struct bna *bna,
list_add_tail(&ucam_mod->ucmac[i].qe, &ucam_mod->free_q); list_add_tail(&ucam_mod->ucmac[i].qe, &ucam_mod->free_q);
} }
/* A separate queue to allow synchronous setting of a list of MACs */
INIT_LIST_HEAD(&ucam_mod->del_q);
for (i = i; i < (bna->ioceth.attr.num_ucmac * 2); i++) {
bfa_q_qe_init(&ucam_mod->ucmac[i].qe);
list_add_tail(&ucam_mod->ucmac[i].qe, &ucam_mod->del_q);
}
ucam_mod->bna = bna; ucam_mod->bna = bna;
} }
...@@ -1818,11 +1825,16 @@ static void ...@@ -1818,11 +1825,16 @@ static void
bna_ucam_mod_uninit(struct bna_ucam_mod *ucam_mod) bna_ucam_mod_uninit(struct bna_ucam_mod *ucam_mod)
{ {
struct list_head *qe; struct list_head *qe;
int i = 0; int i;
i = 0;
list_for_each(qe, &ucam_mod->free_q) list_for_each(qe, &ucam_mod->free_q)
i++; i++;
i = 0;
list_for_each(qe, &ucam_mod->del_q)
i++;
ucam_mod->bna = NULL; ucam_mod->bna = NULL;
} }
...@@ -1851,6 +1863,13 @@ bna_mcam_mod_init(struct bna_mcam_mod *mcam_mod, struct bna *bna, ...@@ -1851,6 +1863,13 @@ bna_mcam_mod_init(struct bna_mcam_mod *mcam_mod, struct bna *bna,
&mcam_mod->free_handle_q); &mcam_mod->free_handle_q);
} }
/* A separate queue to allow synchronous setting of a list of MACs */
INIT_LIST_HEAD(&mcam_mod->del_q);
for (i = i; i < (bna->ioceth.attr.num_mcmac * 2); i++) {
bfa_q_qe_init(&mcam_mod->mcmac[i].qe);
list_add_tail(&mcam_mod->mcmac[i].qe, &mcam_mod->del_q);
}
mcam_mod->bna = bna; mcam_mod->bna = bna;
} }
...@@ -1863,6 +1882,9 @@ bna_mcam_mod_uninit(struct bna_mcam_mod *mcam_mod) ...@@ -1863,6 +1882,9 @@ bna_mcam_mod_uninit(struct bna_mcam_mod *mcam_mod)
i = 0; i = 0;
list_for_each(qe, &mcam_mod->free_q) i++; list_for_each(qe, &mcam_mod->free_q) i++;
i = 0;
list_for_each(qe, &mcam_mod->del_q) i++;
i = 0; i = 0;
list_for_each(qe, &mcam_mod->free_handle_q) i++; list_for_each(qe, &mcam_mod->free_handle_q) i++;
...@@ -1976,7 +1998,7 @@ bna_mod_res_req(struct bna *bna, struct bna_res_info *res_info) ...@@ -1976,7 +1998,7 @@ bna_mod_res_req(struct bna *bna, struct bna_res_info *res_info)
BNA_MEM_T_KVA; BNA_MEM_T_KVA;
res_info[BNA_MOD_RES_MEM_T_UCMAC_ARRAY].res_u.mem_info.num = 1; res_info[BNA_MOD_RES_MEM_T_UCMAC_ARRAY].res_u.mem_info.num = 1;
res_info[BNA_MOD_RES_MEM_T_UCMAC_ARRAY].res_u.mem_info.len = res_info[BNA_MOD_RES_MEM_T_UCMAC_ARRAY].res_u.mem_info.len =
attr->num_ucmac * sizeof(struct bna_mac); (attr->num_ucmac * 2) * sizeof(struct bna_mac);
/* Virtual memory for Multicast MAC address - stored by mcam module */ /* Virtual memory for Multicast MAC address - stored by mcam module */
res_info[BNA_MOD_RES_MEM_T_MCMAC_ARRAY].res_type = BNA_RES_T_MEM; res_info[BNA_MOD_RES_MEM_T_MCMAC_ARRAY].res_type = BNA_RES_T_MEM;
...@@ -1984,7 +2006,7 @@ bna_mod_res_req(struct bna *bna, struct bna_res_info *res_info) ...@@ -1984,7 +2006,7 @@ bna_mod_res_req(struct bna *bna, struct bna_res_info *res_info)
BNA_MEM_T_KVA; BNA_MEM_T_KVA;
res_info[BNA_MOD_RES_MEM_T_MCMAC_ARRAY].res_u.mem_info.num = 1; res_info[BNA_MOD_RES_MEM_T_MCMAC_ARRAY].res_u.mem_info.num = 1;
res_info[BNA_MOD_RES_MEM_T_MCMAC_ARRAY].res_u.mem_info.len = res_info[BNA_MOD_RES_MEM_T_MCMAC_ARRAY].res_u.mem_info.len =
attr->num_mcmac * sizeof(struct bna_mac); (attr->num_mcmac * 2) * sizeof(struct bna_mac);
/* Virtual memory for Multicast handle - stored by mcam module */ /* Virtual memory for Multicast handle - stored by mcam module */
res_info[BNA_MOD_RES_MEM_T_MCHANDLE_ARRAY].res_type = BNA_RES_T_MEM; res_info[BNA_MOD_RES_MEM_T_MCHANDLE_ARRAY].res_type = BNA_RES_T_MEM;
...@@ -2080,41 +2102,21 @@ bna_num_rxp_set(struct bna *bna, int num_rxp) ...@@ -2080,41 +2102,21 @@ bna_num_rxp_set(struct bna *bna, int num_rxp)
} }
struct bna_mac * struct bna_mac *
bna_ucam_mod_mac_get(struct bna_ucam_mod *ucam_mod) bna_cam_mod_mac_get(struct list_head *head)
{
struct list_head *qe;
if (list_empty(&ucam_mod->free_q))
return NULL;
bfa_q_deq(&ucam_mod->free_q, &qe);
return (struct bna_mac *)qe;
}
void
bna_ucam_mod_mac_put(struct bna_ucam_mod *ucam_mod, struct bna_mac *mac)
{
list_add_tail(&mac->qe, &ucam_mod->free_q);
}
struct bna_mac *
bna_mcam_mod_mac_get(struct bna_mcam_mod *mcam_mod)
{ {
struct list_head *qe; struct list_head *qe;
if (list_empty(&mcam_mod->free_q)) if (list_empty(head))
return NULL; return NULL;
bfa_q_deq(&mcam_mod->free_q, &qe); bfa_q_deq(head, &qe);
return (struct bna_mac *)qe; return (struct bna_mac *)qe;
} }
void void
bna_mcam_mod_mac_put(struct bna_mcam_mod *mcam_mod, struct bna_mac *mac) bna_cam_mod_mac_put(struct list_head *tail, struct bna_mac *mac)
{ {
list_add_tail(&mac->qe, &mcam_mod->free_q); list_add_tail(&mac->qe, tail);
} }
struct bna_mcam_handle * struct bna_mcam_handle *
......
...@@ -322,6 +322,10 @@ do { \ ...@@ -322,6 +322,10 @@ do { \
#define BNA_CQ_EF_REMOTE (1 << 19) #define BNA_CQ_EF_REMOTE (1 << 19)
#define BNA_CQ_EF_LOCAL (1 << 20) #define BNA_CQ_EF_LOCAL (1 << 20)
/* CAT2 ASIC does not use bit 21 as per the SPEC.
* Bit 31 is set in every end of frame completion
*/
#define BNA_CQ_EF_EOP (1 << 31)
/* Data structures */ /* Data structures */
......
...@@ -109,20 +109,21 @@ enum bna_tx_res_req_type { ...@@ -109,20 +109,21 @@ enum bna_tx_res_req_type {
enum bna_rx_mem_type { enum bna_rx_mem_type {
BNA_RX_RES_MEM_T_CCB = 0, /* CQ context */ BNA_RX_RES_MEM_T_CCB = 0, /* CQ context */
BNA_RX_RES_MEM_T_RCB = 1, /* CQ context */ BNA_RX_RES_MEM_T_RCB = 1, /* CQ context */
BNA_RX_RES_MEM_T_UNMAPQ = 2, /* UnmapQ for RxQs */ BNA_RX_RES_MEM_T_UNMAPHQ = 2,
BNA_RX_RES_MEM_T_CQPT = 3, /* CQ QPT */ BNA_RX_RES_MEM_T_UNMAPDQ = 3,
BNA_RX_RES_MEM_T_CSWQPT = 4, /* S/W QPT */ BNA_RX_RES_MEM_T_CQPT = 4,
BNA_RX_RES_MEM_T_CQPT_PAGE = 5, /* CQPT page */ BNA_RX_RES_MEM_T_CSWQPT = 5,
BNA_RX_RES_MEM_T_HQPT = 6, /* RX QPT */ BNA_RX_RES_MEM_T_CQPT_PAGE = 6,
BNA_RX_RES_MEM_T_DQPT = 7, /* RX QPT */ BNA_RX_RES_MEM_T_HQPT = 7,
BNA_RX_RES_MEM_T_HSWQPT = 8, /* RX s/w QPT */ BNA_RX_RES_MEM_T_DQPT = 8,
BNA_RX_RES_MEM_T_DSWQPT = 9, /* RX s/w QPT */ BNA_RX_RES_MEM_T_HSWQPT = 9,
BNA_RX_RES_MEM_T_DPAGE = 10, /* RX s/w QPT */ BNA_RX_RES_MEM_T_DSWQPT = 10,
BNA_RX_RES_MEM_T_HPAGE = 11, /* RX s/w QPT */ BNA_RX_RES_MEM_T_DPAGE = 11,
BNA_RX_RES_MEM_T_IBIDX = 12, BNA_RX_RES_MEM_T_HPAGE = 12,
BNA_RX_RES_MEM_T_RIT = 13, BNA_RX_RES_MEM_T_IBIDX = 13,
BNA_RX_RES_T_INTR = 14, /* Rx interrupts */ BNA_RX_RES_MEM_T_RIT = 14,
BNA_RX_RES_T_MAX = 15 BNA_RX_RES_T_INTR = 15,
BNA_RX_RES_T_MAX = 16
}; };
enum bna_tx_type { enum bna_tx_type {
...@@ -583,6 +584,8 @@ struct bna_rxq { ...@@ -583,6 +584,8 @@ struct bna_rxq {
int buffer_size; int buffer_size;
int q_depth; int q_depth;
u32 num_vecs;
enum bna_status multi_buffer;
struct bna_qpt qpt; struct bna_qpt qpt;
struct bna_rcb *rcb; struct bna_rcb *rcb;
...@@ -632,6 +635,8 @@ struct bna_ccb { ...@@ -632,6 +635,8 @@ struct bna_ccb {
struct bna_rcb *rcb[2]; struct bna_rcb *rcb[2];
void *ctrl; /* For bnad */ void *ctrl; /* For bnad */
struct bna_pkt_rate pkt_rate; struct bna_pkt_rate pkt_rate;
u32 pkts_una;
u32 bytes_per_intr;
/* Control path */ /* Control path */
struct bna_cq *cq; struct bna_cq *cq;
...@@ -671,14 +676,22 @@ struct bna_rx_config { ...@@ -671,14 +676,22 @@ struct bna_rx_config {
int num_paths; int num_paths;
enum bna_rxp_type rxp_type; enum bna_rxp_type rxp_type;
int paused; int paused;
int q_depth;
int coalescing_timeo; int coalescing_timeo;
/* /*
* Small/Large (or Header/Data) buffer size to be configured * Small/Large (or Header/Data) buffer size to be configured
* for SLR and HDS queue type. Large buffer size comes from * for SLR and HDS queue type.
* enet->mtu.
*/ */
int small_buff_size; u32 frame_size;
/* header or small queue */
u32 q1_depth;
u32 q1_buf_size;
/* data or large queue */
u32 q0_depth;
u32 q0_buf_size;
u32 q0_num_vecs;
enum bna_status q0_multi_buf;
enum bna_status rss_status; enum bna_status rss_status;
struct bna_rss_config rss_config; struct bna_rss_config rss_config;
...@@ -866,8 +879,9 @@ struct bna_rx_mod { ...@@ -866,8 +879,9 @@ struct bna_rx_mod {
/* CAM */ /* CAM */
struct bna_ucam_mod { struct bna_ucam_mod {
struct bna_mac *ucmac; /* BFI_MAX_UCMAC entries */ struct bna_mac *ucmac; /* num_ucmac * 2 entries */
struct list_head free_q; struct list_head free_q;
struct list_head del_q;
struct bna *bna; struct bna *bna;
}; };
...@@ -880,9 +894,10 @@ struct bna_mcam_handle { ...@@ -880,9 +894,10 @@ struct bna_mcam_handle {
}; };
struct bna_mcam_mod { struct bna_mcam_mod {
struct bna_mac *mcmac; /* BFI_MAX_MCMAC entries */ struct bna_mac *mcmac; /* num_mcmac * 2 entries */
struct bna_mcam_handle *mchandle; /* BFI_MAX_MCMAC entries */ struct bna_mcam_handle *mchandle; /* num_mcmac entries */
struct list_head free_q; struct list_head free_q;
struct list_head del_q;
struct list_head free_handle_q; struct list_head free_handle_q;
struct bna *bna; struct bna *bna;
......
This diff is collapsed.
...@@ -71,7 +71,7 @@ struct bnad_rx_ctrl { ...@@ -71,7 +71,7 @@ struct bnad_rx_ctrl {
#define BNAD_NAME "bna" #define BNAD_NAME "bna"
#define BNAD_NAME_LEN 64 #define BNAD_NAME_LEN 64
#define BNAD_VERSION "3.2.21.1" #define BNAD_VERSION "3.2.23.0"
#define BNAD_MAILBOX_MSIX_INDEX 0 #define BNAD_MAILBOX_MSIX_INDEX 0
#define BNAD_MAILBOX_MSIX_VECTORS 1 #define BNAD_MAILBOX_MSIX_VECTORS 1
...@@ -84,7 +84,7 @@ struct bnad_rx_ctrl { ...@@ -84,7 +84,7 @@ struct bnad_rx_ctrl {
#define BNAD_IOCETH_TIMEOUT 10000 #define BNAD_IOCETH_TIMEOUT 10000
#define BNAD_MIN_Q_DEPTH 512 #define BNAD_MIN_Q_DEPTH 512
#define BNAD_MAX_RXQ_DEPTH 2048 #define BNAD_MAX_RXQ_DEPTH 16384
#define BNAD_MAX_TXQ_DEPTH 2048 #define BNAD_MAX_TXQ_DEPTH 2048
#define BNAD_JUMBO_MTU 9000 #define BNAD_JUMBO_MTU 9000
...@@ -105,6 +105,9 @@ struct bnad_rx_ctrl { ...@@ -105,6 +105,9 @@ struct bnad_rx_ctrl {
#define BNAD_NUM_TXQ (bnad->num_tx * bnad->num_txq_per_tx) #define BNAD_NUM_TXQ (bnad->num_tx * bnad->num_txq_per_tx)
#define BNAD_NUM_RXP (bnad->num_rx * bnad->num_rxp_per_rx) #define BNAD_NUM_RXP (bnad->num_rx * bnad->num_rxp_per_rx)
#define BNAD_FRAME_SIZE(_mtu) \
(ETH_HLEN + VLAN_HLEN + (_mtu) + ETH_FCS_LEN)
/* /*
* DATA STRUCTURES * DATA STRUCTURES
*/ */
...@@ -219,6 +222,7 @@ struct bnad_rx_info { ...@@ -219,6 +222,7 @@ struct bnad_rx_info {
struct bnad_tx_vector { struct bnad_tx_vector {
DEFINE_DMA_UNMAP_ADDR(dma_addr); DEFINE_DMA_UNMAP_ADDR(dma_addr);
DEFINE_DMA_UNMAP_LEN(dma_len);
}; };
struct bnad_tx_unmap { struct bnad_tx_unmap {
...@@ -234,33 +238,38 @@ struct bnad_rx_vector { ...@@ -234,33 +238,38 @@ struct bnad_rx_vector {
struct bnad_rx_unmap { struct bnad_rx_unmap {
struct page *page; struct page *page;
u32 page_offset;
struct sk_buff *skb; struct sk_buff *skb;
struct bnad_rx_vector vector; struct bnad_rx_vector vector;
u32 page_offset;
}; };
enum bnad_rxbuf_type { enum bnad_rxbuf_type {
BNAD_RXBUF_NONE = 0, BNAD_RXBUF_NONE = 0,
BNAD_RXBUF_SKB = 1, BNAD_RXBUF_SK_BUFF = 1,
BNAD_RXBUF_PAGE = 2, BNAD_RXBUF_PAGE = 2,
BNAD_RXBUF_MULTI = 3 BNAD_RXBUF_MULTI_BUFF = 3
}; };
#define BNAD_RXBUF_IS_PAGE(_type) ((_type) == BNAD_RXBUF_PAGE) #define BNAD_RXBUF_IS_SK_BUFF(_type) ((_type) == BNAD_RXBUF_SK_BUFF)
#define BNAD_RXBUF_IS_MULTI_BUFF(_type) ((_type) == BNAD_RXBUF_MULTI_BUFF)
struct bnad_rx_unmap_q { struct bnad_rx_unmap_q {
int reuse_pi; int reuse_pi;
int alloc_order; int alloc_order;
u32 map_size; u32 map_size;
enum bnad_rxbuf_type type; enum bnad_rxbuf_type type;
struct bnad_rx_unmap unmap[0]; struct bnad_rx_unmap unmap[0] ____cacheline_aligned;
}; };
#define BNAD_PCI_DEV_IS_CAT2(_bnad) \
((_bnad)->pcidev->device == BFA_PCI_DEVICE_ID_CT2)
/* Bit mask values for bnad->cfg_flags */ /* Bit mask values for bnad->cfg_flags */
#define BNAD_CF_DIM_ENABLED 0x01 /* DIM */ #define BNAD_CF_DIM_ENABLED 0x01 /* DIM */
#define BNAD_CF_PROMISC 0x02 #define BNAD_CF_PROMISC 0x02
#define BNAD_CF_ALLMULTI 0x04 #define BNAD_CF_ALLMULTI 0x04
#define BNAD_CF_MSIX 0x08 /* If in MSIx mode */ #define BNAD_CF_DEFAULT 0x08
#define BNAD_CF_MSIX 0x10 /* If in MSIx mode */
/* Defines for run_flags bit-mask */ /* Defines for run_flags bit-mask */
/* Set, tested & cleared using xxx_bit() functions */ /* Set, tested & cleared using xxx_bit() functions */
......
...@@ -1131,6 +1131,7 @@ static const struct ethtool_ops bnad_ethtool_ops = { ...@@ -1131,6 +1131,7 @@ static const struct ethtool_ops bnad_ethtool_ops = {
.get_eeprom = bnad_get_eeprom, .get_eeprom = bnad_get_eeprom,
.set_eeprom = bnad_set_eeprom, .set_eeprom = bnad_set_eeprom,
.flash_device = bnad_flash_device, .flash_device = bnad_flash_device,
.get_ts_info = ethtool_op_get_ts_info,
}; };
void void
......
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
extern char bfa_version[]; extern char bfa_version[];
#define CNA_FW_FILE_CT "ctfw-3.2.1.1.bin" #define CNA_FW_FILE_CT "ctfw-3.2.3.0.bin"
#define CNA_FW_FILE_CT2 "ct2fw-3.2.1.1.bin" #define CNA_FW_FILE_CT2 "ct2fw-3.2.3.0.bin"
#define FC_SYMNAME_MAX 256 /*!< max name server symbolic name size */ #define FC_SYMNAME_MAX 256 /*!< max name server symbolic name size */
#pragma pack(1) #pragma pack(1)
......
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