mirror of
https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
synced 2025-09-09 01:28:05 -04:00
Fixed MTP to work with TWRP
This commit is contained in:
commit
f6dfaef42e
50820 changed files with 20846062 additions and 0 deletions
23
drivers/net/ethernet/brocade/Kconfig
Normal file
23
drivers/net/ethernet/brocade/Kconfig
Normal file
|
@ -0,0 +1,23 @@
|
|||
#
|
||||
# Brocade device configuration
|
||||
#
|
||||
|
||||
config NET_VENDOR_BROCADE
|
||||
bool "Brocade devices"
|
||||
default y
|
||||
depends on PCI
|
||||
---help---
|
||||
If you have a network (Ethernet) card belonging to this class, say Y
|
||||
and read the Ethernet-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>.
|
||||
|
||||
Note that the answer to this question doesn't directly affect the
|
||||
kernel: saying N will just cause the configurator to skip all
|
||||
the questions about Brocade cards. If you say Y, you will be asked for
|
||||
your specific card in the following questions.
|
||||
|
||||
if NET_VENDOR_BROCADE
|
||||
|
||||
source "drivers/net/ethernet/brocade/bna/Kconfig"
|
||||
|
||||
endif # NET_VENDOR_BROCADE
|
5
drivers/net/ethernet/brocade/Makefile
Normal file
5
drivers/net/ethernet/brocade/Makefile
Normal file
|
@ -0,0 +1,5 @@
|
|||
#
|
||||
# Makefile for the Brocade device drivers.
|
||||
#
|
||||
|
||||
obj-$(CONFIG_BNA) += bna/
|
17
drivers/net/ethernet/brocade/bna/Kconfig
Normal file
17
drivers/net/ethernet/brocade/bna/Kconfig
Normal file
|
@ -0,0 +1,17 @@
|
|||
#
|
||||
# Brocade network device configuration
|
||||
#
|
||||
|
||||
config BNA
|
||||
tristate "Brocade 1010/1020 10Gb Ethernet Driver support"
|
||||
depends on PCI
|
||||
---help---
|
||||
This driver supports Brocade 1010/1020 10Gb CEE capable Ethernet
|
||||
cards.
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called bna.
|
||||
|
||||
For general information and support, go to the Brocade support
|
||||
website at:
|
||||
|
||||
<http://support.brocade.com>
|
12
drivers/net/ethernet/brocade/bna/Makefile
Normal file
12
drivers/net/ethernet/brocade/bna/Makefile
Normal file
|
@ -0,0 +1,12 @@
|
|||
#
|
||||
# Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
|
||||
obj-$(CONFIG_BNA) += bna.o
|
||||
|
||||
bna-objs := bnad.o bnad_ethtool.o bnad_debugfs.o bna_enet.o bna_tx_rx.o
|
||||
bna-objs += bfa_msgq.o bfa_ioc.o bfa_ioc_ct.o bfa_cee.o
|
||||
bna-objs += cna_fwimg.o
|
||||
|
||||
EXTRA_CFLAGS := -Idrivers/net/bna
|
287
drivers/net/ethernet/brocade/bna/bfa_cee.c
Normal file
287
drivers/net/ethernet/brocade/bna/bfa_cee.c
Normal file
|
@ -0,0 +1,287 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#include "bfa_cee.h"
|
||||
#include "bfi_cna.h"
|
||||
#include "bfa_ioc.h"
|
||||
|
||||
static void bfa_cee_format_lldp_cfg(struct bfa_cee_lldp_cfg *lldp_cfg);
|
||||
static void bfa_cee_format_cee_cfg(void *buffer);
|
||||
|
||||
static void
|
||||
bfa_cee_format_cee_cfg(void *buffer)
|
||||
{
|
||||
struct bfa_cee_attr *cee_cfg = buffer;
|
||||
bfa_cee_format_lldp_cfg(&cee_cfg->lldp_remote);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_cee_stats_swap(struct bfa_cee_stats *stats)
|
||||
{
|
||||
u32 *buffer = (u32 *)stats;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < (sizeof(struct bfa_cee_stats) / sizeof(u32));
|
||||
i++) {
|
||||
buffer[i] = ntohl(buffer[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_cee_format_lldp_cfg(struct bfa_cee_lldp_cfg *lldp_cfg)
|
||||
{
|
||||
lldp_cfg->time_to_live =
|
||||
ntohs(lldp_cfg->time_to_live);
|
||||
lldp_cfg->enabled_system_cap =
|
||||
ntohs(lldp_cfg->enabled_system_cap);
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_attr_meminfo - Returns the size of the DMA memory needed by CEE attributes
|
||||
*/
|
||||
static u32
|
||||
bfa_cee_attr_meminfo(void)
|
||||
{
|
||||
return roundup(sizeof(struct bfa_cee_attr), BFA_DMA_ALIGN_SZ);
|
||||
}
|
||||
/**
|
||||
* bfa_cee_stats_meminfo - Returns the size of the DMA memory needed by CEE stats
|
||||
*/
|
||||
static u32
|
||||
bfa_cee_stats_meminfo(void)
|
||||
{
|
||||
return roundup(sizeof(struct bfa_cee_stats), BFA_DMA_ALIGN_SZ);
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_get_attr_isr - CEE ISR for get-attributes responses from f/w
|
||||
*
|
||||
* @cee: Pointer to the CEE module
|
||||
* @status: Return status from the f/w
|
||||
*/
|
||||
static void
|
||||
bfa_cee_get_attr_isr(struct bfa_cee *cee, enum bfa_status status)
|
||||
{
|
||||
cee->get_attr_status = status;
|
||||
if (status == BFA_STATUS_OK) {
|
||||
memcpy(cee->attr, cee->attr_dma.kva,
|
||||
sizeof(struct bfa_cee_attr));
|
||||
bfa_cee_format_cee_cfg(cee->attr);
|
||||
}
|
||||
cee->get_attr_pending = false;
|
||||
if (cee->cbfn.get_attr_cbfn)
|
||||
cee->cbfn.get_attr_cbfn(cee->cbfn.get_attr_cbarg, status);
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_get_attr_isr - CEE ISR for get-stats responses from f/w
|
||||
*
|
||||
* @cee: Pointer to the CEE module
|
||||
* @status: Return status from the f/w
|
||||
*/
|
||||
static void
|
||||
bfa_cee_get_stats_isr(struct bfa_cee *cee, enum bfa_status status)
|
||||
{
|
||||
cee->get_stats_status = status;
|
||||
if (status == BFA_STATUS_OK) {
|
||||
memcpy(cee->stats, cee->stats_dma.kva,
|
||||
sizeof(struct bfa_cee_stats));
|
||||
bfa_cee_stats_swap(cee->stats);
|
||||
}
|
||||
cee->get_stats_pending = false;
|
||||
if (cee->cbfn.get_stats_cbfn)
|
||||
cee->cbfn.get_stats_cbfn(cee->cbfn.get_stats_cbarg, status);
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_get_attr_isr()
|
||||
*
|
||||
* @brief CEE ISR for reset-stats responses from f/w
|
||||
*
|
||||
* @param[in] cee - Pointer to the CEE module
|
||||
* status - Return status from the f/w
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
static void
|
||||
bfa_cee_reset_stats_isr(struct bfa_cee *cee, enum bfa_status status)
|
||||
{
|
||||
cee->reset_stats_status = status;
|
||||
cee->reset_stats_pending = false;
|
||||
if (cee->cbfn.reset_stats_cbfn)
|
||||
cee->cbfn.reset_stats_cbfn(cee->cbfn.reset_stats_cbarg, status);
|
||||
}
|
||||
/**
|
||||
* bfa_nw_cee_meminfo - Returns the size of the DMA memory needed by CEE module
|
||||
*/
|
||||
u32
|
||||
bfa_nw_cee_meminfo(void)
|
||||
{
|
||||
return bfa_cee_attr_meminfo() + bfa_cee_stats_meminfo();
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_nw_cee_mem_claim - Initialized CEE DMA Memory
|
||||
*
|
||||
* @cee: CEE module pointer
|
||||
* @dma_kva: Kernel Virtual Address of CEE DMA Memory
|
||||
* @dma_pa: Physical Address of CEE DMA Memory
|
||||
*/
|
||||
void
|
||||
bfa_nw_cee_mem_claim(struct bfa_cee *cee, u8 *dma_kva, u64 dma_pa)
|
||||
{
|
||||
cee->attr_dma.kva = dma_kva;
|
||||
cee->attr_dma.pa = dma_pa;
|
||||
cee->stats_dma.kva = dma_kva + bfa_cee_attr_meminfo();
|
||||
cee->stats_dma.pa = dma_pa + bfa_cee_attr_meminfo();
|
||||
cee->attr = (struct bfa_cee_attr *) dma_kva;
|
||||
cee->stats = (struct bfa_cee_stats *)
|
||||
(dma_kva + bfa_cee_attr_meminfo());
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_get_attr - Send the request to the f/w to fetch CEE attributes.
|
||||
*
|
||||
* @cee: Pointer to the CEE module data structure.
|
||||
*
|
||||
* Return: status
|
||||
*/
|
||||
enum bfa_status
|
||||
bfa_nw_cee_get_attr(struct bfa_cee *cee, struct bfa_cee_attr *attr,
|
||||
bfa_cee_get_attr_cbfn_t cbfn, void *cbarg)
|
||||
{
|
||||
struct bfi_cee_get_req *cmd;
|
||||
|
||||
BUG_ON(!((cee != NULL) && (cee->ioc != NULL)));
|
||||
if (!bfa_nw_ioc_is_operational(cee->ioc))
|
||||
return BFA_STATUS_IOC_FAILURE;
|
||||
|
||||
if (cee->get_attr_pending)
|
||||
return BFA_STATUS_DEVBUSY;
|
||||
|
||||
cee->get_attr_pending = true;
|
||||
cmd = (struct bfi_cee_get_req *) cee->get_cfg_mb.msg;
|
||||
cee->attr = attr;
|
||||
cee->cbfn.get_attr_cbfn = cbfn;
|
||||
cee->cbfn.get_attr_cbarg = cbarg;
|
||||
bfi_h2i_set(cmd->mh, BFI_MC_CEE, BFI_CEE_H2I_GET_CFG_REQ,
|
||||
bfa_ioc_portid(cee->ioc));
|
||||
bfa_dma_be_addr_set(cmd->dma_addr, cee->attr_dma.pa);
|
||||
bfa_nw_ioc_mbox_queue(cee->ioc, &cee->get_cfg_mb, NULL, NULL);
|
||||
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_isrs - Handles Mail-box interrupts for CEE module.
|
||||
*/
|
||||
|
||||
static void
|
||||
bfa_cee_isr(void *cbarg, struct bfi_mbmsg *m)
|
||||
{
|
||||
union bfi_cee_i2h_msg_u *msg;
|
||||
struct bfi_cee_get_rsp *get_rsp;
|
||||
struct bfa_cee *cee = (struct bfa_cee *) cbarg;
|
||||
msg = (union bfi_cee_i2h_msg_u *) m;
|
||||
get_rsp = (struct bfi_cee_get_rsp *) m;
|
||||
switch (msg->mh.msg_id) {
|
||||
case BFI_CEE_I2H_GET_CFG_RSP:
|
||||
bfa_cee_get_attr_isr(cee, get_rsp->cmd_status);
|
||||
break;
|
||||
case BFI_CEE_I2H_GET_STATS_RSP:
|
||||
bfa_cee_get_stats_isr(cee, get_rsp->cmd_status);
|
||||
break;
|
||||
case BFI_CEE_I2H_RESET_STATS_RSP:
|
||||
bfa_cee_reset_stats_isr(cee, get_rsp->cmd_status);
|
||||
break;
|
||||
default:
|
||||
BUG_ON(1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_cee_notify - CEE module heart-beat failure handler.
|
||||
*
|
||||
* @event: IOC event type
|
||||
*/
|
||||
|
||||
static void
|
||||
bfa_cee_notify(void *arg, enum bfa_ioc_event event)
|
||||
{
|
||||
struct bfa_cee *cee;
|
||||
cee = (struct bfa_cee *) arg;
|
||||
|
||||
switch (event) {
|
||||
case BFA_IOC_E_DISABLED:
|
||||
case BFA_IOC_E_FAILED:
|
||||
if (cee->get_attr_pending) {
|
||||
cee->get_attr_status = BFA_STATUS_FAILED;
|
||||
cee->get_attr_pending = false;
|
||||
if (cee->cbfn.get_attr_cbfn) {
|
||||
cee->cbfn.get_attr_cbfn(
|
||||
cee->cbfn.get_attr_cbarg,
|
||||
BFA_STATUS_FAILED);
|
||||
}
|
||||
}
|
||||
if (cee->get_stats_pending) {
|
||||
cee->get_stats_status = BFA_STATUS_FAILED;
|
||||
cee->get_stats_pending = false;
|
||||
if (cee->cbfn.get_stats_cbfn) {
|
||||
cee->cbfn.get_stats_cbfn(
|
||||
cee->cbfn.get_stats_cbarg,
|
||||
BFA_STATUS_FAILED);
|
||||
}
|
||||
}
|
||||
if (cee->reset_stats_pending) {
|
||||
cee->reset_stats_status = BFA_STATUS_FAILED;
|
||||
cee->reset_stats_pending = false;
|
||||
if (cee->cbfn.reset_stats_cbfn) {
|
||||
cee->cbfn.reset_stats_cbfn(
|
||||
cee->cbfn.reset_stats_cbarg,
|
||||
BFA_STATUS_FAILED);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* bfa_nw_cee_attach - CEE module-attach API
|
||||
*
|
||||
* @cee: Pointer to the CEE module data structure
|
||||
* @ioc: Pointer to the ioc module data structure
|
||||
* @dev: Pointer to the device driver module data structure.
|
||||
* The device driver specific mbox ISR functions have
|
||||
* this pointer as one of the parameters.
|
||||
*/
|
||||
void
|
||||
bfa_nw_cee_attach(struct bfa_cee *cee, struct bfa_ioc *ioc,
|
||||
void *dev)
|
||||
{
|
||||
BUG_ON(!(cee != NULL));
|
||||
cee->dev = dev;
|
||||
cee->ioc = ioc;
|
||||
|
||||
bfa_nw_ioc_mbox_regisr(cee->ioc, BFI_MC_CEE, bfa_cee_isr, cee);
|
||||
bfa_q_qe_init(&cee->ioc_notify);
|
||||
bfa_ioc_notify_init(&cee->ioc_notify, bfa_cee_notify, cee);
|
||||
bfa_nw_ioc_notify_register(cee->ioc, &cee->ioc_notify);
|
||||
}
|
65
drivers/net/ethernet/brocade/bna/bfa_cee.h
Normal file
65
drivers/net/ethernet/brocade/bna/bfa_cee.h
Normal file
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#ifndef __BFA_CEE_H__
|
||||
#define __BFA_CEE_H__
|
||||
|
||||
#include "bfa_defs_cna.h"
|
||||
#include "bfa_ioc.h"
|
||||
|
||||
typedef void (*bfa_cee_get_attr_cbfn_t) (void *dev, enum bfa_status status);
|
||||
typedef void (*bfa_cee_get_stats_cbfn_t) (void *dev, enum bfa_status status);
|
||||
typedef void (*bfa_cee_reset_stats_cbfn_t) (void *dev, enum bfa_status status);
|
||||
|
||||
struct bfa_cee_cbfn {
|
||||
bfa_cee_get_attr_cbfn_t get_attr_cbfn;
|
||||
void *get_attr_cbarg;
|
||||
bfa_cee_get_stats_cbfn_t get_stats_cbfn;
|
||||
void *get_stats_cbarg;
|
||||
bfa_cee_reset_stats_cbfn_t reset_stats_cbfn;
|
||||
void *reset_stats_cbarg;
|
||||
};
|
||||
|
||||
struct bfa_cee {
|
||||
void *dev;
|
||||
bool get_attr_pending;
|
||||
bool get_stats_pending;
|
||||
bool reset_stats_pending;
|
||||
enum bfa_status get_attr_status;
|
||||
enum bfa_status get_stats_status;
|
||||
enum bfa_status reset_stats_status;
|
||||
struct bfa_cee_cbfn cbfn;
|
||||
struct bfa_ioc_notify ioc_notify;
|
||||
struct bfa_cee_attr *attr;
|
||||
struct bfa_cee_stats *stats;
|
||||
struct bfa_dma attr_dma;
|
||||
struct bfa_dma stats_dma;
|
||||
struct bfa_ioc *ioc;
|
||||
struct bfa_mbox_cmd get_cfg_mb;
|
||||
struct bfa_mbox_cmd get_stats_mb;
|
||||
struct bfa_mbox_cmd reset_stats_mb;
|
||||
};
|
||||
|
||||
u32 bfa_nw_cee_meminfo(void);
|
||||
void bfa_nw_cee_mem_claim(struct bfa_cee *cee, u8 *dma_kva,
|
||||
u64 dma_pa);
|
||||
void bfa_nw_cee_attach(struct bfa_cee *cee, struct bfa_ioc *ioc, void *dev);
|
||||
enum bfa_status bfa_nw_cee_get_attr(struct bfa_cee *cee,
|
||||
struct bfa_cee_attr *attr,
|
||||
bfa_cee_get_attr_cbfn_t cbfn, void *cbarg);
|
||||
#endif /* __BFA_CEE_H__ */
|
124
drivers/net/ethernet/brocade/bna/bfa_cs.h
Normal file
124
drivers/net/ethernet/brocade/bna/bfa_cs.h
Normal file
|
@ -0,0 +1,124 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
/* BFA common services */
|
||||
|
||||
#ifndef __BFA_CS_H__
|
||||
#define __BFA_CS_H__
|
||||
|
||||
#include "cna.h"
|
||||
|
||||
/* BFA state machine interfaces */
|
||||
|
||||
typedef void (*bfa_sm_t)(void *sm, int event);
|
||||
|
||||
/* oc - object class eg. bfa_ioc
|
||||
* st - state, eg. reset
|
||||
* otype - object type, eg. struct bfa_ioc
|
||||
* etype - object type, eg. enum ioc_event
|
||||
*/
|
||||
#define bfa_sm_state_decl(oc, st, otype, etype) \
|
||||
static void oc ## _sm_ ## st(otype * fsm, etype event)
|
||||
|
||||
#define bfa_sm_set_state(_sm, _state) ((_sm)->sm = (bfa_sm_t)(_state))
|
||||
#define bfa_sm_send_event(_sm, _event) ((_sm)->sm((_sm), (_event)))
|
||||
#define bfa_sm_get_state(_sm) ((_sm)->sm)
|
||||
#define bfa_sm_cmp_state(_sm, _state) ((_sm)->sm == (bfa_sm_t)(_state))
|
||||
|
||||
/* For converting from state machine function to state encoding. */
|
||||
struct bfa_sm_table {
|
||||
bfa_sm_t sm; /*!< state machine function */
|
||||
int state; /*!< state machine encoding */
|
||||
char *name; /*!< state name for display */
|
||||
};
|
||||
#define BFA_SM(_sm) ((bfa_sm_t)(_sm))
|
||||
|
||||
/* State machine with entry actions. */
|
||||
typedef void (*bfa_fsm_t)(void *fsm, int event);
|
||||
|
||||
/* oc - object class eg. bfa_ioc
|
||||
* st - state, eg. reset
|
||||
* otype - object type, eg. struct bfa_ioc
|
||||
* etype - object type, eg. enum ioc_event
|
||||
*/
|
||||
#define bfa_fsm_state_decl(oc, st, otype, etype) \
|
||||
static void oc ## _sm_ ## st(otype * fsm, etype event); \
|
||||
static void oc ## _sm_ ## st ## _entry(otype * fsm)
|
||||
|
||||
#define bfa_fsm_set_state(_fsm, _state) do { \
|
||||
(_fsm)->fsm = (bfa_fsm_t)(_state); \
|
||||
_state ## _entry(_fsm); \
|
||||
} while (0)
|
||||
|
||||
#define bfa_fsm_send_event(_fsm, _event) ((_fsm)->fsm((_fsm), (_event)))
|
||||
#define bfa_fsm_get_state(_fsm) ((_fsm)->fsm)
|
||||
#define bfa_fsm_cmp_state(_fsm, _state) \
|
||||
((_fsm)->fsm == (bfa_fsm_t)(_state))
|
||||
|
||||
static inline int
|
||||
bfa_sm_to_state(const struct bfa_sm_table *smt, bfa_sm_t sm)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (smt[i].sm && smt[i].sm != sm)
|
||||
i++;
|
||||
return smt[i].state;
|
||||
}
|
||||
|
||||
/* Generic wait counter. */
|
||||
|
||||
typedef void (*bfa_wc_resume_t) (void *cbarg);
|
||||
|
||||
struct bfa_wc {
|
||||
bfa_wc_resume_t wc_resume;
|
||||
void *wc_cbarg;
|
||||
int wc_count;
|
||||
};
|
||||
|
||||
static inline void
|
||||
bfa_wc_up(struct bfa_wc *wc)
|
||||
{
|
||||
wc->wc_count++;
|
||||
}
|
||||
|
||||
static inline void
|
||||
bfa_wc_down(struct bfa_wc *wc)
|
||||
{
|
||||
wc->wc_count--;
|
||||
if (wc->wc_count == 0)
|
||||
wc->wc_resume(wc->wc_cbarg);
|
||||
}
|
||||
|
||||
/* Initialize a waiting counter. */
|
||||
static inline void
|
||||
bfa_wc_init(struct bfa_wc *wc, bfa_wc_resume_t wc_resume, void *wc_cbarg)
|
||||
{
|
||||
wc->wc_resume = wc_resume;
|
||||
wc->wc_cbarg = wc_cbarg;
|
||||
wc->wc_count = 0;
|
||||
bfa_wc_up(wc);
|
||||
}
|
||||
|
||||
/* Wait for counter to reach zero */
|
||||
static inline void
|
||||
bfa_wc_wait(struct bfa_wc *wc)
|
||||
{
|
||||
bfa_wc_down(wc);
|
||||
}
|
||||
|
||||
#endif /* __BFA_CS_H__ */
|
295
drivers/net/ethernet/brocade/bna/bfa_defs.h
Normal file
295
drivers/net/ethernet/brocade/bna/bfa_defs.h
Normal file
|
@ -0,0 +1,295 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#ifndef __BFA_DEFS_H__
|
||||
#define __BFA_DEFS_H__
|
||||
|
||||
#include "cna.h"
|
||||
#include "bfa_defs_status.h"
|
||||
#include "bfa_defs_mfg_comm.h"
|
||||
|
||||
#define BFA_STRING_32 32
|
||||
#define BFA_VERSION_LEN 64
|
||||
|
||||
/* ---------------------- adapter definitions ------------ */
|
||||
|
||||
/* BFA adapter level attributes. */
|
||||
enum {
|
||||
BFA_ADAPTER_SERIAL_NUM_LEN = STRSZ(BFA_MFG_SERIALNUM_SIZE),
|
||||
/*
|
||||
*!< adapter serial num length
|
||||
*/
|
||||
BFA_ADAPTER_MODEL_NAME_LEN = 16, /*!< model name length */
|
||||
BFA_ADAPTER_MODEL_DESCR_LEN = 128, /*!< model description length */
|
||||
BFA_ADAPTER_MFG_NAME_LEN = 8, /*!< manufacturer name length */
|
||||
BFA_ADAPTER_SYM_NAME_LEN = 64, /*!< adapter symbolic name length */
|
||||
BFA_ADAPTER_OS_TYPE_LEN = 64, /*!< adapter os type length */
|
||||
};
|
||||
|
||||
struct bfa_adapter_attr {
|
||||
char manufacturer[BFA_ADAPTER_MFG_NAME_LEN];
|
||||
char serial_num[BFA_ADAPTER_SERIAL_NUM_LEN];
|
||||
u32 card_type;
|
||||
char model[BFA_ADAPTER_MODEL_NAME_LEN];
|
||||
char model_descr[BFA_ADAPTER_MODEL_DESCR_LEN];
|
||||
u64 pwwn;
|
||||
char node_symname[FC_SYMNAME_MAX];
|
||||
char hw_ver[BFA_VERSION_LEN];
|
||||
char fw_ver[BFA_VERSION_LEN];
|
||||
char optrom_ver[BFA_VERSION_LEN];
|
||||
char os_type[BFA_ADAPTER_OS_TYPE_LEN];
|
||||
struct bfa_mfg_vpd vpd;
|
||||
struct mac mac;
|
||||
|
||||
u8 nports;
|
||||
u8 max_speed;
|
||||
u8 prototype;
|
||||
char asic_rev;
|
||||
|
||||
u8 pcie_gen;
|
||||
u8 pcie_lanes_orig;
|
||||
u8 pcie_lanes;
|
||||
u8 cna_capable;
|
||||
|
||||
u8 is_mezz;
|
||||
u8 trunk_capable;
|
||||
};
|
||||
|
||||
/* ---------------------- IOC definitions ------------ */
|
||||
|
||||
enum {
|
||||
BFA_IOC_DRIVER_LEN = 16,
|
||||
BFA_IOC_CHIP_REV_LEN = 8,
|
||||
};
|
||||
|
||||
/* Driver and firmware versions. */
|
||||
struct bfa_ioc_driver_attr {
|
||||
char driver[BFA_IOC_DRIVER_LEN]; /*!< driver name */
|
||||
char driver_ver[BFA_VERSION_LEN]; /*!< driver version */
|
||||
char fw_ver[BFA_VERSION_LEN]; /*!< firmware version */
|
||||
char bios_ver[BFA_VERSION_LEN]; /*!< bios version */
|
||||
char efi_ver[BFA_VERSION_LEN]; /*!< EFI version */
|
||||
char ob_ver[BFA_VERSION_LEN]; /*!< openboot version */
|
||||
};
|
||||
|
||||
/* IOC PCI device attributes */
|
||||
struct bfa_ioc_pci_attr {
|
||||
u16 vendor_id; /*!< PCI vendor ID */
|
||||
u16 device_id; /*!< PCI device ID */
|
||||
u16 ssid; /*!< subsystem ID */
|
||||
u16 ssvid; /*!< subsystem vendor ID */
|
||||
u32 pcifn; /*!< PCI device function */
|
||||
u32 rsvd; /* padding */
|
||||
char chip_rev[BFA_IOC_CHIP_REV_LEN]; /*!< chip revision */
|
||||
};
|
||||
|
||||
/* IOC states */
|
||||
enum bfa_ioc_state {
|
||||
BFA_IOC_UNINIT = 1, /*!< IOC is in uninit state */
|
||||
BFA_IOC_RESET = 2, /*!< IOC is in reset state */
|
||||
BFA_IOC_SEMWAIT = 3, /*!< Waiting for IOC h/w semaphore */
|
||||
BFA_IOC_HWINIT = 4, /*!< IOC h/w is being initialized */
|
||||
BFA_IOC_GETATTR = 5, /*!< IOC is being configured */
|
||||
BFA_IOC_OPERATIONAL = 6, /*!< IOC is operational */
|
||||
BFA_IOC_INITFAIL = 7, /*!< IOC hardware failure */
|
||||
BFA_IOC_FAIL = 8, /*!< IOC heart-beat failure */
|
||||
BFA_IOC_DISABLING = 9, /*!< IOC is being disabled */
|
||||
BFA_IOC_DISABLED = 10, /*!< IOC is disabled */
|
||||
BFA_IOC_FWMISMATCH = 11, /*!< IOC f/w different from drivers */
|
||||
BFA_IOC_ENABLING = 12, /*!< IOC is being enabled */
|
||||
BFA_IOC_HWFAIL = 13, /*!< PCI mapping doesn't exist */
|
||||
};
|
||||
|
||||
/* IOC firmware stats */
|
||||
struct bfa_fw_ioc_stats {
|
||||
u32 enable_reqs;
|
||||
u32 disable_reqs;
|
||||
u32 get_attr_reqs;
|
||||
u32 dbg_sync;
|
||||
u32 dbg_dump;
|
||||
u32 unknown_reqs;
|
||||
};
|
||||
|
||||
/* IOC driver stats */
|
||||
struct bfa_ioc_drv_stats {
|
||||
u32 ioc_isrs;
|
||||
u32 ioc_enables;
|
||||
u32 ioc_disables;
|
||||
u32 ioc_hbfails;
|
||||
u32 ioc_boots;
|
||||
u32 stats_tmos;
|
||||
u32 hb_count;
|
||||
u32 disable_reqs;
|
||||
u32 enable_reqs;
|
||||
u32 disable_replies;
|
||||
u32 enable_replies;
|
||||
u32 rsvd;
|
||||
};
|
||||
|
||||
/* IOC statistics */
|
||||
struct bfa_ioc_stats {
|
||||
struct bfa_ioc_drv_stats drv_stats; /*!< driver IOC stats */
|
||||
struct bfa_fw_ioc_stats fw_stats; /*!< firmware IOC stats */
|
||||
};
|
||||
|
||||
enum bfa_ioc_type {
|
||||
BFA_IOC_TYPE_FC = 1,
|
||||
BFA_IOC_TYPE_FCoE = 2,
|
||||
BFA_IOC_TYPE_LL = 3,
|
||||
};
|
||||
|
||||
/* IOC attributes returned in queries */
|
||||
struct bfa_ioc_attr {
|
||||
enum bfa_ioc_type ioc_type;
|
||||
enum bfa_ioc_state state; /*!< IOC state */
|
||||
struct bfa_adapter_attr adapter_attr; /*!< HBA attributes */
|
||||
struct bfa_ioc_driver_attr driver_attr; /*!< driver attr */
|
||||
struct bfa_ioc_pci_attr pci_attr;
|
||||
u8 port_id; /*!< port number */
|
||||
u8 port_mode; /*!< enum bfa_mode */
|
||||
u8 cap_bm; /*!< capability */
|
||||
u8 port_mode_cfg; /*!< enum bfa_mode */
|
||||
u8 def_fn; /*!< 1 if default fn */
|
||||
u8 rsvd[3]; /*!< 64bit align */
|
||||
};
|
||||
|
||||
/* Adapter capability mask definition */
|
||||
enum {
|
||||
BFA_CM_HBA = 0x01,
|
||||
BFA_CM_CNA = 0x02,
|
||||
BFA_CM_NIC = 0x04,
|
||||
};
|
||||
|
||||
/* ---------------------- mfg definitions ------------ */
|
||||
|
||||
/* Checksum size */
|
||||
#define BFA_MFG_CHKSUM_SIZE 16
|
||||
|
||||
#define BFA_MFG_PARTNUM_SIZE 14
|
||||
#define BFA_MFG_SUPPLIER_ID_SIZE 10
|
||||
#define BFA_MFG_SUPPLIER_PARTNUM_SIZE 20
|
||||
#define BFA_MFG_SUPPLIER_SERIALNUM_SIZE 20
|
||||
#define BFA_MFG_SUPPLIER_REVISION_SIZE 4
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
/* BFA adapter manufacturing block definition.
|
||||
*
|
||||
* All numerical fields are in big-endian format.
|
||||
*/
|
||||
struct bfa_mfg_block {
|
||||
u8 version; /* manufacturing block version */
|
||||
u8 mfg_sig[3]; /* characters 'M', 'F', 'G' */
|
||||
u16 mfgsize; /* mfg block size */
|
||||
u16 u16_chksum; /* old u16 checksum */
|
||||
char brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)];
|
||||
char brcd_partnum[STRSZ(BFA_MFG_PARTNUM_SIZE)];
|
||||
u8 mfg_day; /* manufacturing day */
|
||||
u8 mfg_month; /* manufacturing month */
|
||||
u16 mfg_year; /* manufacturing year */
|
||||
u64 mfg_wwn; /* wwn base for this adapter */
|
||||
u8 num_wwn; /* number of wwns assigned */
|
||||
u8 mfg_speeds; /* speeds allowed for this adapter */
|
||||
u8 rsv[2];
|
||||
char supplier_id[STRSZ(BFA_MFG_SUPPLIER_ID_SIZE)];
|
||||
char supplier_partnum[STRSZ(BFA_MFG_SUPPLIER_PARTNUM_SIZE)];
|
||||
char supplier_serialnum[STRSZ(BFA_MFG_SUPPLIER_SERIALNUM_SIZE)];
|
||||
char supplier_revision[STRSZ(BFA_MFG_SUPPLIER_REVISION_SIZE)];
|
||||
mac_t mfg_mac; /* base mac address */
|
||||
u8 num_mac; /* number of mac addresses */
|
||||
u8 rsv2;
|
||||
u32 card_type; /* card type */
|
||||
char cap_nic; /* capability nic */
|
||||
char cap_cna; /* capability cna */
|
||||
char cap_hba; /* capability hba */
|
||||
char cap_fc16g; /* capability fc 16g */
|
||||
char cap_sriov; /* capability sriov */
|
||||
char cap_mezz; /* capability mezz */
|
||||
u8 rsv3;
|
||||
u8 mfg_nports; /* number of ports */
|
||||
char media[8]; /* xfi/xaui */
|
||||
char initial_mode[8]; /* initial mode: hba/cna/nic */
|
||||
u8 rsv4[84];
|
||||
u8 md5_chksum[BFA_MFG_CHKSUM_SIZE]; /* md5 checksum */
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
/* ---------------------- pci definitions ------------ */
|
||||
|
||||
/*
|
||||
* PCI device ID information
|
||||
*/
|
||||
enum {
|
||||
BFA_PCI_DEVICE_ID_CT2 = 0x22,
|
||||
};
|
||||
|
||||
#define bfa_asic_id_ct(device) \
|
||||
((device) == PCI_DEVICE_ID_BROCADE_CT || \
|
||||
(device) == PCI_DEVICE_ID_BROCADE_CT_FC)
|
||||
#define bfa_asic_id_ct2(device) \
|
||||
((device) == BFA_PCI_DEVICE_ID_CT2)
|
||||
#define bfa_asic_id_ctc(device) \
|
||||
(bfa_asic_id_ct(device) || bfa_asic_id_ct2(device))
|
||||
|
||||
/* PCI sub-system device and vendor ID information */
|
||||
enum {
|
||||
BFA_PCI_FCOE_SSDEVICE_ID = 0x14,
|
||||
BFA_PCI_CT2_SSID_FCoE = 0x22,
|
||||
BFA_PCI_CT2_SSID_ETH = 0x23,
|
||||
BFA_PCI_CT2_SSID_FC = 0x24,
|
||||
};
|
||||
|
||||
enum bfa_mode {
|
||||
BFA_MODE_HBA = 1,
|
||||
BFA_MODE_CNA = 2,
|
||||
BFA_MODE_NIC = 3
|
||||
};
|
||||
|
||||
/*
|
||||
* Flash module specific
|
||||
*/
|
||||
#define BFA_FLASH_PART_ENTRY_SIZE 32 /* partition entry size */
|
||||
#define BFA_FLASH_PART_MAX 32 /* maximal # of partitions */
|
||||
#define BFA_TOTAL_FLASH_SIZE 0x400000
|
||||
#define BFA_FLASH_PART_FWIMG 2
|
||||
#define BFA_FLASH_PART_MFG 7
|
||||
|
||||
/*
|
||||
* flash partition attributes
|
||||
*/
|
||||
struct bfa_flash_part_attr {
|
||||
u32 part_type; /* partition type */
|
||||
u32 part_instance; /* partition instance */
|
||||
u32 part_off; /* partition offset */
|
||||
u32 part_size; /* partition size */
|
||||
u32 part_len; /* partition content length */
|
||||
u32 part_status; /* partition status */
|
||||
char rsv[BFA_FLASH_PART_ENTRY_SIZE - 24];
|
||||
};
|
||||
|
||||
/*
|
||||
* flash attributes
|
||||
*/
|
||||
struct bfa_flash_attr {
|
||||
u32 status; /* flash overall status */
|
||||
u32 npart; /* num of partitions */
|
||||
struct bfa_flash_part_attr part[BFA_FLASH_PART_MAX];
|
||||
};
|
||||
|
||||
#endif /* __BFA_DEFS_H__ */
|
220
drivers/net/ethernet/brocade/bna/bfa_defs_cna.h
Normal file
220
drivers/net/ethernet/brocade/bna/bfa_defs_cna.h
Normal file
|
@ -0,0 +1,220 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
#ifndef __BFA_DEFS_CNA_H__
|
||||
#define __BFA_DEFS_CNA_H__
|
||||
|
||||
#include "bfa_defs.h"
|
||||
|
||||
/* FC physical port statistics. */
|
||||
struct bfa_port_fc_stats {
|
||||
u64 secs_reset; /*!< Seconds since stats is reset */
|
||||
u64 tx_frames; /*!< Tx frames */
|
||||
u64 tx_words; /*!< Tx words */
|
||||
u64 tx_lip; /*!< Tx LIP */
|
||||
u64 tx_nos; /*!< Tx NOS */
|
||||
u64 tx_ols; /*!< Tx OLS */
|
||||
u64 tx_lr; /*!< Tx LR */
|
||||
u64 tx_lrr; /*!< Tx LRR */
|
||||
u64 rx_frames; /*!< Rx frames */
|
||||
u64 rx_words; /*!< Rx words */
|
||||
u64 lip_count; /*!< Rx LIP */
|
||||
u64 nos_count; /*!< Rx NOS */
|
||||
u64 ols_count; /*!< Rx OLS */
|
||||
u64 lr_count; /*!< Rx LR */
|
||||
u64 lrr_count; /*!< Rx LRR */
|
||||
u64 invalid_crcs; /*!< Rx CRC err frames */
|
||||
u64 invalid_crc_gd_eof; /*!< Rx CRC err good EOF frames */
|
||||
u64 undersized_frm; /*!< Rx undersized frames */
|
||||
u64 oversized_frm; /*!< Rx oversized frames */
|
||||
u64 bad_eof_frm; /*!< Rx frames with bad EOF */
|
||||
u64 error_frames; /*!< Errored frames */
|
||||
u64 dropped_frames; /*!< Dropped frames */
|
||||
u64 link_failures; /*!< Link Failure (LF) count */
|
||||
u64 loss_of_syncs; /*!< Loss of sync count */
|
||||
u64 loss_of_signals; /*!< Loss of signal count */
|
||||
u64 primseq_errs; /*!< Primitive sequence protocol err. */
|
||||
u64 bad_os_count; /*!< Invalid ordered sets */
|
||||
u64 err_enc_out; /*!< Encoding err nonframe_8b10b */
|
||||
u64 err_enc; /*!< Encoding err frame_8b10b */
|
||||
u64 bbsc_frames_lost; /*!< Credit Recovery-Frames Lost */
|
||||
u64 bbsc_credits_lost; /*!< Credit Recovery-Credits Lost */
|
||||
u64 bbsc_link_resets; /*!< Credit Recovery-Link Resets */
|
||||
};
|
||||
|
||||
/* Eth Physical Port statistics. */
|
||||
struct bfa_port_eth_stats {
|
||||
u64 secs_reset; /*!< Seconds since stats is reset */
|
||||
u64 frame_64; /*!< Frames 64 bytes */
|
||||
u64 frame_65_127; /*!< Frames 65-127 bytes */
|
||||
u64 frame_128_255; /*!< Frames 128-255 bytes */
|
||||
u64 frame_256_511; /*!< Frames 256-511 bytes */
|
||||
u64 frame_512_1023; /*!< Frames 512-1023 bytes */
|
||||
u64 frame_1024_1518; /*!< Frames 1024-1518 bytes */
|
||||
u64 frame_1519_1522; /*!< Frames 1519-1522 bytes */
|
||||
u64 tx_bytes; /*!< Tx bytes */
|
||||
u64 tx_packets; /*!< Tx packets */
|
||||
u64 tx_mcast_packets; /*!< Tx multicast packets */
|
||||
u64 tx_bcast_packets; /*!< Tx broadcast packets */
|
||||
u64 tx_control_frame; /*!< Tx control frame */
|
||||
u64 tx_drop; /*!< Tx drops */
|
||||
u64 tx_jabber; /*!< Tx jabber */
|
||||
u64 tx_fcs_error; /*!< Tx FCS errors */
|
||||
u64 tx_fragments; /*!< Tx fragments */
|
||||
u64 rx_bytes; /*!< Rx bytes */
|
||||
u64 rx_packets; /*!< Rx packets */
|
||||
u64 rx_mcast_packets; /*!< Rx multicast packets */
|
||||
u64 rx_bcast_packets; /*!< Rx broadcast packets */
|
||||
u64 rx_control_frames; /*!< Rx control frames */
|
||||
u64 rx_unknown_opcode; /*!< Rx unknown opcode */
|
||||
u64 rx_drop; /*!< Rx drops */
|
||||
u64 rx_jabber; /*!< Rx jabber */
|
||||
u64 rx_fcs_error; /*!< Rx FCS errors */
|
||||
u64 rx_alignment_error; /*!< Rx alignment errors */
|
||||
u64 rx_frame_length_error; /*!< Rx frame len errors */
|
||||
u64 rx_code_error; /*!< Rx code errors */
|
||||
u64 rx_fragments; /*!< Rx fragments */
|
||||
u64 rx_pause; /*!< Rx pause */
|
||||
u64 rx_zero_pause; /*!< Rx zero pause */
|
||||
u64 tx_pause; /*!< Tx pause */
|
||||
u64 tx_zero_pause; /*!< Tx zero pause */
|
||||
u64 rx_fcoe_pause; /*!< Rx FCoE pause */
|
||||
u64 rx_fcoe_zero_pause; /*!< Rx FCoE zero pause */
|
||||
u64 tx_fcoe_pause; /*!< Tx FCoE pause */
|
||||
u64 tx_fcoe_zero_pause; /*!< Tx FCoE zero pause */
|
||||
u64 rx_iscsi_pause; /*!< Rx iSCSI pause */
|
||||
u64 rx_iscsi_zero_pause; /*!< Rx iSCSI zero pause */
|
||||
u64 tx_iscsi_pause; /*!< Tx iSCSI pause */
|
||||
u64 tx_iscsi_zero_pause; /*!< Tx iSCSI zero pause */
|
||||
};
|
||||
|
||||
/* Port statistics. */
|
||||
union bfa_port_stats_u {
|
||||
struct bfa_port_fc_stats fc;
|
||||
struct bfa_port_eth_stats eth;
|
||||
};
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
#define BFA_CEE_LLDP_MAX_STRING_LEN (128)
|
||||
#define BFA_CEE_DCBX_MAX_PRIORITY (8)
|
||||
#define BFA_CEE_DCBX_MAX_PGID (8)
|
||||
|
||||
#define BFA_CEE_LLDP_SYS_CAP_OTHER 0x0001
|
||||
#define BFA_CEE_LLDP_SYS_CAP_REPEATER 0x0002
|
||||
#define BFA_CEE_LLDP_SYS_CAP_MAC_BRIDGE 0x0004
|
||||
#define BFA_CEE_LLDP_SYS_CAP_WLAN_AP 0x0008
|
||||
#define BFA_CEE_LLDP_SYS_CAP_ROUTER 0x0010
|
||||
#define BFA_CEE_LLDP_SYS_CAP_TELEPHONE 0x0020
|
||||
#define BFA_CEE_LLDP_SYS_CAP_DOCSIS_CD 0x0040
|
||||
#define BFA_CEE_LLDP_SYS_CAP_STATION 0x0080
|
||||
#define BFA_CEE_LLDP_SYS_CAP_CVLAN 0x0100
|
||||
#define BFA_CEE_LLDP_SYS_CAP_SVLAN 0x0200
|
||||
#define BFA_CEE_LLDP_SYS_CAP_TPMR 0x0400
|
||||
|
||||
/* LLDP string type */
|
||||
struct bfa_cee_lldp_str {
|
||||
u8 sub_type;
|
||||
u8 len;
|
||||
u8 rsvd[2];
|
||||
u8 value[BFA_CEE_LLDP_MAX_STRING_LEN];
|
||||
};
|
||||
|
||||
/* LLDP paramters */
|
||||
struct bfa_cee_lldp_cfg {
|
||||
struct bfa_cee_lldp_str chassis_id;
|
||||
struct bfa_cee_lldp_str port_id;
|
||||
struct bfa_cee_lldp_str port_desc;
|
||||
struct bfa_cee_lldp_str sys_name;
|
||||
struct bfa_cee_lldp_str sys_desc;
|
||||
struct bfa_cee_lldp_str mgmt_addr;
|
||||
u16 time_to_live;
|
||||
u16 enabled_system_cap;
|
||||
};
|
||||
|
||||
enum bfa_cee_dcbx_version {
|
||||
DCBX_PROTOCOL_PRECEE = 1,
|
||||
DCBX_PROTOCOL_CEE = 2,
|
||||
};
|
||||
|
||||
enum bfa_cee_lls {
|
||||
/* LLS is down because the TLV not sent by the peer */
|
||||
CEE_LLS_DOWN_NO_TLV = 0,
|
||||
/* LLS is down as advertised by the peer */
|
||||
CEE_LLS_DOWN = 1,
|
||||
CEE_LLS_UP = 2,
|
||||
};
|
||||
|
||||
/* CEE/DCBX parameters */
|
||||
struct bfa_cee_dcbx_cfg {
|
||||
u8 pgid[BFA_CEE_DCBX_MAX_PRIORITY];
|
||||
u8 pg_percentage[BFA_CEE_DCBX_MAX_PGID];
|
||||
u8 pfc_primap; /* bitmap of priorties with PFC enabled */
|
||||
u8 fcoe_primap; /* bitmap of priorities used for FcoE traffic */
|
||||
u8 iscsi_primap; /* bitmap of priorities used for iSCSI traffic */
|
||||
u8 dcbx_version; /* operating version:CEE or preCEE */
|
||||
u8 lls_fcoe; /* FCoE Logical Link Status */
|
||||
u8 lls_lan; /* LAN Logical Link Status */
|
||||
u8 rsvd[2];
|
||||
};
|
||||
|
||||
/* CEE status */
|
||||
/* Making this to tri-state for the benefit of port list command */
|
||||
enum bfa_cee_status {
|
||||
CEE_UP = 0,
|
||||
CEE_PHY_UP = 1,
|
||||
CEE_LOOPBACK = 2,
|
||||
CEE_PHY_DOWN = 3,
|
||||
};
|
||||
|
||||
/* CEE Query */
|
||||
struct bfa_cee_attr {
|
||||
u8 cee_status;
|
||||
u8 error_reason;
|
||||
struct bfa_cee_lldp_cfg lldp_remote;
|
||||
struct bfa_cee_dcbx_cfg dcbx_remote;
|
||||
mac_t src_mac;
|
||||
u8 link_speed;
|
||||
u8 nw_priority;
|
||||
u8 filler[2];
|
||||
};
|
||||
|
||||
/* LLDP/DCBX/CEE Statistics */
|
||||
struct bfa_cee_stats {
|
||||
u32 lldp_tx_frames; /*!< LLDP Tx Frames */
|
||||
u32 lldp_rx_frames; /*!< LLDP Rx Frames */
|
||||
u32 lldp_rx_frames_invalid; /*!< LLDP Rx Frames invalid */
|
||||
u32 lldp_rx_frames_new; /*!< LLDP Rx Frames new */
|
||||
u32 lldp_tlvs_unrecognized; /*!< LLDP Rx unrecognized TLVs */
|
||||
u32 lldp_rx_shutdown_tlvs; /*!< LLDP Rx shutdown TLVs */
|
||||
u32 lldp_info_aged_out; /*!< LLDP remote info aged out */
|
||||
u32 dcbx_phylink_ups; /*!< DCBX phy link ups */
|
||||
u32 dcbx_phylink_downs; /*!< DCBX phy link downs */
|
||||
u32 dcbx_rx_tlvs; /*!< DCBX Rx TLVs */
|
||||
u32 dcbx_rx_tlvs_invalid; /*!< DCBX Rx TLVs invalid */
|
||||
u32 dcbx_control_tlv_error; /*!< DCBX control TLV errors */
|
||||
u32 dcbx_feature_tlv_error; /*!< DCBX feature TLV errors */
|
||||
u32 dcbx_cee_cfg_new; /*!< DCBX new CEE cfg rcvd */
|
||||
u32 cee_status_down; /*!< CEE status down */
|
||||
u32 cee_status_up; /*!< CEE status up */
|
||||
u32 cee_hw_cfg_changed; /*!< CEE hw cfg changed */
|
||||
u32 cee_rx_invalid_cfg; /*!< CEE invalid cfg */
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif /* __BFA_DEFS_CNA_H__ */
|
154
drivers/net/ethernet/brocade/bna/bfa_defs_mfg_comm.h
Normal file
154
drivers/net/ethernet/brocade/bna/bfa_defs_mfg_comm.h
Normal file
|
@ -0,0 +1,154 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
#ifndef __BFA_DEFS_MFG_COMM_H__
|
||||
#define __BFA_DEFS_MFG_COMM_H__
|
||||
|
||||
#include "bfa_defs.h"
|
||||
|
||||
/* Manufacturing block version */
|
||||
#define BFA_MFG_VERSION 3
|
||||
#define BFA_MFG_VERSION_UNINIT 0xFF
|
||||
|
||||
/* Manufacturing block encrypted version */
|
||||
#define BFA_MFG_ENC_VER 2
|
||||
|
||||
/* Manufacturing block version 1 length */
|
||||
#define BFA_MFG_VER1_LEN 128
|
||||
|
||||
/* Manufacturing block header length */
|
||||
#define BFA_MFG_HDR_LEN 4
|
||||
|
||||
#define BFA_MFG_SERIALNUM_SIZE 11
|
||||
#define STRSZ(_n) (((_n) + 4) & ~3)
|
||||
|
||||
/* Manufacturing card type */
|
||||
enum {
|
||||
BFA_MFG_TYPE_CB_MAX = 825, /*!< Crossbow card type max */
|
||||
BFA_MFG_TYPE_FC8P2 = 825, /*!< 8G 2port FC card */
|
||||
BFA_MFG_TYPE_FC8P1 = 815, /*!< 8G 1port FC card */
|
||||
BFA_MFG_TYPE_FC4P2 = 425, /*!< 4G 2port FC card */
|
||||
BFA_MFG_TYPE_FC4P1 = 415, /*!< 4G 1port FC card */
|
||||
BFA_MFG_TYPE_CNA10P2 = 1020, /*!< 10G 2port CNA card */
|
||||
BFA_MFG_TYPE_CNA10P1 = 1010, /*!< 10G 1port CNA card */
|
||||
BFA_MFG_TYPE_JAYHAWK = 804, /*!< Jayhawk mezz card */
|
||||
BFA_MFG_TYPE_WANCHESE = 1007, /*!< Wanchese mezz card */
|
||||
BFA_MFG_TYPE_ASTRA = 807, /*!< Astra mezz card */
|
||||
BFA_MFG_TYPE_LIGHTNING_P0 = 902, /*!< Lightning mezz card - old */
|
||||
BFA_MFG_TYPE_LIGHTNING = 1741, /*!< Lightning mezz card */
|
||||
BFA_MFG_TYPE_PROWLER_F = 1560, /*!< Prowler FC only cards */
|
||||
BFA_MFG_TYPE_PROWLER_N = 1410, /*!< Prowler NIC only cards */
|
||||
BFA_MFG_TYPE_PROWLER_C = 1710, /*!< Prowler CNA only cards */
|
||||
BFA_MFG_TYPE_PROWLER_D = 1860, /*!< Prowler Dual cards */
|
||||
BFA_MFG_TYPE_CHINOOK = 1867, /*!< Chinook cards */
|
||||
BFA_MFG_TYPE_INVALID = 0, /*!< Invalid card type */
|
||||
};
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
/* Check if Mezz card */
|
||||
#define bfa_mfg_is_mezz(type) (( \
|
||||
(type) == BFA_MFG_TYPE_JAYHAWK || \
|
||||
(type) == BFA_MFG_TYPE_WANCHESE || \
|
||||
(type) == BFA_MFG_TYPE_ASTRA || \
|
||||
(type) == BFA_MFG_TYPE_LIGHTNING_P0 || \
|
||||
(type) == BFA_MFG_TYPE_LIGHTNING || \
|
||||
(type) == BFA_MFG_TYPE_CHINOOK))
|
||||
|
||||
enum {
|
||||
CB_GPIO_TTV = (1), /*!< TTV debug capable cards */
|
||||
CB_GPIO_FC8P2 = (2), /*!< 8G 2port FC card */
|
||||
CB_GPIO_FC8P1 = (3), /*!< 8G 1port FC card */
|
||||
CB_GPIO_FC4P2 = (4), /*!< 4G 2port FC card */
|
||||
CB_GPIO_FC4P1 = (5), /*!< 4G 1port FC card */
|
||||
CB_GPIO_DFLY = (6), /*!< 8G 2port FC mezzanine card */
|
||||
CB_GPIO_PROTO = (1 << 7) /*!< 8G 2port FC prototypes */
|
||||
};
|
||||
|
||||
#define bfa_mfg_adapter_prop_init_gpio(gpio, card_type, prop) \
|
||||
do { \
|
||||
if ((gpio) & CB_GPIO_PROTO) { \
|
||||
(prop) |= BFI_ADAPTER_PROTO; \
|
||||
(gpio) &= ~CB_GPIO_PROTO; \
|
||||
} \
|
||||
switch ((gpio)) { \
|
||||
case CB_GPIO_TTV: \
|
||||
(prop) |= BFI_ADAPTER_TTV; \
|
||||
case CB_GPIO_DFLY: \
|
||||
case CB_GPIO_FC8P2: \
|
||||
(prop) |= BFI_ADAPTER_SETP(NPORTS, 2); \
|
||||
(prop) |= BFI_ADAPTER_SETP(SPEED, 8); \
|
||||
(card_type) = BFA_MFG_TYPE_FC8P2; \
|
||||
break; \
|
||||
case CB_GPIO_FC8P1: \
|
||||
(prop) |= BFI_ADAPTER_SETP(NPORTS, 1); \
|
||||
(prop) |= BFI_ADAPTER_SETP(SPEED, 8); \
|
||||
(card_type) = BFA_MFG_TYPE_FC8P1; \
|
||||
break; \
|
||||
case CB_GPIO_FC4P2: \
|
||||
(prop) |= BFI_ADAPTER_SETP(NPORTS, 2); \
|
||||
(prop) |= BFI_ADAPTER_SETP(SPEED, 4); \
|
||||
(card_type) = BFA_MFG_TYPE_FC4P2; \
|
||||
break; \
|
||||
case CB_GPIO_FC4P1: \
|
||||
(prop) |= BFI_ADAPTER_SETP(NPORTS, 1); \
|
||||
(prop) |= BFI_ADAPTER_SETP(SPEED, 4); \
|
||||
(card_type) = BFA_MFG_TYPE_FC4P1; \
|
||||
break; \
|
||||
default: \
|
||||
(prop) |= BFI_ADAPTER_UNSUPP; \
|
||||
(card_type) = BFA_MFG_TYPE_INVALID; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* VPD data length */
|
||||
#define BFA_MFG_VPD_LEN 512
|
||||
#define BFA_MFG_VPD_LEN_INVALID 0
|
||||
|
||||
#define BFA_MFG_VPD_PCI_HDR_OFF 137
|
||||
#define BFA_MFG_VPD_PCI_VER_MASK 0x07 /*!< version mask 3 bits */
|
||||
#define BFA_MFG_VPD_PCI_VDR_MASK 0xf8 /*!< vendor mask 5 bits */
|
||||
|
||||
/* VPD vendor tag */
|
||||
enum {
|
||||
BFA_MFG_VPD_UNKNOWN = 0, /*!< vendor unknown */
|
||||
BFA_MFG_VPD_IBM = 1, /*!< vendor IBM */
|
||||
BFA_MFG_VPD_HP = 2, /*!< vendor HP */
|
||||
BFA_MFG_VPD_DELL = 3, /*!< vendor DELL */
|
||||
BFA_MFG_VPD_PCI_IBM = 0x08, /*!< PCI VPD IBM */
|
||||
BFA_MFG_VPD_PCI_HP = 0x10, /*!< PCI VPD HP */
|
||||
BFA_MFG_VPD_PCI_DELL = 0x20, /*!< PCI VPD DELL */
|
||||
BFA_MFG_VPD_PCI_BRCD = 0xf8, /*!< PCI VPD Brocade */
|
||||
};
|
||||
|
||||
/* BFA adapter flash vpd data definition.
|
||||
*
|
||||
* All numerical fields are in big-endian format.
|
||||
*/
|
||||
struct bfa_mfg_vpd {
|
||||
u8 version; /*!< vpd data version */
|
||||
u8 vpd_sig[3]; /*!< characters 'V', 'P', 'D' */
|
||||
u8 chksum; /*!< u8 checksum */
|
||||
u8 vendor; /*!< vendor */
|
||||
u8 len; /*!< vpd data length excluding header */
|
||||
u8 rsv;
|
||||
u8 data[BFA_MFG_VPD_LEN]; /*!< vpd data */
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif /* __BFA_DEFS_MFG_H__ */
|
215
drivers/net/ethernet/brocade/bna/bfa_defs_status.h
Normal file
215
drivers/net/ethernet/brocade/bna/bfa_defs_status.h
Normal file
|
@ -0,0 +1,215 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
#ifndef __BFA_DEFS_STATUS_H__
|
||||
#define __BFA_DEFS_STATUS_H__
|
||||
|
||||
/* API status return values
|
||||
*
|
||||
* NOTE: The error msgs are auto generated from the comments. Only singe line
|
||||
* comments are supported
|
||||
*/
|
||||
enum bfa_status {
|
||||
BFA_STATUS_OK = 0,
|
||||
BFA_STATUS_FAILED = 1,
|
||||
BFA_STATUS_EINVAL = 2,
|
||||
BFA_STATUS_ENOMEM = 3,
|
||||
BFA_STATUS_ENOSYS = 4,
|
||||
BFA_STATUS_ETIMER = 5,
|
||||
BFA_STATUS_EPROTOCOL = 6,
|
||||
BFA_STATUS_ENOFCPORTS = 7,
|
||||
BFA_STATUS_NOFLASH = 8,
|
||||
BFA_STATUS_BADFLASH = 9,
|
||||
BFA_STATUS_SFP_UNSUPP = 10,
|
||||
BFA_STATUS_UNKNOWN_VFID = 11,
|
||||
BFA_STATUS_DATACORRUPTED = 12,
|
||||
BFA_STATUS_DEVBUSY = 13,
|
||||
BFA_STATUS_ABORTED = 14,
|
||||
BFA_STATUS_NODEV = 15,
|
||||
BFA_STATUS_HDMA_FAILED = 16,
|
||||
BFA_STATUS_FLASH_BAD_LEN = 17,
|
||||
BFA_STATUS_UNKNOWN_LWWN = 18,
|
||||
BFA_STATUS_UNKNOWN_RWWN = 19,
|
||||
BFA_STATUS_FCPT_LS_RJT = 20,
|
||||
BFA_STATUS_VPORT_EXISTS = 21,
|
||||
BFA_STATUS_VPORT_MAX = 22,
|
||||
BFA_STATUS_UNSUPP_SPEED = 23,
|
||||
BFA_STATUS_INVLD_DFSZ = 24,
|
||||
BFA_STATUS_CNFG_FAILED = 25,
|
||||
BFA_STATUS_CMD_NOTSUPP = 26,
|
||||
BFA_STATUS_NO_ADAPTER = 27,
|
||||
BFA_STATUS_LINKDOWN = 28,
|
||||
BFA_STATUS_FABRIC_RJT = 29,
|
||||
BFA_STATUS_UNKNOWN_VWWN = 30,
|
||||
BFA_STATUS_NSLOGIN_FAILED = 31,
|
||||
BFA_STATUS_NO_RPORTS = 32,
|
||||
BFA_STATUS_NSQUERY_FAILED = 33,
|
||||
BFA_STATUS_PORT_OFFLINE = 34,
|
||||
BFA_STATUS_RPORT_OFFLINE = 35,
|
||||
BFA_STATUS_TGTOPEN_FAILED = 36,
|
||||
BFA_STATUS_BAD_LUNS = 37,
|
||||
BFA_STATUS_IO_FAILURE = 38,
|
||||
BFA_STATUS_NO_FABRIC = 39,
|
||||
BFA_STATUS_EBADF = 40,
|
||||
BFA_STATUS_EINTR = 41,
|
||||
BFA_STATUS_EIO = 42,
|
||||
BFA_STATUS_ENOTTY = 43,
|
||||
BFA_STATUS_ENXIO = 44,
|
||||
BFA_STATUS_EFOPEN = 45,
|
||||
BFA_STATUS_VPORT_WWN_BP = 46,
|
||||
BFA_STATUS_PORT_NOT_DISABLED = 47,
|
||||
BFA_STATUS_BADFRMHDR = 48,
|
||||
BFA_STATUS_BADFRMSZ = 49,
|
||||
BFA_STATUS_MISSINGFRM = 50,
|
||||
BFA_STATUS_LINKTIMEOUT = 51,
|
||||
BFA_STATUS_NO_FCPIM_NEXUS = 52,
|
||||
BFA_STATUS_CHECKSUM_FAIL = 53,
|
||||
BFA_STATUS_GZME_FAILED = 54,
|
||||
BFA_STATUS_SCSISTART_REQD = 55,
|
||||
BFA_STATUS_IOC_FAILURE = 56,
|
||||
BFA_STATUS_INVALID_WWN = 57,
|
||||
BFA_STATUS_MISMATCH = 58,
|
||||
BFA_STATUS_IOC_ENABLED = 59,
|
||||
BFA_STATUS_ADAPTER_ENABLED = 60,
|
||||
BFA_STATUS_IOC_NON_OP = 61,
|
||||
BFA_STATUS_ADDR_MAP_FAILURE = 62,
|
||||
BFA_STATUS_SAME_NAME = 63,
|
||||
BFA_STATUS_PENDING = 64,
|
||||
BFA_STATUS_8G_SPD = 65,
|
||||
BFA_STATUS_4G_SPD = 66,
|
||||
BFA_STATUS_AD_IS_ENABLE = 67,
|
||||
BFA_STATUS_EINVAL_TOV = 68,
|
||||
BFA_STATUS_EINVAL_QDEPTH = 69,
|
||||
BFA_STATUS_VERSION_FAIL = 70,
|
||||
BFA_STATUS_DIAG_BUSY = 71,
|
||||
BFA_STATUS_BEACON_ON = 72,
|
||||
BFA_STATUS_BEACON_OFF = 73,
|
||||
BFA_STATUS_LBEACON_ON = 74,
|
||||
BFA_STATUS_LBEACON_OFF = 75,
|
||||
BFA_STATUS_PORT_NOT_INITED = 76,
|
||||
BFA_STATUS_RPSC_ENABLED = 77,
|
||||
BFA_STATUS_ENOFSAVE = 78,
|
||||
BFA_STATUS_BAD_FILE = 79,
|
||||
BFA_STATUS_RLIM_EN = 80,
|
||||
BFA_STATUS_RLIM_DIS = 81,
|
||||
BFA_STATUS_IOC_DISABLED = 82,
|
||||
BFA_STATUS_ADAPTER_DISABLED = 83,
|
||||
BFA_STATUS_BIOS_DISABLED = 84,
|
||||
BFA_STATUS_AUTH_ENABLED = 85,
|
||||
BFA_STATUS_AUTH_DISABLED = 86,
|
||||
BFA_STATUS_ERROR_TRL_ENABLED = 87,
|
||||
BFA_STATUS_ERROR_QOS_ENABLED = 88,
|
||||
BFA_STATUS_NO_SFP_DEV = 89,
|
||||
BFA_STATUS_MEMTEST_FAILED = 90,
|
||||
BFA_STATUS_INVALID_DEVID = 91,
|
||||
BFA_STATUS_QOS_ENABLED = 92,
|
||||
BFA_STATUS_QOS_DISABLED = 93,
|
||||
BFA_STATUS_INCORRECT_DRV_CONFIG = 94,
|
||||
BFA_STATUS_REG_FAIL = 95,
|
||||
BFA_STATUS_IM_INV_CODE = 96,
|
||||
BFA_STATUS_IM_INV_VLAN = 97,
|
||||
BFA_STATUS_IM_INV_ADAPT_NAME = 98,
|
||||
BFA_STATUS_IM_LOW_RESOURCES = 99,
|
||||
BFA_STATUS_IM_VLANID_IS_PVID = 100,
|
||||
BFA_STATUS_IM_VLANID_EXISTS = 101,
|
||||
BFA_STATUS_IM_FW_UPDATE_FAIL = 102,
|
||||
BFA_STATUS_PORTLOG_ENABLED = 103,
|
||||
BFA_STATUS_PORTLOG_DISABLED = 104,
|
||||
BFA_STATUS_FILE_NOT_FOUND = 105,
|
||||
BFA_STATUS_QOS_FC_ONLY = 106,
|
||||
BFA_STATUS_RLIM_FC_ONLY = 107,
|
||||
BFA_STATUS_CT_SPD = 108,
|
||||
BFA_STATUS_LEDTEST_OP = 109,
|
||||
BFA_STATUS_CEE_NOT_DN = 110,
|
||||
BFA_STATUS_10G_SPD = 111,
|
||||
BFA_STATUS_IM_INV_TEAM_NAME = 112,
|
||||
BFA_STATUS_IM_DUP_TEAM_NAME = 113,
|
||||
BFA_STATUS_IM_ADAPT_ALREADY_IN_TEAM = 114,
|
||||
BFA_STATUS_IM_ADAPT_HAS_VLANS = 115,
|
||||
BFA_STATUS_IM_PVID_MISMATCH = 116,
|
||||
BFA_STATUS_IM_LINK_SPEED_MISMATCH = 117,
|
||||
BFA_STATUS_IM_MTU_MISMATCH = 118,
|
||||
BFA_STATUS_IM_RSS_MISMATCH = 119,
|
||||
BFA_STATUS_IM_HDS_MISMATCH = 120,
|
||||
BFA_STATUS_IM_OFFLOAD_MISMATCH = 121,
|
||||
BFA_STATUS_IM_PORT_PARAMS = 122,
|
||||
BFA_STATUS_IM_PORT_NOT_IN_TEAM = 123,
|
||||
BFA_STATUS_IM_CANNOT_REM_PRI = 124,
|
||||
BFA_STATUS_IM_MAX_PORTS_REACHED = 125,
|
||||
BFA_STATUS_IM_LAST_PORT_DELETE = 126,
|
||||
BFA_STATUS_IM_NO_DRIVER = 127,
|
||||
BFA_STATUS_IM_MAX_VLANS_REACHED = 128,
|
||||
BFA_STATUS_TOMCAT_SPD_NOT_ALLOWED = 129,
|
||||
BFA_STATUS_NO_MINPORT_DRIVER = 130,
|
||||
BFA_STATUS_CARD_TYPE_MISMATCH = 131,
|
||||
BFA_STATUS_BAD_ASICBLK = 132,
|
||||
BFA_STATUS_NO_DRIVER = 133,
|
||||
BFA_STATUS_INVALID_MAC = 134,
|
||||
BFA_STATUS_IM_NO_VLAN = 135,
|
||||
BFA_STATUS_IM_ETH_LB_FAILED = 136,
|
||||
BFA_STATUS_IM_PVID_REMOVE = 137,
|
||||
BFA_STATUS_IM_PVID_EDIT = 138,
|
||||
BFA_STATUS_CNA_NO_BOOT = 139,
|
||||
BFA_STATUS_IM_PVID_NON_ZERO = 140,
|
||||
BFA_STATUS_IM_INETCFG_LOCK_FAILED = 141,
|
||||
BFA_STATUS_IM_GET_INETCFG_FAILED = 142,
|
||||
BFA_STATUS_IM_NOT_BOUND = 143,
|
||||
BFA_STATUS_INSUFFICIENT_PERMS = 144,
|
||||
BFA_STATUS_IM_INV_VLAN_NAME = 145,
|
||||
BFA_STATUS_CMD_NOTSUPP_CNA = 146,
|
||||
BFA_STATUS_IM_PASSTHRU_EDIT = 147,
|
||||
BFA_STATUS_IM_BIND_FAILED = 148,
|
||||
BFA_STATUS_IM_UNBIND_FAILED = 149,
|
||||
BFA_STATUS_IM_PORT_IN_TEAM = 150,
|
||||
BFA_STATUS_IM_VLAN_NOT_FOUND = 151,
|
||||
BFA_STATUS_IM_TEAM_NOT_FOUND = 152,
|
||||
BFA_STATUS_IM_TEAM_CFG_NOT_ALLOWED = 153,
|
||||
BFA_STATUS_PBC = 154,
|
||||
BFA_STATUS_DEVID_MISSING = 155,
|
||||
BFA_STATUS_BAD_FWCFG = 156,
|
||||
BFA_STATUS_CREATE_FILE = 157,
|
||||
BFA_STATUS_INVALID_VENDOR = 158,
|
||||
BFA_STATUS_SFP_NOT_READY = 159,
|
||||
BFA_STATUS_FLASH_UNINIT = 160,
|
||||
BFA_STATUS_FLASH_EMPTY = 161,
|
||||
BFA_STATUS_FLASH_CKFAIL = 162,
|
||||
BFA_STATUS_TRUNK_UNSUPP = 163,
|
||||
BFA_STATUS_TRUNK_ENABLED = 164,
|
||||
BFA_STATUS_TRUNK_DISABLED = 165,
|
||||
BFA_STATUS_TRUNK_ERROR_TRL_ENABLED = 166,
|
||||
BFA_STATUS_BOOT_CODE_UPDATED = 167,
|
||||
BFA_STATUS_BOOT_VERSION = 168,
|
||||
BFA_STATUS_CARDTYPE_MISSING = 169,
|
||||
BFA_STATUS_INVALID_CARDTYPE = 170,
|
||||
BFA_STATUS_NO_TOPOLOGY_FOR_CNA = 171,
|
||||
BFA_STATUS_IM_VLAN_OVER_TEAM_DELETE_FAILED = 172,
|
||||
BFA_STATUS_ETHBOOT_ENABLED = 173,
|
||||
BFA_STATUS_ETHBOOT_DISABLED = 174,
|
||||
BFA_STATUS_IOPROFILE_OFF = 175,
|
||||
BFA_STATUS_NO_PORT_INSTANCE = 176,
|
||||
BFA_STATUS_BOOT_CODE_TIMEDOUT = 177,
|
||||
BFA_STATUS_NO_VPORT_LOCK = 178,
|
||||
BFA_STATUS_VPORT_NO_CNFG = 179,
|
||||
BFA_STATUS_MAX_VAL
|
||||
};
|
||||
|
||||
enum bfa_eproto_status {
|
||||
BFA_EPROTO_BAD_ACCEPT = 0,
|
||||
BFA_EPROTO_UNKNOWN_RSP = 1
|
||||
};
|
||||
|
||||
#endif /* __BFA_DEFS_STATUS_H__ */
|
3398
drivers/net/ethernet/brocade/bna/bfa_ioc.c
Normal file
3398
drivers/net/ethernet/brocade/bna/bfa_ioc.c
Normal file
File diff suppressed because it is too large
Load diff
368
drivers/net/ethernet/brocade/bna/bfa_ioc.h
Normal file
368
drivers/net/ethernet/brocade/bna/bfa_ioc.h
Normal file
|
@ -0,0 +1,368 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#ifndef __BFA_IOC_H__
|
||||
#define __BFA_IOC_H__
|
||||
|
||||
#include "bfa_cs.h"
|
||||
#include "bfi.h"
|
||||
#include "cna.h"
|
||||
|
||||
#define BFA_IOC_TOV 3000 /* msecs */
|
||||
#define BFA_IOC_HWSEM_TOV 500 /* msecs */
|
||||
#define BFA_IOC_HB_TOV 500 /* msecs */
|
||||
#define BFA_IOC_POLL_TOV 200 /* msecs */
|
||||
#define BNA_DBG_FWTRC_LEN (BFI_IOC_TRC_ENTS * BFI_IOC_TRC_ENT_SZ + \
|
||||
BFI_IOC_TRC_HDR_SZ)
|
||||
|
||||
/* PCI device information required by IOC */
|
||||
struct bfa_pcidev {
|
||||
int pci_slot;
|
||||
u8 pci_func;
|
||||
u16 device_id;
|
||||
u16 ssid;
|
||||
void __iomem *pci_bar_kva;
|
||||
};
|
||||
|
||||
/* Structure used to remember the DMA-able memory block's KVA and Physical
|
||||
* Address
|
||||
*/
|
||||
struct bfa_dma {
|
||||
void *kva; /* ! Kernel virtual address */
|
||||
u64 pa; /* ! Physical address */
|
||||
};
|
||||
|
||||
#define BFA_DMA_ALIGN_SZ 256
|
||||
|
||||
/* smem size for Crossbow and Catapult */
|
||||
#define BFI_SMEM_CB_SIZE 0x200000U /* ! 2MB for crossbow */
|
||||
#define BFI_SMEM_CT_SIZE 0x280000U /* ! 2.5MB for catapult */
|
||||
|
||||
/* BFA dma address assignment macro. (big endian format) */
|
||||
#define bfa_dma_be_addr_set(dma_addr, pa) \
|
||||
__bfa_dma_be_addr_set(&dma_addr, (u64)pa)
|
||||
static inline void
|
||||
__bfa_dma_be_addr_set(union bfi_addr_u *dma_addr, u64 pa)
|
||||
{
|
||||
dma_addr->a32.addr_lo = (u32) htonl(pa);
|
||||
dma_addr->a32.addr_hi = (u32) htonl(upper_32_bits(pa));
|
||||
}
|
||||
|
||||
#define bfa_alen_set(__alen, __len, __pa) \
|
||||
__bfa_alen_set(__alen, __len, (u64)__pa)
|
||||
|
||||
static inline void
|
||||
__bfa_alen_set(struct bfi_alen *alen, u32 len, u64 pa)
|
||||
{
|
||||
alen->al_len = cpu_to_be32(len);
|
||||
bfa_dma_be_addr_set(alen->al_addr, pa);
|
||||
}
|
||||
|
||||
struct bfa_ioc_regs {
|
||||
void __iomem *hfn_mbox_cmd;
|
||||
void __iomem *hfn_mbox;
|
||||
void __iomem *lpu_mbox_cmd;
|
||||
void __iomem *lpu_mbox;
|
||||
void __iomem *lpu_read_stat;
|
||||
void __iomem *pss_ctl_reg;
|
||||
void __iomem *pss_err_status_reg;
|
||||
void __iomem *app_pll_fast_ctl_reg;
|
||||
void __iomem *app_pll_slow_ctl_reg;
|
||||
void __iomem *ioc_sem_reg;
|
||||
void __iomem *ioc_usage_sem_reg;
|
||||
void __iomem *ioc_init_sem_reg;
|
||||
void __iomem *ioc_usage_reg;
|
||||
void __iomem *host_page_num_fn;
|
||||
void __iomem *heartbeat;
|
||||
void __iomem *ioc_fwstate;
|
||||
void __iomem *alt_ioc_fwstate;
|
||||
void __iomem *ll_halt;
|
||||
void __iomem *alt_ll_halt;
|
||||
void __iomem *err_set;
|
||||
void __iomem *ioc_fail_sync;
|
||||
void __iomem *shirq_isr_next;
|
||||
void __iomem *shirq_msk_next;
|
||||
void __iomem *smem_page_start;
|
||||
u32 smem_pg0;
|
||||
};
|
||||
|
||||
/* IOC Mailbox structures */
|
||||
typedef void (*bfa_mbox_cmd_cbfn_t)(void *cbarg);
|
||||
struct bfa_mbox_cmd {
|
||||
struct list_head qe;
|
||||
bfa_mbox_cmd_cbfn_t cbfn;
|
||||
void *cbarg;
|
||||
u32 msg[BFI_IOC_MSGSZ];
|
||||
};
|
||||
|
||||
/* IOC mailbox module */
|
||||
typedef void (*bfa_ioc_mbox_mcfunc_t)(void *cbarg, struct bfi_mbmsg *m);
|
||||
struct bfa_ioc_mbox_mod {
|
||||
struct list_head cmd_q; /*!< pending mbox queue */
|
||||
int nmclass; /*!< number of handlers */
|
||||
struct {
|
||||
bfa_ioc_mbox_mcfunc_t cbfn; /*!< message handlers */
|
||||
void *cbarg;
|
||||
} mbhdlr[BFI_MC_MAX];
|
||||
};
|
||||
|
||||
/* IOC callback function interfaces */
|
||||
typedef void (*bfa_ioc_enable_cbfn_t)(void *bfa, enum bfa_status status);
|
||||
typedef void (*bfa_ioc_disable_cbfn_t)(void *bfa);
|
||||
typedef void (*bfa_ioc_hbfail_cbfn_t)(void *bfa);
|
||||
typedef void (*bfa_ioc_reset_cbfn_t)(void *bfa);
|
||||
struct bfa_ioc_cbfn {
|
||||
bfa_ioc_enable_cbfn_t enable_cbfn;
|
||||
bfa_ioc_disable_cbfn_t disable_cbfn;
|
||||
bfa_ioc_hbfail_cbfn_t hbfail_cbfn;
|
||||
bfa_ioc_reset_cbfn_t reset_cbfn;
|
||||
};
|
||||
|
||||
/* IOC event notification mechanism. */
|
||||
enum bfa_ioc_event {
|
||||
BFA_IOC_E_ENABLED = 1,
|
||||
BFA_IOC_E_DISABLED = 2,
|
||||
BFA_IOC_E_FAILED = 3,
|
||||
};
|
||||
|
||||
typedef void (*bfa_ioc_notify_cbfn_t)(void *, enum bfa_ioc_event);
|
||||
|
||||
struct bfa_ioc_notify {
|
||||
struct list_head qe;
|
||||
bfa_ioc_notify_cbfn_t cbfn;
|
||||
void *cbarg;
|
||||
};
|
||||
|
||||
/* Initialize a IOC event notification structure */
|
||||
#define bfa_ioc_notify_init(__notify, __cbfn, __cbarg) do { \
|
||||
(__notify)->cbfn = (__cbfn); \
|
||||
(__notify)->cbarg = (__cbarg); \
|
||||
} while (0)
|
||||
|
||||
struct bfa_iocpf {
|
||||
bfa_fsm_t fsm;
|
||||
struct bfa_ioc *ioc;
|
||||
bool fw_mismatch_notified;
|
||||
bool auto_recover;
|
||||
u32 poll_time;
|
||||
};
|
||||
|
||||
struct bfa_ioc {
|
||||
bfa_fsm_t fsm;
|
||||
struct bfa *bfa;
|
||||
struct bfa_pcidev pcidev;
|
||||
struct timer_list ioc_timer;
|
||||
struct timer_list iocpf_timer;
|
||||
struct timer_list sem_timer;
|
||||
struct timer_list hb_timer;
|
||||
u32 hb_count;
|
||||
struct list_head notify_q;
|
||||
void *dbg_fwsave;
|
||||
int dbg_fwsave_len;
|
||||
bool dbg_fwsave_once;
|
||||
enum bfi_pcifn_class clscode;
|
||||
struct bfa_ioc_regs ioc_regs;
|
||||
struct bfa_ioc_drv_stats stats;
|
||||
bool fcmode;
|
||||
bool pllinit;
|
||||
bool stats_busy; /*!< outstanding stats */
|
||||
u8 port_id;
|
||||
|
||||
struct bfa_dma attr_dma;
|
||||
struct bfi_ioc_attr *attr;
|
||||
struct bfa_ioc_cbfn *cbfn;
|
||||
struct bfa_ioc_mbox_mod mbox_mod;
|
||||
const struct bfa_ioc_hwif *ioc_hwif;
|
||||
struct bfa_iocpf iocpf;
|
||||
enum bfi_asic_gen asic_gen;
|
||||
enum bfi_asic_mode asic_mode;
|
||||
enum bfi_port_mode port0_mode;
|
||||
enum bfi_port_mode port1_mode;
|
||||
enum bfa_mode port_mode;
|
||||
u8 ad_cap_bm; /*!< adapter cap bit mask */
|
||||
u8 port_mode_cfg; /*!< config port mode */
|
||||
};
|
||||
|
||||
struct bfa_ioc_hwif {
|
||||
enum bfa_status (*ioc_pll_init) (void __iomem *rb,
|
||||
enum bfi_asic_mode m);
|
||||
bool (*ioc_firmware_lock) (struct bfa_ioc *ioc);
|
||||
void (*ioc_firmware_unlock) (struct bfa_ioc *ioc);
|
||||
void (*ioc_reg_init) (struct bfa_ioc *ioc);
|
||||
void (*ioc_map_port) (struct bfa_ioc *ioc);
|
||||
void (*ioc_isr_mode_set) (struct bfa_ioc *ioc,
|
||||
bool msix);
|
||||
void (*ioc_notify_fail) (struct bfa_ioc *ioc);
|
||||
void (*ioc_ownership_reset) (struct bfa_ioc *ioc);
|
||||
bool (*ioc_sync_start) (struct bfa_ioc *ioc);
|
||||
void (*ioc_sync_join) (struct bfa_ioc *ioc);
|
||||
void (*ioc_sync_leave) (struct bfa_ioc *ioc);
|
||||
void (*ioc_sync_ack) (struct bfa_ioc *ioc);
|
||||
bool (*ioc_sync_complete) (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_devid(__ioc) ((__ioc)->pcidev.device_id)
|
||||
#define bfa_ioc_bar0(__ioc) ((__ioc)->pcidev.pci_bar_kva)
|
||||
#define bfa_ioc_portid(__ioc) ((__ioc)->port_id)
|
||||
#define bfa_ioc_asic_gen(__ioc) ((__ioc)->asic_gen)
|
||||
#define bfa_ioc_is_default(__ioc) \
|
||||
(bfa_ioc_pcifn(__ioc) == bfa_ioc_portid(__ioc))
|
||||
#define bfa_ioc_fetch_stats(__ioc, __stats) \
|
||||
(((__stats)->drv_stats) = (__ioc)->stats)
|
||||
#define bfa_ioc_clr_stats(__ioc) \
|
||||
memset(&(__ioc)->stats, 0, sizeof((__ioc)->stats))
|
||||
#define bfa_ioc_maxfrsize(__ioc) ((__ioc)->attr->maxfrsize)
|
||||
#define bfa_ioc_rx_bbcredit(__ioc) ((__ioc)->attr->rx_bbcredit)
|
||||
#define bfa_ioc_speed_sup(__ioc) \
|
||||
BFI_ADAPTER_GETP(SPEED, (__ioc)->attr->adapter_prop)
|
||||
#define bfa_ioc_get_nports(__ioc) \
|
||||
BFI_ADAPTER_GETP(NPORTS, (__ioc)->attr->adapter_prop)
|
||||
|
||||
#define bfa_ioc_stats(_ioc, _stats) ((_ioc)->stats._stats++)
|
||||
#define bfa_ioc_stats_hb_count(_ioc, _hb_count) \
|
||||
((_ioc)->stats.hb_count = (_hb_count))
|
||||
#define BFA_IOC_FWIMG_MINSZ (16 * 1024)
|
||||
#define BFA_IOC_FW_SMEM_SIZE(__ioc) \
|
||||
((bfa_ioc_asic_gen(__ioc) == BFI_ASIC_GEN_CB) \
|
||||
? BFI_SMEM_CB_SIZE : BFI_SMEM_CT_SIZE)
|
||||
#define BFA_IOC_FLASH_CHUNK_NO(off) (off / BFI_FLASH_CHUNK_SZ_WORDS)
|
||||
#define BFA_IOC_FLASH_OFFSET_IN_CHUNK(off) (off % BFI_FLASH_CHUNK_SZ_WORDS)
|
||||
#define BFA_IOC_FLASH_CHUNK_ADDR(chunkno) (chunkno * BFI_FLASH_CHUNK_SZ_WORDS)
|
||||
|
||||
/* IOC mailbox interface */
|
||||
bool bfa_nw_ioc_mbox_queue(struct bfa_ioc *ioc,
|
||||
struct bfa_mbox_cmd *cmd,
|
||||
bfa_mbox_cmd_cbfn_t cbfn, void *cbarg);
|
||||
void bfa_nw_ioc_mbox_isr(struct bfa_ioc *ioc);
|
||||
void bfa_nw_ioc_mbox_regisr(struct bfa_ioc *ioc, enum bfi_mclass mc,
|
||||
bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg);
|
||||
|
||||
/* IOC interfaces */
|
||||
|
||||
#define bfa_ioc_pll_init_asic(__ioc) \
|
||||
((__ioc)->ioc_hwif->ioc_pll_init((__ioc)->pcidev.pci_bar_kva, \
|
||||
(__ioc)->asic_mode))
|
||||
|
||||
#define bfa_ioc_isr_mode_set(__ioc, __msix) do { \
|
||||
if ((__ioc)->ioc_hwif->ioc_isr_mode_set) \
|
||||
((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix)); \
|
||||
} while (0)
|
||||
#define bfa_ioc_ownership_reset(__ioc) \
|
||||
((__ioc)->ioc_hwif->ioc_ownership_reset(__ioc))
|
||||
|
||||
#define bfa_ioc_lpu_read_stat(__ioc) do { \
|
||||
if ((__ioc)->ioc_hwif->ioc_lpu_read_stat) \
|
||||
((__ioc)->ioc_hwif->ioc_lpu_read_stat(__ioc)); \
|
||||
} while (0)
|
||||
|
||||
void bfa_nw_ioc_set_ct_hwif(struct bfa_ioc *ioc);
|
||||
void bfa_nw_ioc_set_ct2_hwif(struct bfa_ioc *ioc);
|
||||
void bfa_nw_ioc_ct2_poweron(struct bfa_ioc *ioc);
|
||||
|
||||
void bfa_nw_ioc_attach(struct bfa_ioc *ioc, void *bfa,
|
||||
struct bfa_ioc_cbfn *cbfn);
|
||||
void bfa_nw_ioc_auto_recover(bool auto_recover);
|
||||
void bfa_nw_ioc_detach(struct bfa_ioc *ioc);
|
||||
void bfa_nw_ioc_pci_init(struct bfa_ioc *ioc, struct bfa_pcidev *pcidev,
|
||||
enum bfi_pcifn_class clscode);
|
||||
u32 bfa_nw_ioc_meminfo(void);
|
||||
void bfa_nw_ioc_mem_claim(struct bfa_ioc *ioc, u8 *dm_kva, u64 dm_pa);
|
||||
void bfa_nw_ioc_enable(struct bfa_ioc *ioc);
|
||||
void bfa_nw_ioc_disable(struct bfa_ioc *ioc);
|
||||
|
||||
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_operational(struct bfa_ioc *ioc);
|
||||
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,
|
||||
struct bfa_ioc_notify *notify);
|
||||
bool bfa_nw_ioc_sem_get(void __iomem *sem_reg);
|
||||
void bfa_nw_ioc_sem_release(void __iomem *sem_reg);
|
||||
void bfa_nw_ioc_hw_sem_release(struct bfa_ioc *ioc);
|
||||
void bfa_nw_ioc_fwver_get(struct bfa_ioc *ioc,
|
||||
struct bfi_ioc_image_hdr *fwhdr);
|
||||
bool bfa_nw_ioc_fwver_cmp(struct bfa_ioc *ioc,
|
||||
struct bfi_ioc_image_hdr *fwhdr);
|
||||
mac_t bfa_nw_ioc_get_mac(struct bfa_ioc *ioc);
|
||||
void bfa_nw_ioc_debug_memclaim(struct bfa_ioc *ioc, void *dbg_fwsave);
|
||||
int bfa_nw_ioc_debug_fwtrc(struct bfa_ioc *ioc, void *trcdata, int *trclen);
|
||||
int bfa_nw_ioc_debug_fwsave(struct bfa_ioc *ioc, void *trcdata, int *trclen);
|
||||
|
||||
/*
|
||||
* Timeout APIs
|
||||
*/
|
||||
void bfa_nw_ioc_timeout(void *ioc);
|
||||
void bfa_nw_ioc_hb_check(void *ioc);
|
||||
void bfa_nw_iocpf_timeout(void *ioc);
|
||||
void bfa_nw_iocpf_sem_timeout(void *ioc);
|
||||
|
||||
/*
|
||||
* F/W Image Size & Chunk
|
||||
*/
|
||||
u32 *bfa_cb_image_get_chunk(enum bfi_asic_gen asic_gen, u32 off);
|
||||
u32 bfa_cb_image_get_size(enum bfi_asic_gen asic_gen);
|
||||
|
||||
/*
|
||||
* Flash module specific
|
||||
*/
|
||||
typedef void (*bfa_cb_flash) (void *cbarg, enum bfa_status status);
|
||||
|
||||
struct bfa_flash {
|
||||
struct bfa_ioc *ioc; /* back pointer to ioc */
|
||||
u32 type; /* partition type */
|
||||
u8 instance; /* partition instance */
|
||||
u8 rsv[3];
|
||||
u32 op_busy; /* operation busy flag */
|
||||
u32 residue; /* residual length */
|
||||
u32 offset; /* offset */
|
||||
enum bfa_status status; /* status */
|
||||
u8 *dbuf_kva; /* dma buf virtual address */
|
||||
u64 dbuf_pa; /* dma buf physical address */
|
||||
bfa_cb_flash cbfn; /* user callback function */
|
||||
void *cbarg; /* user callback arg */
|
||||
u8 *ubuf; /* user supplied buffer */
|
||||
u32 addr_off; /* partition address offset */
|
||||
struct bfa_mbox_cmd mb; /* mailbox */
|
||||
struct bfa_ioc_notify ioc_notify; /* ioc event notify */
|
||||
};
|
||||
|
||||
enum bfa_status bfa_nw_flash_get_attr(struct bfa_flash *flash,
|
||||
struct bfa_flash_attr *attr,
|
||||
bfa_cb_flash cbfn, void *cbarg);
|
||||
enum bfa_status bfa_nw_flash_update_part(struct bfa_flash *flash,
|
||||
u32 type, u8 instance, void *buf, u32 len, u32 offset,
|
||||
bfa_cb_flash cbfn, void *cbarg);
|
||||
enum bfa_status bfa_nw_flash_read_part(struct bfa_flash *flash,
|
||||
u32 type, u8 instance, void *buf, u32 len, u32 offset,
|
||||
bfa_cb_flash cbfn, void *cbarg);
|
||||
u32 bfa_nw_flash_meminfo(void);
|
||||
void bfa_nw_flash_attach(struct bfa_flash *flash,
|
||||
struct bfa_ioc *ioc, void *dev);
|
||||
void bfa_nw_flash_memclaim(struct bfa_flash *flash, u8 *dm_kva, u64 dm_pa);
|
||||
|
||||
#endif /* __BFA_IOC_H__ */
|
944
drivers/net/ethernet/brocade/bna/bfa_ioc_ct.c
Normal file
944
drivers/net/ethernet/brocade/bna/bfa_ioc_ct.c
Normal file
|
@ -0,0 +1,944 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#include "bfa_ioc.h"
|
||||
#include "cna.h"
|
||||
#include "bfi.h"
|
||||
#include "bfi_reg.h"
|
||||
#include "bfa_defs.h"
|
||||
|
||||
#define bfa_ioc_ct_sync_pos(__ioc) \
|
||||
((u32) (1 << bfa_ioc_pcifn(__ioc)))
|
||||
#define BFA_IOC_SYNC_REQD_SH 16
|
||||
#define bfa_ioc_ct_get_sync_ackd(__val) (__val & 0x0000ffff)
|
||||
#define bfa_ioc_ct_clear_sync_ackd(__val) (__val & 0xffff0000)
|
||||
#define bfa_ioc_ct_get_sync_reqd(__val) (__val >> BFA_IOC_SYNC_REQD_SH)
|
||||
#define bfa_ioc_ct_sync_reqd_pos(__ioc) \
|
||||
(bfa_ioc_ct_sync_pos(__ioc) << BFA_IOC_SYNC_REQD_SH)
|
||||
|
||||
/*
|
||||
* forward declarations
|
||||
*/
|
||||
static bool bfa_ioc_ct_firmware_lock(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct_firmware_unlock(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct_reg_init(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct2_reg_init(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct_map_port(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct2_map_port(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct_isr_mode_set(struct bfa_ioc *ioc, bool msix);
|
||||
static void bfa_ioc_ct_notify_fail(struct bfa_ioc *ioc);
|
||||
static void bfa_ioc_ct_ownership_reset(struct bfa_ioc *ioc);
|
||||
static bool bfa_ioc_ct_sync_start(struct bfa_ioc *ioc);
|
||||
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_ack(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,
|
||||
enum bfi_asic_mode asic_mode);
|
||||
static enum bfa_status bfa_ioc_ct2_pll_init(void __iomem *rb,
|
||||
enum bfi_asic_mode asic_mode);
|
||||
static bool bfa_ioc_ct2_lpu_read_stat(struct bfa_ioc *ioc);
|
||||
|
||||
static const struct bfa_ioc_hwif nw_hwif_ct = {
|
||||
.ioc_pll_init = bfa_ioc_ct_pll_init,
|
||||
.ioc_firmware_lock = bfa_ioc_ct_firmware_lock,
|
||||
.ioc_firmware_unlock = bfa_ioc_ct_firmware_unlock,
|
||||
.ioc_reg_init = bfa_ioc_ct_reg_init,
|
||||
.ioc_map_port = bfa_ioc_ct_map_port,
|
||||
.ioc_isr_mode_set = bfa_ioc_ct_isr_mode_set,
|
||||
.ioc_notify_fail = bfa_ioc_ct_notify_fail,
|
||||
.ioc_ownership_reset = bfa_ioc_ct_ownership_reset,
|
||||
.ioc_sync_start = bfa_ioc_ct_sync_start,
|
||||
.ioc_sync_join = bfa_ioc_ct_sync_join,
|
||||
.ioc_sync_leave = bfa_ioc_ct_sync_leave,
|
||||
.ioc_sync_ack = bfa_ioc_ct_sync_ack,
|
||||
.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 = {
|
||||
.ioc_pll_init = bfa_ioc_ct2_pll_init,
|
||||
.ioc_firmware_lock = bfa_ioc_ct_firmware_lock,
|
||||
.ioc_firmware_unlock = bfa_ioc_ct_firmware_unlock,
|
||||
.ioc_reg_init = bfa_ioc_ct2_reg_init,
|
||||
.ioc_map_port = bfa_ioc_ct2_map_port,
|
||||
.ioc_lpu_read_stat = bfa_ioc_ct2_lpu_read_stat,
|
||||
.ioc_isr_mode_set = NULL,
|
||||
.ioc_notify_fail = bfa_ioc_ct_notify_fail,
|
||||
.ioc_ownership_reset = bfa_ioc_ct_ownership_reset,
|
||||
.ioc_sync_start = bfa_ioc_ct_sync_start,
|
||||
.ioc_sync_join = bfa_ioc_ct_sync_join,
|
||||
.ioc_sync_leave = bfa_ioc_ct_sync_leave,
|
||||
.ioc_sync_ack = bfa_ioc_ct_sync_ack,
|
||||
.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. */
|
||||
void
|
||||
bfa_nw_ioc_set_ct_hwif(struct bfa_ioc *ioc)
|
||||
{
|
||||
ioc->ioc_hwif = &nw_hwif_ct;
|
||||
}
|
||||
|
||||
void
|
||||
bfa_nw_ioc_set_ct2_hwif(struct bfa_ioc *ioc)
|
||||
{
|
||||
ioc->ioc_hwif = &nw_hwif_ct2;
|
||||
}
|
||||
|
||||
/* Return true if firmware of current driver matches the running firmware. */
|
||||
static bool
|
||||
bfa_ioc_ct_firmware_lock(struct bfa_ioc *ioc)
|
||||
{
|
||||
enum bfi_ioc_state ioc_fwstate;
|
||||
u32 usecnt;
|
||||
struct bfi_ioc_image_hdr fwhdr;
|
||||
|
||||
/**
|
||||
* If bios boot (flash based) -- do not increment usage count
|
||||
*/
|
||||
if (bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc)) <
|
||||
BFA_IOC_FWIMG_MINSZ)
|
||||
return true;
|
||||
|
||||
bfa_nw_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
usecnt = readl(ioc->ioc_regs.ioc_usage_reg);
|
||||
|
||||
/**
|
||||
* If usage count is 0, always return TRUE.
|
||||
*/
|
||||
if (usecnt == 0) {
|
||||
writel(1, ioc->ioc_regs.ioc_usage_reg);
|
||||
bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
writel(0, ioc->ioc_regs.ioc_fail_sync);
|
||||
return true;
|
||||
}
|
||||
|
||||
ioc_fwstate = readl(ioc->ioc_regs.ioc_fwstate);
|
||||
|
||||
/**
|
||||
* Use count cannot be non-zero and chip in uninitialized state.
|
||||
*/
|
||||
BUG_ON(!(ioc_fwstate != BFI_IOC_UNINIT));
|
||||
|
||||
/**
|
||||
* Check if another driver with a different firmware is active
|
||||
*/
|
||||
bfa_nw_ioc_fwver_get(ioc, &fwhdr);
|
||||
if (!bfa_nw_ioc_fwver_cmp(ioc, &fwhdr)) {
|
||||
bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Same firmware version. Increment the reference count.
|
||||
*/
|
||||
usecnt++;
|
||||
writel(usecnt, ioc->ioc_regs.ioc_usage_reg);
|
||||
bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct_firmware_unlock(struct bfa_ioc *ioc)
|
||||
{
|
||||
u32 usecnt;
|
||||
|
||||
/**
|
||||
* If bios boot (flash based) -- do not decrement usage count
|
||||
*/
|
||||
if (bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc)) <
|
||||
BFA_IOC_FWIMG_MINSZ)
|
||||
return;
|
||||
|
||||
/**
|
||||
* decrement usage count
|
||||
*/
|
||||
bfa_nw_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
usecnt = readl(ioc->ioc_regs.ioc_usage_reg);
|
||||
BUG_ON(!(usecnt > 0));
|
||||
|
||||
usecnt--;
|
||||
writel(usecnt, ioc->ioc_regs.ioc_usage_reg);
|
||||
|
||||
bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
}
|
||||
|
||||
/* Notify other functions on HB failure. */
|
||||
static void
|
||||
bfa_ioc_ct_notify_fail(struct bfa_ioc *ioc)
|
||||
{
|
||||
writel(__FW_INIT_HALT_P, ioc->ioc_regs.ll_halt);
|
||||
writel(__FW_INIT_HALT_P, ioc->ioc_regs.alt_ll_halt);
|
||||
/* Wait for halt to take effect */
|
||||
readl(ioc->ioc_regs.ll_halt);
|
||||
readl(ioc->ioc_regs.alt_ll_halt);
|
||||
}
|
||||
|
||||
/* Host to LPU mailbox message addresses */
|
||||
static const struct {
|
||||
u32 hfn_mbox;
|
||||
u32 lpu_mbox;
|
||||
u32 hfn_pgn;
|
||||
} ct_fnreg[] = {
|
||||
{ HOSTFN0_LPU_MBOX0_0, LPU_HOSTFN0_MBOX0_0, HOST_PAGE_NUM_FN0 },
|
||||
{ HOSTFN1_LPU_MBOX0_8, LPU_HOSTFN1_MBOX0_8, HOST_PAGE_NUM_FN1 },
|
||||
{ HOSTFN2_LPU_MBOX0_0, LPU_HOSTFN2_MBOX0_0, HOST_PAGE_NUM_FN2 },
|
||||
{ HOSTFN3_LPU_MBOX0_8, LPU_HOSTFN3_MBOX0_8, HOST_PAGE_NUM_FN3 }
|
||||
};
|
||||
|
||||
/* Host <-> LPU mailbox command/status registers - port 0 */
|
||||
static const struct {
|
||||
u32 hfn;
|
||||
u32 lpu;
|
||||
} ct_p0reg[] = {
|
||||
{ HOSTFN0_LPU0_CMD_STAT, LPU0_HOSTFN0_CMD_STAT },
|
||||
{ HOSTFN1_LPU0_CMD_STAT, LPU0_HOSTFN1_CMD_STAT },
|
||||
{ HOSTFN2_LPU0_CMD_STAT, LPU0_HOSTFN2_CMD_STAT },
|
||||
{ HOSTFN3_LPU0_CMD_STAT, LPU0_HOSTFN3_CMD_STAT }
|
||||
};
|
||||
|
||||
/* Host <-> LPU mailbox command/status registers - port 1 */
|
||||
static const struct {
|
||||
u32 hfn;
|
||||
u32 lpu;
|
||||
} ct_p1reg[] = {
|
||||
{ HOSTFN0_LPU1_CMD_STAT, LPU1_HOSTFN0_CMD_STAT },
|
||||
{ HOSTFN1_LPU1_CMD_STAT, LPU1_HOSTFN1_CMD_STAT },
|
||||
{ HOSTFN2_LPU1_CMD_STAT, LPU1_HOSTFN2_CMD_STAT },
|
||||
{ HOSTFN3_LPU1_CMD_STAT, LPU1_HOSTFN3_CMD_STAT }
|
||||
};
|
||||
|
||||
static const struct {
|
||||
u32 hfn_mbox;
|
||||
u32 lpu_mbox;
|
||||
u32 hfn_pgn;
|
||||
u32 hfn;
|
||||
u32 lpu;
|
||||
u32 lpu_read;
|
||||
} ct2_reg[] = {
|
||||
{ CT2_HOSTFN_LPU0_MBOX0, CT2_LPU0_HOSTFN_MBOX0, CT2_HOSTFN_PAGE_NUM,
|
||||
CT2_HOSTFN_LPU0_CMD_STAT, CT2_LPU0_HOSTFN_CMD_STAT,
|
||||
CT2_HOSTFN_LPU0_READ_STAT},
|
||||
{ CT2_HOSTFN_LPU1_MBOX0, CT2_LPU1_HOSTFN_MBOX0, CT2_HOSTFN_PAGE_NUM,
|
||||
CT2_HOSTFN_LPU1_CMD_STAT, CT2_LPU1_HOSTFN_CMD_STAT,
|
||||
CT2_HOSTFN_LPU1_READ_STAT},
|
||||
};
|
||||
|
||||
static void
|
||||
bfa_ioc_ct_reg_init(struct bfa_ioc *ioc)
|
||||
{
|
||||
void __iomem *rb;
|
||||
int pcifn = bfa_ioc_pcifn(ioc);
|
||||
|
||||
rb = bfa_ioc_bar0(ioc);
|
||||
|
||||
ioc->ioc_regs.hfn_mbox = rb + ct_fnreg[pcifn].hfn_mbox;
|
||||
ioc->ioc_regs.lpu_mbox = rb + ct_fnreg[pcifn].lpu_mbox;
|
||||
ioc->ioc_regs.host_page_num_fn = rb + ct_fnreg[pcifn].hfn_pgn;
|
||||
|
||||
if (ioc->port_id == 0) {
|
||||
ioc->ioc_regs.heartbeat = rb + BFA_IOC0_HBEAT_REG;
|
||||
ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC0_STATE_REG;
|
||||
ioc->ioc_regs.alt_ioc_fwstate = rb + BFA_IOC1_STATE_REG;
|
||||
ioc->ioc_regs.hfn_mbox_cmd = rb + ct_p0reg[pcifn].hfn;
|
||||
ioc->ioc_regs.lpu_mbox_cmd = rb + ct_p0reg[pcifn].lpu;
|
||||
ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P0;
|
||||
ioc->ioc_regs.alt_ll_halt = rb + FW_INIT_HALT_P1;
|
||||
} else {
|
||||
ioc->ioc_regs.heartbeat = rb + BFA_IOC1_HBEAT_REG;
|
||||
ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC1_STATE_REG;
|
||||
ioc->ioc_regs.alt_ioc_fwstate = rb + BFA_IOC0_STATE_REG;
|
||||
ioc->ioc_regs.hfn_mbox_cmd = rb + ct_p1reg[pcifn].hfn;
|
||||
ioc->ioc_regs.lpu_mbox_cmd = rb + ct_p1reg[pcifn].lpu;
|
||||
ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P1;
|
||||
ioc->ioc_regs.alt_ll_halt = rb + FW_INIT_HALT_P0;
|
||||
}
|
||||
|
||||
/*
|
||||
* PSS control registers
|
||||
*/
|
||||
ioc->ioc_regs.pss_ctl_reg = rb + PSS_CTL_REG;
|
||||
ioc->ioc_regs.pss_err_status_reg = rb + PSS_ERR_STATUS_REG;
|
||||
ioc->ioc_regs.app_pll_fast_ctl_reg = rb + APP_PLL_LCLK_CTL_REG;
|
||||
ioc->ioc_regs.app_pll_slow_ctl_reg = rb + APP_PLL_SCLK_CTL_REG;
|
||||
|
||||
/*
|
||||
* IOC semaphore registers and serialization
|
||||
*/
|
||||
ioc->ioc_regs.ioc_sem_reg = rb + HOST_SEM0_REG;
|
||||
ioc->ioc_regs.ioc_usage_sem_reg = rb + HOST_SEM1_REG;
|
||||
ioc->ioc_regs.ioc_init_sem_reg = rb + HOST_SEM2_REG;
|
||||
ioc->ioc_regs.ioc_usage_reg = rb + BFA_FW_USE_COUNT;
|
||||
ioc->ioc_regs.ioc_fail_sync = rb + BFA_IOC_FAIL_SYNC;
|
||||
|
||||
/**
|
||||
* sram memory access
|
||||
*/
|
||||
ioc->ioc_regs.smem_page_start = rb + PSS_SMEM_PAGE_START;
|
||||
ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CT;
|
||||
|
||||
/*
|
||||
* err set reg : for notification of hb failure in fcmode
|
||||
*/
|
||||
ioc->ioc_regs.err_set = (rb + ERR_SET_REG);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct2_reg_init(struct bfa_ioc *ioc)
|
||||
{
|
||||
void __iomem *rb;
|
||||
int port = bfa_ioc_portid(ioc);
|
||||
|
||||
rb = bfa_ioc_bar0(ioc);
|
||||
|
||||
ioc->ioc_regs.hfn_mbox = rb + ct2_reg[port].hfn_mbox;
|
||||
ioc->ioc_regs.lpu_mbox = rb + ct2_reg[port].lpu_mbox;
|
||||
ioc->ioc_regs.host_page_num_fn = rb + ct2_reg[port].hfn_pgn;
|
||||
ioc->ioc_regs.hfn_mbox_cmd = rb + ct2_reg[port].hfn;
|
||||
ioc->ioc_regs.lpu_mbox_cmd = rb + ct2_reg[port].lpu;
|
||||
ioc->ioc_regs.lpu_read_stat = rb + ct2_reg[port].lpu_read;
|
||||
|
||||
if (port == 0) {
|
||||
ioc->ioc_regs.heartbeat = rb + CT2_BFA_IOC0_HBEAT_REG;
|
||||
ioc->ioc_regs.ioc_fwstate = rb + CT2_BFA_IOC0_STATE_REG;
|
||||
ioc->ioc_regs.alt_ioc_fwstate = rb + CT2_BFA_IOC1_STATE_REG;
|
||||
ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P0;
|
||||
ioc->ioc_regs.alt_ll_halt = rb + FW_INIT_HALT_P1;
|
||||
} else {
|
||||
ioc->ioc_regs.heartbeat = rb + CT2_BFA_IOC1_HBEAT_REG;
|
||||
ioc->ioc_regs.ioc_fwstate = rb + CT2_BFA_IOC1_STATE_REG;
|
||||
ioc->ioc_regs.alt_ioc_fwstate = rb + CT2_BFA_IOC0_STATE_REG;
|
||||
ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P1;
|
||||
ioc->ioc_regs.alt_ll_halt = rb + FW_INIT_HALT_P0;
|
||||
}
|
||||
|
||||
/*
|
||||
* PSS control registers
|
||||
*/
|
||||
ioc->ioc_regs.pss_ctl_reg = rb + PSS_CTL_REG;
|
||||
ioc->ioc_regs.pss_err_status_reg = rb + PSS_ERR_STATUS_REG;
|
||||
ioc->ioc_regs.app_pll_fast_ctl_reg = rb + CT2_APP_PLL_LCLK_CTL_REG;
|
||||
ioc->ioc_regs.app_pll_slow_ctl_reg = rb + CT2_APP_PLL_SCLK_CTL_REG;
|
||||
|
||||
/*
|
||||
* IOC semaphore registers and serialization
|
||||
*/
|
||||
ioc->ioc_regs.ioc_sem_reg = rb + CT2_HOST_SEM0_REG;
|
||||
ioc->ioc_regs.ioc_usage_sem_reg = rb + CT2_HOST_SEM1_REG;
|
||||
ioc->ioc_regs.ioc_init_sem_reg = rb + CT2_HOST_SEM2_REG;
|
||||
ioc->ioc_regs.ioc_usage_reg = rb + CT2_BFA_FW_USE_COUNT;
|
||||
ioc->ioc_regs.ioc_fail_sync = rb + CT2_BFA_IOC_FAIL_SYNC;
|
||||
|
||||
/**
|
||||
* sram memory access
|
||||
*/
|
||||
ioc->ioc_regs.smem_page_start = rb + PSS_SMEM_PAGE_START;
|
||||
ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CT;
|
||||
|
||||
/*
|
||||
* err set reg : for notification of hb failure in fcmode
|
||||
*/
|
||||
ioc->ioc_regs.err_set = rb + ERR_SET_REG;
|
||||
}
|
||||
|
||||
/* Initialize IOC to port mapping. */
|
||||
|
||||
#define FNC_PERS_FN_SHIFT(__fn) ((__fn) * 8)
|
||||
static void
|
||||
bfa_ioc_ct_map_port(struct bfa_ioc *ioc)
|
||||
{
|
||||
void __iomem *rb = ioc->pcidev.pci_bar_kva;
|
||||
u32 r32;
|
||||
|
||||
/**
|
||||
* For catapult, base port id on personality register and IOC type
|
||||
*/
|
||||
r32 = readl(rb + FNC_PERS_REG);
|
||||
r32 >>= FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc));
|
||||
ioc->port_id = (r32 & __F0_PORT_MAP_MK) >> __F0_PORT_MAP_SH;
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct2_map_port(struct bfa_ioc *ioc)
|
||||
{
|
||||
void __iomem *rb = ioc->pcidev.pci_bar_kva;
|
||||
u32 r32;
|
||||
|
||||
r32 = readl(rb + CT2_HOSTFN_PERSONALITY0);
|
||||
ioc->port_id = ((r32 & __FC_LL_PORT_MAP__MK) >> __FC_LL_PORT_MAP__SH);
|
||||
}
|
||||
|
||||
/* Set interrupt mode for a function: INTX or MSIX */
|
||||
static void
|
||||
bfa_ioc_ct_isr_mode_set(struct bfa_ioc *ioc, bool msix)
|
||||
{
|
||||
void __iomem *rb = ioc->pcidev.pci_bar_kva;
|
||||
u32 r32, mode;
|
||||
|
||||
r32 = readl(rb + FNC_PERS_REG);
|
||||
|
||||
mode = (r32 >> FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))) &
|
||||
__F0_INTX_STATUS;
|
||||
|
||||
/**
|
||||
* If already in desired mode, do not change anything
|
||||
*/
|
||||
if ((!msix && mode) || (msix && !mode))
|
||||
return;
|
||||
|
||||
if (msix)
|
||||
mode = __F0_INTX_STATUS_MSIX;
|
||||
else
|
||||
mode = __F0_INTX_STATUS_INTA;
|
||||
|
||||
r32 &= ~(__F0_INTX_STATUS << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc)));
|
||||
r32 |= (mode << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc)));
|
||||
|
||||
writel(r32, rb + FNC_PERS_REG);
|
||||
}
|
||||
|
||||
static bool
|
||||
bfa_ioc_ct2_lpu_read_stat(struct bfa_ioc *ioc)
|
||||
{
|
||||
u32 r32;
|
||||
|
||||
r32 = readl(ioc->ioc_regs.lpu_read_stat);
|
||||
if (r32) {
|
||||
writel(1, ioc->ioc_regs.lpu_read_stat);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* MSI-X resource allocation for 1860 with no asic block */
|
||||
#define HOSTFN_MSIX_DEFAULT 64
|
||||
#define HOSTFN_MSIX_VT_INDEX_MBOX_ERR 0x30138
|
||||
#define HOSTFN_MSIX_VT_OFST_NUMVT 0x3013c
|
||||
#define __MSIX_VT_NUMVT__MK 0x003ff800
|
||||
#define __MSIX_VT_NUMVT__SH 11
|
||||
#define __MSIX_VT_NUMVT_(_v) ((_v) << __MSIX_VT_NUMVT__SH)
|
||||
#define __MSIX_VT_OFST_ 0x000007ff
|
||||
void
|
||||
bfa_nw_ioc_ct2_poweron(struct bfa_ioc *ioc)
|
||||
{
|
||||
void __iomem *rb = ioc->pcidev.pci_bar_kva;
|
||||
u32 r32;
|
||||
|
||||
r32 = readl(rb + HOSTFN_MSIX_VT_OFST_NUMVT);
|
||||
if (r32 & __MSIX_VT_NUMVT__MK) {
|
||||
writel(r32 & __MSIX_VT_OFST_,
|
||||
rb + HOSTFN_MSIX_VT_INDEX_MBOX_ERR);
|
||||
return;
|
||||
}
|
||||
|
||||
writel(__MSIX_VT_NUMVT_(HOSTFN_MSIX_DEFAULT - 1) |
|
||||
HOSTFN_MSIX_DEFAULT * bfa_ioc_pcifn(ioc),
|
||||
rb + HOSTFN_MSIX_VT_OFST_NUMVT);
|
||||
writel(HOSTFN_MSIX_DEFAULT * bfa_ioc_pcifn(ioc),
|
||||
rb + HOSTFN_MSIX_VT_INDEX_MBOX_ERR);
|
||||
}
|
||||
|
||||
/* Cleanup hw semaphore and usecnt registers */
|
||||
static void
|
||||
bfa_ioc_ct_ownership_reset(struct bfa_ioc *ioc)
|
||||
{
|
||||
bfa_nw_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
writel(0, ioc->ioc_regs.ioc_usage_reg);
|
||||
bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg);
|
||||
|
||||
/*
|
||||
* Read the hw sem reg to make sure that it is locked
|
||||
* before we clear it. If it is not locked, writing 1
|
||||
* will lock it instead of clearing it.
|
||||
*/
|
||||
readl(ioc->ioc_regs.ioc_sem_reg);
|
||||
bfa_nw_ioc_hw_sem_release(ioc);
|
||||
}
|
||||
|
||||
/* Synchronized IOC failure processing routines */
|
||||
static bool
|
||||
bfa_ioc_ct_sync_start(struct bfa_ioc *ioc)
|
||||
{
|
||||
u32 r32 = readl(ioc->ioc_regs.ioc_fail_sync);
|
||||
u32 sync_reqd = bfa_ioc_ct_get_sync_reqd(r32);
|
||||
|
||||
/*
|
||||
* Driver load time. If the sync required bit for this PCI fn
|
||||
* is set, it is due to an unclean exit by the driver for this
|
||||
* PCI fn in the previous incarnation. Whoever comes here first
|
||||
* should clean it up, no matter which PCI fn.
|
||||
*/
|
||||
|
||||
if (sync_reqd & bfa_ioc_ct_sync_pos(ioc)) {
|
||||
writel(0, ioc->ioc_regs.ioc_fail_sync);
|
||||
writel(1, ioc->ioc_regs.ioc_usage_reg);
|
||||
writel(BFI_IOC_UNINIT, ioc->ioc_regs.ioc_fwstate);
|
||||
writel(BFI_IOC_UNINIT, ioc->ioc_regs.alt_ioc_fwstate);
|
||||
return true;
|
||||
}
|
||||
|
||||
return bfa_ioc_ct_sync_complete(ioc);
|
||||
}
|
||||
/* Synchronized IOC failure processing routines */
|
||||
static void
|
||||
bfa_ioc_ct_sync_join(struct bfa_ioc *ioc)
|
||||
{
|
||||
u32 r32 = readl(ioc->ioc_regs.ioc_fail_sync);
|
||||
u32 sync_pos = bfa_ioc_ct_sync_reqd_pos(ioc);
|
||||
|
||||
writel((r32 | sync_pos), ioc->ioc_regs.ioc_fail_sync);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct_sync_leave(struct bfa_ioc *ioc)
|
||||
{
|
||||
u32 r32 = readl(ioc->ioc_regs.ioc_fail_sync);
|
||||
u32 sync_msk = bfa_ioc_ct_sync_reqd_pos(ioc) |
|
||||
bfa_ioc_ct_sync_pos(ioc);
|
||||
|
||||
writel((r32 & ~sync_msk), ioc->ioc_regs.ioc_fail_sync);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct_sync_ack(struct bfa_ioc *ioc)
|
||||
{
|
||||
u32 r32 = readl(ioc->ioc_regs.ioc_fail_sync);
|
||||
|
||||
writel((r32 | bfa_ioc_ct_sync_pos(ioc)), ioc->ioc_regs.ioc_fail_sync);
|
||||
}
|
||||
|
||||
static bool
|
||||
bfa_ioc_ct_sync_complete(struct bfa_ioc *ioc)
|
||||
{
|
||||
u32 r32 = readl(ioc->ioc_regs.ioc_fail_sync);
|
||||
u32 sync_reqd = bfa_ioc_ct_get_sync_reqd(r32);
|
||||
u32 sync_ackd = bfa_ioc_ct_get_sync_ackd(r32);
|
||||
u32 tmp_ackd;
|
||||
|
||||
if (sync_ackd == 0)
|
||||
return true;
|
||||
|
||||
/**
|
||||
* The check below is to see whether any other PCI fn
|
||||
* has reinitialized the ASIC (reset sync_ackd bits)
|
||||
* and failed again while this IOC was waiting for hw
|
||||
* semaphore (in bfa_iocpf_sm_semwait()).
|
||||
*/
|
||||
tmp_ackd = sync_ackd;
|
||||
if ((sync_reqd & bfa_ioc_ct_sync_pos(ioc)) &&
|
||||
!(sync_ackd & bfa_ioc_ct_sync_pos(ioc)))
|
||||
sync_ackd |= bfa_ioc_ct_sync_pos(ioc);
|
||||
|
||||
if (sync_reqd == sync_ackd) {
|
||||
writel(bfa_ioc_ct_clear_sync_ackd(r32),
|
||||
ioc->ioc_regs.ioc_fail_sync);
|
||||
writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate);
|
||||
writel(BFI_IOC_FAIL, ioc->ioc_regs.alt_ioc_fwstate);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* If another PCI fn reinitialized and failed again while
|
||||
* this IOC was waiting for hw sem, the sync_ackd bit for
|
||||
* this IOC need to be set again to allow reinitialization.
|
||||
*/
|
||||
if (tmp_ackd != sync_ackd)
|
||||
writel((r32 | sync_ackd), ioc->ioc_regs.ioc_fail_sync);
|
||||
|
||||
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
|
||||
bfa_ioc_ct_pll_init(void __iomem *rb, enum bfi_asic_mode asic_mode)
|
||||
{
|
||||
u32 pll_sclk, pll_fclk, r32;
|
||||
bool fcmode = (asic_mode == BFI_ASIC_MODE_FC);
|
||||
|
||||
pll_sclk = __APP_PLL_SCLK_LRESETN | __APP_PLL_SCLK_ENARST |
|
||||
__APP_PLL_SCLK_RSEL200500 | __APP_PLL_SCLK_P0_1(3U) |
|
||||
__APP_PLL_SCLK_JITLMT0_1(3U) |
|
||||
__APP_PLL_SCLK_CNTLMT0_1(1U);
|
||||
pll_fclk = __APP_PLL_LCLK_LRESETN | __APP_PLL_LCLK_ENARST |
|
||||
__APP_PLL_LCLK_RSEL200500 | __APP_PLL_LCLK_P0_1(3U) |
|
||||
__APP_PLL_LCLK_JITLMT0_1(3U) |
|
||||
__APP_PLL_LCLK_CNTLMT0_1(1U);
|
||||
|
||||
if (fcmode) {
|
||||
writel(0, (rb + OP_MODE));
|
||||
writel(__APP_EMS_CMLCKSEL |
|
||||
__APP_EMS_REFCKBUFEN2 |
|
||||
__APP_EMS_CHANNEL_SEL,
|
||||
(rb + ETH_MAC_SER_REG));
|
||||
} else {
|
||||
writel(__GLOBAL_FCOE_MODE, (rb + OP_MODE));
|
||||
writel(__APP_EMS_REFCKBUFEN1,
|
||||
(rb + ETH_MAC_SER_REG));
|
||||
}
|
||||
writel(BFI_IOC_UNINIT, (rb + BFA_IOC0_STATE_REG));
|
||||
writel(BFI_IOC_UNINIT, (rb + BFA_IOC1_STATE_REG));
|
||||
writel(0xffffffffU, (rb + HOSTFN0_INT_MSK));
|
||||
writel(0xffffffffU, (rb + HOSTFN1_INT_MSK));
|
||||
writel(0xffffffffU, (rb + HOSTFN0_INT_STATUS));
|
||||
writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS));
|
||||
writel(0xffffffffU, (rb + HOSTFN0_INT_MSK));
|
||||
writel(0xffffffffU, (rb + HOSTFN1_INT_MSK));
|
||||
writel(pll_sclk |
|
||||
__APP_PLL_SCLK_LOGIC_SOFT_RESET,
|
||||
rb + APP_PLL_SCLK_CTL_REG);
|
||||
writel(pll_fclk |
|
||||
__APP_PLL_LCLK_LOGIC_SOFT_RESET,
|
||||
rb + APP_PLL_LCLK_CTL_REG);
|
||||
writel(pll_sclk |
|
||||
__APP_PLL_SCLK_LOGIC_SOFT_RESET | __APP_PLL_SCLK_ENABLE,
|
||||
rb + APP_PLL_SCLK_CTL_REG);
|
||||
writel(pll_fclk |
|
||||
__APP_PLL_LCLK_LOGIC_SOFT_RESET | __APP_PLL_LCLK_ENABLE,
|
||||
rb + APP_PLL_LCLK_CTL_REG);
|
||||
readl(rb + HOSTFN0_INT_MSK);
|
||||
udelay(2000);
|
||||
writel(0xffffffffU, (rb + HOSTFN0_INT_STATUS));
|
||||
writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS));
|
||||
writel(pll_sclk |
|
||||
__APP_PLL_SCLK_ENABLE,
|
||||
rb + APP_PLL_SCLK_CTL_REG);
|
||||
writel(pll_fclk |
|
||||
__APP_PLL_LCLK_ENABLE,
|
||||
rb + APP_PLL_LCLK_CTL_REG);
|
||||
|
||||
if (!fcmode) {
|
||||
writel(__PMM_1T_RESET_P, (rb + PMM_1T_RESET_REG_P0));
|
||||
writel(__PMM_1T_RESET_P, (rb + PMM_1T_RESET_REG_P1));
|
||||
}
|
||||
r32 = readl((rb + PSS_CTL_REG));
|
||||
r32 &= ~__PSS_LMEM_RESET;
|
||||
writel(r32, (rb + PSS_CTL_REG));
|
||||
udelay(1000);
|
||||
if (!fcmode) {
|
||||
writel(0, (rb + PMM_1T_RESET_REG_P0));
|
||||
writel(0, (rb + PMM_1T_RESET_REG_P1));
|
||||
}
|
||||
|
||||
writel(__EDRAM_BISTR_START, (rb + MBIST_CTL_REG));
|
||||
udelay(1000);
|
||||
r32 = readl((rb + MBIST_STAT_REG));
|
||||
writel(0, (rb + MBIST_CTL_REG));
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct2_sclk_init(void __iomem *rb)
|
||||
{
|
||||
u32 r32;
|
||||
|
||||
/*
|
||||
* put s_clk PLL and PLL FSM in reset
|
||||
*/
|
||||
r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
r32 &= ~(__APP_PLL_SCLK_ENABLE | __APP_PLL_SCLK_LRESETN);
|
||||
r32 |= (__APP_PLL_SCLK_ENARST | __APP_PLL_SCLK_BYPASS |
|
||||
__APP_PLL_SCLK_LOGIC_SOFT_RESET);
|
||||
writel(r32, (rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
|
||||
/*
|
||||
* Ignore mode and program for the max clock (which is FC16)
|
||||
* Firmware/NFC will do the PLL init appropiately
|
||||
*/
|
||||
r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
r32 &= ~(__APP_PLL_SCLK_REFCLK_SEL | __APP_PLL_SCLK_CLK_DIV2);
|
||||
writel(r32, (rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
|
||||
/*
|
||||
* while doing PLL init dont clock gate ethernet subsystem
|
||||
*/
|
||||
r32 = readl((rb + CT2_CHIP_MISC_PRG));
|
||||
writel((r32 | __ETH_CLK_ENABLE_PORT0),
|
||||
(rb + CT2_CHIP_MISC_PRG));
|
||||
|
||||
r32 = readl((rb + CT2_PCIE_MISC_REG));
|
||||
writel((r32 | __ETH_CLK_ENABLE_PORT1),
|
||||
(rb + CT2_PCIE_MISC_REG));
|
||||
|
||||
/*
|
||||
* set sclk value
|
||||
*/
|
||||
r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
r32 &= (__P_SCLK_PLL_LOCK | __APP_PLL_SCLK_REFCLK_SEL |
|
||||
__APP_PLL_SCLK_CLK_DIV2);
|
||||
writel(r32 | 0x1061731b, (rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
|
||||
/*
|
||||
* poll for s_clk lock or delay 1ms
|
||||
*/
|
||||
udelay(1000);
|
||||
|
||||
/*
|
||||
* Dont do clock gating for ethernet subsystem, firmware/NFC will
|
||||
* do this appropriately
|
||||
*/
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct2_lclk_init(void __iomem *rb)
|
||||
{
|
||||
u32 r32;
|
||||
|
||||
/*
|
||||
* put l_clk PLL and PLL FSM in reset
|
||||
*/
|
||||
r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
r32 &= ~(__APP_PLL_LCLK_ENABLE | __APP_PLL_LCLK_LRESETN);
|
||||
r32 |= (__APP_PLL_LCLK_ENARST | __APP_PLL_LCLK_BYPASS |
|
||||
__APP_PLL_LCLK_LOGIC_SOFT_RESET);
|
||||
writel(r32, (rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
|
||||
/*
|
||||
* set LPU speed (set for FC16 which will work for other modes)
|
||||
*/
|
||||
r32 = readl((rb + CT2_CHIP_MISC_PRG));
|
||||
writel(r32, (rb + CT2_CHIP_MISC_PRG));
|
||||
|
||||
/*
|
||||
* set LPU half speed (set for FC16 which will work for other modes)
|
||||
*/
|
||||
r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
writel(r32, (rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
|
||||
/*
|
||||
* set lclk for mode (set for FC16)
|
||||
*/
|
||||
r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
r32 &= (__P_LCLK_PLL_LOCK | __APP_LPUCLK_HALFSPEED);
|
||||
r32 |= 0x20c1731b;
|
||||
writel(r32, (rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
|
||||
/*
|
||||
* poll for s_clk lock or delay 1ms
|
||||
*/
|
||||
udelay(1000);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct2_mem_init(void __iomem *rb)
|
||||
{
|
||||
u32 r32;
|
||||
|
||||
r32 = readl((rb + PSS_CTL_REG));
|
||||
r32 &= ~__PSS_LMEM_RESET;
|
||||
writel(r32, (rb + PSS_CTL_REG));
|
||||
udelay(1000);
|
||||
|
||||
writel(__EDRAM_BISTR_START, (rb + CT2_MBIST_CTL_REG));
|
||||
udelay(1000);
|
||||
writel(0, (rb + CT2_MBIST_CTL_REG));
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct2_mac_reset(void __iomem *rb)
|
||||
{
|
||||
volatile u32 r32;
|
||||
|
||||
bfa_ioc_ct2_sclk_init(rb);
|
||||
bfa_ioc_ct2_lclk_init(rb);
|
||||
|
||||
/*
|
||||
* release soft reset on s_clk & l_clk
|
||||
*/
|
||||
r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
writel((r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET),
|
||||
(rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
|
||||
/*
|
||||
* release soft reset on s_clk & l_clk
|
||||
*/
|
||||
r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
writel((r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET),
|
||||
(rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
|
||||
/* put port0, port1 MAC & AHB in reset */
|
||||
writel((__CSI_MAC_RESET | __CSI_MAC_AHB_RESET),
|
||||
(rb + CT2_CSI_MAC_CONTROL_REG(0)));
|
||||
writel((__CSI_MAC_RESET | __CSI_MAC_AHB_RESET),
|
||||
(rb + CT2_CSI_MAC_CONTROL_REG(1)));
|
||||
}
|
||||
|
||||
#define CT2_NFC_MAX_DELAY 1000
|
||||
#define CT2_NFC_VER_VALID 0x143
|
||||
#define BFA_IOC_PLL_POLL 1000000
|
||||
|
||||
static bool
|
||||
bfa_ioc_ct2_nfc_halted(void __iomem *rb)
|
||||
{
|
||||
volatile u32 r32;
|
||||
|
||||
r32 = readl(rb + CT2_NFC_CSR_SET_REG);
|
||||
if (r32 & __NFC_CONTROLLER_HALTED)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct2_nfc_resume(void __iomem *rb)
|
||||
{
|
||||
volatile u32 r32;
|
||||
int i;
|
||||
|
||||
writel(__HALT_NFC_CONTROLLER, rb + CT2_NFC_CSR_CLR_REG);
|
||||
for (i = 0; i < CT2_NFC_MAX_DELAY; i++) {
|
||||
r32 = readl(rb + CT2_NFC_CSR_SET_REG);
|
||||
if (!(r32 & __NFC_CONTROLLER_HALTED))
|
||||
return;
|
||||
udelay(1000);
|
||||
}
|
||||
BUG_ON(1);
|
||||
}
|
||||
|
||||
static enum bfa_status
|
||||
bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode asic_mode)
|
||||
{
|
||||
volatile u32 wgn, r32;
|
||||
u32 nfc_ver, i;
|
||||
|
||||
wgn = readl(rb + CT2_WGN_STATUS);
|
||||
|
||||
nfc_ver = readl(rb + CT2_RSC_GPR15_REG);
|
||||
|
||||
if ((wgn == (__A2T_AHB_LOAD | __WGN_READY)) &&
|
||||
(nfc_ver >= CT2_NFC_VER_VALID)) {
|
||||
if (bfa_ioc_ct2_nfc_halted(rb))
|
||||
bfa_ioc_ct2_nfc_resume(rb);
|
||||
writel(__RESET_AND_START_SCLK_LCLK_PLLS,
|
||||
rb + CT2_CSI_FW_CTL_SET_REG);
|
||||
|
||||
for (i = 0; i < BFA_IOC_PLL_POLL; i++) {
|
||||
r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG);
|
||||
if (r32 & __RESET_AND_START_SCLK_LCLK_PLLS)
|
||||
break;
|
||||
}
|
||||
BUG_ON(!(r32 & __RESET_AND_START_SCLK_LCLK_PLLS));
|
||||
|
||||
for (i = 0; i < BFA_IOC_PLL_POLL; i++) {
|
||||
r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG);
|
||||
if (!(r32 & __RESET_AND_START_SCLK_LCLK_PLLS))
|
||||
break;
|
||||
}
|
||||
BUG_ON(r32 & __RESET_AND_START_SCLK_LCLK_PLLS);
|
||||
udelay(1000);
|
||||
|
||||
r32 = readl(rb + CT2_CSI_FW_CTL_REG);
|
||||
BUG_ON(r32 & __RESET_AND_START_SCLK_LCLK_PLLS);
|
||||
} else {
|
||||
writel(__HALT_NFC_CONTROLLER, (rb + CT2_NFC_CSR_SET_REG));
|
||||
for (i = 0; i < CT2_NFC_MAX_DELAY; i++) {
|
||||
r32 = readl(rb + CT2_NFC_CSR_SET_REG);
|
||||
if (r32 & __NFC_CONTROLLER_HALTED)
|
||||
break;
|
||||
udelay(1000);
|
||||
}
|
||||
|
||||
bfa_ioc_ct2_mac_reset(rb);
|
||||
bfa_ioc_ct2_sclk_init(rb);
|
||||
bfa_ioc_ct2_lclk_init(rb);
|
||||
|
||||
/* release soft reset on s_clk & l_clk */
|
||||
r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG));
|
||||
writel(r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET,
|
||||
rb + CT2_APP_PLL_SCLK_CTL_REG);
|
||||
r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG));
|
||||
writel(r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET,
|
||||
rb + CT2_APP_PLL_LCLK_CTL_REG);
|
||||
}
|
||||
|
||||
/* Announce flash device presence, if flash was corrupted. */
|
||||
if (wgn == (__WGN_READY | __GLBL_PF_VF_CFG_RDY)) {
|
||||
r32 = readl((rb + PSS_GPIO_OUT_REG));
|
||||
writel(r32 & ~1, rb + PSS_GPIO_OUT_REG);
|
||||
r32 = readl((rb + PSS_GPIO_OE_REG));
|
||||
writel(r32 | 1, rb + PSS_GPIO_OE_REG);
|
||||
}
|
||||
|
||||
/*
|
||||
* Mask the interrupts and clear any
|
||||
* pending interrupts left by BIOS/EFI
|
||||
*/
|
||||
writel(1, (rb + CT2_LPU0_HOSTFN_MBOX0_MSK));
|
||||
writel(1, (rb + CT2_LPU1_HOSTFN_MBOX0_MSK));
|
||||
|
||||
/* For first time initialization, no need to clear interrupts */
|
||||
r32 = readl(rb + HOST_SEM5_REG);
|
||||
if (r32 & 0x1) {
|
||||
r32 = readl((rb + CT2_LPU0_HOSTFN_CMD_STAT));
|
||||
if (r32 == 1) {
|
||||
writel(1, (rb + CT2_LPU0_HOSTFN_CMD_STAT));
|
||||
readl((rb + CT2_LPU0_HOSTFN_CMD_STAT));
|
||||
}
|
||||
r32 = readl((rb + CT2_LPU1_HOSTFN_CMD_STAT));
|
||||
if (r32 == 1) {
|
||||
writel(1, (rb + CT2_LPU1_HOSTFN_CMD_STAT));
|
||||
readl((rb + CT2_LPU1_HOSTFN_CMD_STAT));
|
||||
}
|
||||
}
|
||||
|
||||
bfa_ioc_ct2_mem_init(rb);
|
||||
|
||||
writel(BFI_IOC_UNINIT, (rb + CT2_BFA_IOC0_STATE_REG));
|
||||
writel(BFI_IOC_UNINIT, (rb + CT2_BFA_IOC1_STATE_REG));
|
||||
return BFA_STATUS_OK;
|
||||
}
|
667
drivers/net/ethernet/brocade/bna/bfa_msgq.c
Normal file
667
drivers/net/ethernet/brocade/bna/bfa_msgq.c
Normal file
|
@ -0,0 +1,667 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
/* MSGQ module source file. */
|
||||
|
||||
#include "bfi.h"
|
||||
#include "bfa_msgq.h"
|
||||
#include "bfa_ioc.h"
|
||||
|
||||
#define call_cmdq_ent_cbfn(_cmdq_ent, _status) \
|
||||
{ \
|
||||
bfa_msgq_cmdcbfn_t cbfn; \
|
||||
void *cbarg; \
|
||||
cbfn = (_cmdq_ent)->cbfn; \
|
||||
cbarg = (_cmdq_ent)->cbarg; \
|
||||
(_cmdq_ent)->cbfn = NULL; \
|
||||
(_cmdq_ent)->cbarg = NULL; \
|
||||
if (cbfn) { \
|
||||
cbfn(cbarg, (_status)); \
|
||||
} \
|
||||
}
|
||||
|
||||
static void bfa_msgq_cmdq_dbell(struct bfa_msgq_cmdq *cmdq);
|
||||
static void bfa_msgq_cmdq_copy_rsp(struct bfa_msgq_cmdq *cmdq);
|
||||
|
||||
enum cmdq_event {
|
||||
CMDQ_E_START = 1,
|
||||
CMDQ_E_STOP = 2,
|
||||
CMDQ_E_FAIL = 3,
|
||||
CMDQ_E_POST = 4,
|
||||
CMDQ_E_INIT_RESP = 5,
|
||||
CMDQ_E_DB_READY = 6,
|
||||
};
|
||||
|
||||
bfa_fsm_state_decl(cmdq, stopped, struct bfa_msgq_cmdq, enum cmdq_event);
|
||||
bfa_fsm_state_decl(cmdq, init_wait, struct bfa_msgq_cmdq, enum cmdq_event);
|
||||
bfa_fsm_state_decl(cmdq, ready, struct bfa_msgq_cmdq, enum cmdq_event);
|
||||
bfa_fsm_state_decl(cmdq, dbell_wait, struct bfa_msgq_cmdq,
|
||||
enum cmdq_event);
|
||||
|
||||
static void
|
||||
cmdq_sm_stopped_entry(struct bfa_msgq_cmdq *cmdq)
|
||||
{
|
||||
struct bfa_msgq_cmd_entry *cmdq_ent;
|
||||
|
||||
cmdq->producer_index = 0;
|
||||
cmdq->consumer_index = 0;
|
||||
cmdq->flags = 0;
|
||||
cmdq->token = 0;
|
||||
cmdq->offset = 0;
|
||||
cmdq->bytes_to_copy = 0;
|
||||
while (!list_empty(&cmdq->pending_q)) {
|
||||
bfa_q_deq(&cmdq->pending_q, &cmdq_ent);
|
||||
bfa_q_qe_init(&cmdq_ent->qe);
|
||||
call_cmdq_ent_cbfn(cmdq_ent, BFA_STATUS_FAILED);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cmdq_sm_stopped(struct bfa_msgq_cmdq *cmdq, enum cmdq_event event)
|
||||
{
|
||||
switch (event) {
|
||||
case CMDQ_E_START:
|
||||
bfa_fsm_set_state(cmdq, cmdq_sm_init_wait);
|
||||
break;
|
||||
|
||||
case CMDQ_E_STOP:
|
||||
case CMDQ_E_FAIL:
|
||||
/* No-op */
|
||||
break;
|
||||
|
||||
case CMDQ_E_POST:
|
||||
cmdq->flags |= BFA_MSGQ_CMDQ_F_DB_UPDATE;
|
||||
break;
|
||||
|
||||
default:
|
||||
bfa_sm_fault(event);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cmdq_sm_init_wait_entry(struct bfa_msgq_cmdq *cmdq)
|
||||
{
|
||||
bfa_wc_down(&cmdq->msgq->init_wc);
|
||||
}
|
||||
|
||||
static void
|
||||
cmdq_sm_init_wait(struct bfa_msgq_cmdq *cmdq, enum cmdq_event event)
|
||||
{
|
||||
switch (event) {
|
||||
case CMDQ_E_STOP:
|
||||
case CMDQ_E_FAIL:
|
||||
bfa_fsm_set_state(cmdq, cmdq_sm_stopped);
|
||||
break;
|
||||
|
||||
case CMDQ_E_POST:
|
||||
cmdq->flags |= BFA_MSGQ_CMDQ_F_DB_UPDATE;
|
||||
break;
|
||||
|
||||
case CMDQ_E_INIT_RESP:
|
||||
if (cmdq->flags & BFA_MSGQ_CMDQ_F_DB_UPDATE) {
|
||||
cmdq->flags &= ~BFA_MSGQ_CMDQ_F_DB_UPDATE;
|
||||
bfa_fsm_set_state(cmdq, cmdq_sm_dbell_wait);
|
||||
} else
|
||||
bfa_fsm_set_state(cmdq, cmdq_sm_ready);
|
||||
break;
|
||||
|
||||
default:
|
||||
bfa_sm_fault(event);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cmdq_sm_ready_entry(struct bfa_msgq_cmdq *cmdq)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
cmdq_sm_ready(struct bfa_msgq_cmdq *cmdq, enum cmdq_event event)
|
||||
{
|
||||
switch (event) {
|
||||
case CMDQ_E_STOP:
|
||||
case CMDQ_E_FAIL:
|
||||
bfa_fsm_set_state(cmdq, cmdq_sm_stopped);
|
||||
break;
|
||||
|
||||
case CMDQ_E_POST:
|
||||
bfa_fsm_set_state(cmdq, cmdq_sm_dbell_wait);
|
||||
break;
|
||||
|
||||
default:
|
||||
bfa_sm_fault(event);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cmdq_sm_dbell_wait_entry(struct bfa_msgq_cmdq *cmdq)
|
||||
{
|
||||
bfa_msgq_cmdq_dbell(cmdq);
|
||||
}
|
||||
|
||||
static void
|
||||
cmdq_sm_dbell_wait(struct bfa_msgq_cmdq *cmdq, enum cmdq_event event)
|
||||
{
|
||||
switch (event) {
|
||||
case CMDQ_E_STOP:
|
||||
case CMDQ_E_FAIL:
|
||||
bfa_fsm_set_state(cmdq, cmdq_sm_stopped);
|
||||
break;
|
||||
|
||||
case CMDQ_E_POST:
|
||||
cmdq->flags |= BFA_MSGQ_CMDQ_F_DB_UPDATE;
|
||||
break;
|
||||
|
||||
case CMDQ_E_DB_READY:
|
||||
if (cmdq->flags & BFA_MSGQ_CMDQ_F_DB_UPDATE) {
|
||||
cmdq->flags &= ~BFA_MSGQ_CMDQ_F_DB_UPDATE;
|
||||
bfa_fsm_set_state(cmdq, cmdq_sm_dbell_wait);
|
||||
} else
|
||||
bfa_fsm_set_state(cmdq, cmdq_sm_ready);
|
||||
break;
|
||||
|
||||
default:
|
||||
bfa_sm_fault(event);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_cmdq_dbell_ready(void *arg)
|
||||
{
|
||||
struct bfa_msgq_cmdq *cmdq = (struct bfa_msgq_cmdq *)arg;
|
||||
bfa_fsm_send_event(cmdq, CMDQ_E_DB_READY);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_cmdq_dbell(struct bfa_msgq_cmdq *cmdq)
|
||||
{
|
||||
struct bfi_msgq_h2i_db *dbell =
|
||||
(struct bfi_msgq_h2i_db *)(&cmdq->dbell_mb.msg[0]);
|
||||
|
||||
memset(dbell, 0, sizeof(struct bfi_msgq_h2i_db));
|
||||
bfi_h2i_set(dbell->mh, BFI_MC_MSGQ, BFI_MSGQ_H2I_DOORBELL_PI, 0);
|
||||
dbell->mh.mtag.i2htok = 0;
|
||||
dbell->idx.cmdq_pi = htons(cmdq->producer_index);
|
||||
|
||||
if (!bfa_nw_ioc_mbox_queue(cmdq->msgq->ioc, &cmdq->dbell_mb,
|
||||
bfa_msgq_cmdq_dbell_ready, cmdq)) {
|
||||
bfa_msgq_cmdq_dbell_ready(cmdq);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
__cmd_copy(struct bfa_msgq_cmdq *cmdq, struct bfa_msgq_cmd_entry *cmd)
|
||||
{
|
||||
size_t len = cmd->msg_size;
|
||||
int num_entries = 0;
|
||||
size_t to_copy;
|
||||
u8 *src, *dst;
|
||||
|
||||
src = (u8 *)cmd->msg_hdr;
|
||||
dst = (u8 *)cmdq->addr.kva;
|
||||
dst += (cmdq->producer_index * BFI_MSGQ_CMD_ENTRY_SIZE);
|
||||
|
||||
while (len) {
|
||||
to_copy = (len < BFI_MSGQ_CMD_ENTRY_SIZE) ?
|
||||
len : BFI_MSGQ_CMD_ENTRY_SIZE;
|
||||
memcpy(dst, src, to_copy);
|
||||
len -= to_copy;
|
||||
src += BFI_MSGQ_CMD_ENTRY_SIZE;
|
||||
BFA_MSGQ_INDX_ADD(cmdq->producer_index, 1, cmdq->depth);
|
||||
dst = (u8 *)cmdq->addr.kva;
|
||||
dst += (cmdq->producer_index * BFI_MSGQ_CMD_ENTRY_SIZE);
|
||||
num_entries++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_cmdq_ci_update(struct bfa_msgq_cmdq *cmdq, struct bfi_mbmsg *mb)
|
||||
{
|
||||
struct bfi_msgq_i2h_db *dbell = (struct bfi_msgq_i2h_db *)mb;
|
||||
struct bfa_msgq_cmd_entry *cmd;
|
||||
int posted = 0;
|
||||
|
||||
cmdq->consumer_index = ntohs(dbell->idx.cmdq_ci);
|
||||
|
||||
/* Walk through pending list to see if the command can be posted */
|
||||
while (!list_empty(&cmdq->pending_q)) {
|
||||
cmd =
|
||||
(struct bfa_msgq_cmd_entry *)bfa_q_first(&cmdq->pending_q);
|
||||
if (ntohs(cmd->msg_hdr->num_entries) <=
|
||||
BFA_MSGQ_FREE_CNT(cmdq)) {
|
||||
list_del(&cmd->qe);
|
||||
__cmd_copy(cmdq, cmd);
|
||||
posted = 1;
|
||||
call_cmdq_ent_cbfn(cmd, BFA_STATUS_OK);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (posted)
|
||||
bfa_fsm_send_event(cmdq, CMDQ_E_POST);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_cmdq_copy_next(void *arg)
|
||||
{
|
||||
struct bfa_msgq_cmdq *cmdq = (struct bfa_msgq_cmdq *)arg;
|
||||
|
||||
if (cmdq->bytes_to_copy)
|
||||
bfa_msgq_cmdq_copy_rsp(cmdq);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_cmdq_copy_req(struct bfa_msgq_cmdq *cmdq, struct bfi_mbmsg *mb)
|
||||
{
|
||||
struct bfi_msgq_i2h_cmdq_copy_req *req =
|
||||
(struct bfi_msgq_i2h_cmdq_copy_req *)mb;
|
||||
|
||||
cmdq->token = 0;
|
||||
cmdq->offset = ntohs(req->offset);
|
||||
cmdq->bytes_to_copy = ntohs(req->len);
|
||||
bfa_msgq_cmdq_copy_rsp(cmdq);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_cmdq_copy_rsp(struct bfa_msgq_cmdq *cmdq)
|
||||
{
|
||||
struct bfi_msgq_h2i_cmdq_copy_rsp *rsp =
|
||||
(struct bfi_msgq_h2i_cmdq_copy_rsp *)&cmdq->copy_mb.msg[0];
|
||||
int copied;
|
||||
u8 *addr = (u8 *)cmdq->addr.kva;
|
||||
|
||||
memset(rsp, 0, sizeof(struct bfi_msgq_h2i_cmdq_copy_rsp));
|
||||
bfi_h2i_set(rsp->mh, BFI_MC_MSGQ, BFI_MSGQ_H2I_CMDQ_COPY_RSP, 0);
|
||||
rsp->mh.mtag.i2htok = htons(cmdq->token);
|
||||
copied = (cmdq->bytes_to_copy >= BFI_CMD_COPY_SZ) ? BFI_CMD_COPY_SZ :
|
||||
cmdq->bytes_to_copy;
|
||||
addr += cmdq->offset;
|
||||
memcpy(rsp->data, addr, copied);
|
||||
|
||||
cmdq->token++;
|
||||
cmdq->offset += copied;
|
||||
cmdq->bytes_to_copy -= copied;
|
||||
|
||||
if (!bfa_nw_ioc_mbox_queue(cmdq->msgq->ioc, &cmdq->copy_mb,
|
||||
bfa_msgq_cmdq_copy_next, cmdq)) {
|
||||
bfa_msgq_cmdq_copy_next(cmdq);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_cmdq_attach(struct bfa_msgq_cmdq *cmdq, struct bfa_msgq *msgq)
|
||||
{
|
||||
cmdq->depth = BFA_MSGQ_CMDQ_NUM_ENTRY;
|
||||
INIT_LIST_HEAD(&cmdq->pending_q);
|
||||
cmdq->msgq = msgq;
|
||||
bfa_fsm_set_state(cmdq, cmdq_sm_stopped);
|
||||
}
|
||||
|
||||
static void bfa_msgq_rspq_dbell(struct bfa_msgq_rspq *rspq);
|
||||
|
||||
enum rspq_event {
|
||||
RSPQ_E_START = 1,
|
||||
RSPQ_E_STOP = 2,
|
||||
RSPQ_E_FAIL = 3,
|
||||
RSPQ_E_RESP = 4,
|
||||
RSPQ_E_INIT_RESP = 5,
|
||||
RSPQ_E_DB_READY = 6,
|
||||
};
|
||||
|
||||
bfa_fsm_state_decl(rspq, stopped, struct bfa_msgq_rspq, enum rspq_event);
|
||||
bfa_fsm_state_decl(rspq, init_wait, struct bfa_msgq_rspq,
|
||||
enum rspq_event);
|
||||
bfa_fsm_state_decl(rspq, ready, struct bfa_msgq_rspq, enum rspq_event);
|
||||
bfa_fsm_state_decl(rspq, dbell_wait, struct bfa_msgq_rspq,
|
||||
enum rspq_event);
|
||||
|
||||
static void
|
||||
rspq_sm_stopped_entry(struct bfa_msgq_rspq *rspq)
|
||||
{
|
||||
rspq->producer_index = 0;
|
||||
rspq->consumer_index = 0;
|
||||
rspq->flags = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
rspq_sm_stopped(struct bfa_msgq_rspq *rspq, enum rspq_event event)
|
||||
{
|
||||
switch (event) {
|
||||
case RSPQ_E_START:
|
||||
bfa_fsm_set_state(rspq, rspq_sm_init_wait);
|
||||
break;
|
||||
|
||||
case RSPQ_E_STOP:
|
||||
case RSPQ_E_FAIL:
|
||||
/* No-op */
|
||||
break;
|
||||
|
||||
default:
|
||||
bfa_sm_fault(event);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
rspq_sm_init_wait_entry(struct bfa_msgq_rspq *rspq)
|
||||
{
|
||||
bfa_wc_down(&rspq->msgq->init_wc);
|
||||
}
|
||||
|
||||
static void
|
||||
rspq_sm_init_wait(struct bfa_msgq_rspq *rspq, enum rspq_event event)
|
||||
{
|
||||
switch (event) {
|
||||
case RSPQ_E_FAIL:
|
||||
case RSPQ_E_STOP:
|
||||
bfa_fsm_set_state(rspq, rspq_sm_stopped);
|
||||
break;
|
||||
|
||||
case RSPQ_E_INIT_RESP:
|
||||
bfa_fsm_set_state(rspq, rspq_sm_ready);
|
||||
break;
|
||||
|
||||
default:
|
||||
bfa_sm_fault(event);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
rspq_sm_ready_entry(struct bfa_msgq_rspq *rspq)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
rspq_sm_ready(struct bfa_msgq_rspq *rspq, enum rspq_event event)
|
||||
{
|
||||
switch (event) {
|
||||
case RSPQ_E_STOP:
|
||||
case RSPQ_E_FAIL:
|
||||
bfa_fsm_set_state(rspq, rspq_sm_stopped);
|
||||
break;
|
||||
|
||||
case RSPQ_E_RESP:
|
||||
bfa_fsm_set_state(rspq, rspq_sm_dbell_wait);
|
||||
break;
|
||||
|
||||
default:
|
||||
bfa_sm_fault(event);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
rspq_sm_dbell_wait_entry(struct bfa_msgq_rspq *rspq)
|
||||
{
|
||||
if (!bfa_nw_ioc_is_disabled(rspq->msgq->ioc))
|
||||
bfa_msgq_rspq_dbell(rspq);
|
||||
}
|
||||
|
||||
static void
|
||||
rspq_sm_dbell_wait(struct bfa_msgq_rspq *rspq, enum rspq_event event)
|
||||
{
|
||||
switch (event) {
|
||||
case RSPQ_E_STOP:
|
||||
case RSPQ_E_FAIL:
|
||||
bfa_fsm_set_state(rspq, rspq_sm_stopped);
|
||||
break;
|
||||
|
||||
case RSPQ_E_RESP:
|
||||
rspq->flags |= BFA_MSGQ_RSPQ_F_DB_UPDATE;
|
||||
break;
|
||||
|
||||
case RSPQ_E_DB_READY:
|
||||
if (rspq->flags & BFA_MSGQ_RSPQ_F_DB_UPDATE) {
|
||||
rspq->flags &= ~BFA_MSGQ_RSPQ_F_DB_UPDATE;
|
||||
bfa_fsm_set_state(rspq, rspq_sm_dbell_wait);
|
||||
} else
|
||||
bfa_fsm_set_state(rspq, rspq_sm_ready);
|
||||
break;
|
||||
|
||||
default:
|
||||
bfa_sm_fault(event);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_rspq_dbell_ready(void *arg)
|
||||
{
|
||||
struct bfa_msgq_rspq *rspq = (struct bfa_msgq_rspq *)arg;
|
||||
bfa_fsm_send_event(rspq, RSPQ_E_DB_READY);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_rspq_dbell(struct bfa_msgq_rspq *rspq)
|
||||
{
|
||||
struct bfi_msgq_h2i_db *dbell =
|
||||
(struct bfi_msgq_h2i_db *)(&rspq->dbell_mb.msg[0]);
|
||||
|
||||
memset(dbell, 0, sizeof(struct bfi_msgq_h2i_db));
|
||||
bfi_h2i_set(dbell->mh, BFI_MC_MSGQ, BFI_MSGQ_H2I_DOORBELL_CI, 0);
|
||||
dbell->mh.mtag.i2htok = 0;
|
||||
dbell->idx.rspq_ci = htons(rspq->consumer_index);
|
||||
|
||||
if (!bfa_nw_ioc_mbox_queue(rspq->msgq->ioc, &rspq->dbell_mb,
|
||||
bfa_msgq_rspq_dbell_ready, rspq)) {
|
||||
bfa_msgq_rspq_dbell_ready(rspq);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_rspq_pi_update(struct bfa_msgq_rspq *rspq, struct bfi_mbmsg *mb)
|
||||
{
|
||||
struct bfi_msgq_i2h_db *dbell = (struct bfi_msgq_i2h_db *)mb;
|
||||
struct bfi_msgq_mhdr *msghdr;
|
||||
int num_entries;
|
||||
int mc;
|
||||
u8 *rspq_qe;
|
||||
|
||||
rspq->producer_index = ntohs(dbell->idx.rspq_pi);
|
||||
|
||||
while (rspq->consumer_index != rspq->producer_index) {
|
||||
rspq_qe = (u8 *)rspq->addr.kva;
|
||||
rspq_qe += (rspq->consumer_index * BFI_MSGQ_RSP_ENTRY_SIZE);
|
||||
msghdr = (struct bfi_msgq_mhdr *)rspq_qe;
|
||||
|
||||
mc = msghdr->msg_class;
|
||||
num_entries = ntohs(msghdr->num_entries);
|
||||
|
||||
if ((mc >= BFI_MC_MAX) || (rspq->rsphdlr[mc].cbfn == NULL))
|
||||
break;
|
||||
|
||||
(rspq->rsphdlr[mc].cbfn)(rspq->rsphdlr[mc].cbarg, msghdr);
|
||||
|
||||
BFA_MSGQ_INDX_ADD(rspq->consumer_index, num_entries,
|
||||
rspq->depth);
|
||||
}
|
||||
|
||||
bfa_fsm_send_event(rspq, RSPQ_E_RESP);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_rspq_attach(struct bfa_msgq_rspq *rspq, struct bfa_msgq *msgq)
|
||||
{
|
||||
rspq->depth = BFA_MSGQ_RSPQ_NUM_ENTRY;
|
||||
rspq->msgq = msgq;
|
||||
bfa_fsm_set_state(rspq, rspq_sm_stopped);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_init_rsp(struct bfa_msgq *msgq,
|
||||
struct bfi_mbmsg *mb)
|
||||
{
|
||||
bfa_fsm_send_event(&msgq->cmdq, CMDQ_E_INIT_RESP);
|
||||
bfa_fsm_send_event(&msgq->rspq, RSPQ_E_INIT_RESP);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_init(void *arg)
|
||||
{
|
||||
struct bfa_msgq *msgq = (struct bfa_msgq *)arg;
|
||||
struct bfi_msgq_cfg_req *msgq_cfg =
|
||||
(struct bfi_msgq_cfg_req *)&msgq->init_mb.msg[0];
|
||||
|
||||
memset(msgq_cfg, 0, sizeof(struct bfi_msgq_cfg_req));
|
||||
bfi_h2i_set(msgq_cfg->mh, BFI_MC_MSGQ, BFI_MSGQ_H2I_INIT_REQ, 0);
|
||||
msgq_cfg->mh.mtag.i2htok = 0;
|
||||
|
||||
bfa_dma_be_addr_set(msgq_cfg->cmdq.addr, msgq->cmdq.addr.pa);
|
||||
msgq_cfg->cmdq.q_depth = htons(msgq->cmdq.depth);
|
||||
bfa_dma_be_addr_set(msgq_cfg->rspq.addr, msgq->rspq.addr.pa);
|
||||
msgq_cfg->rspq.q_depth = htons(msgq->rspq.depth);
|
||||
|
||||
bfa_nw_ioc_mbox_queue(msgq->ioc, &msgq->init_mb, NULL, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_isr(void *cbarg, struct bfi_mbmsg *msg)
|
||||
{
|
||||
struct bfa_msgq *msgq = (struct bfa_msgq *)cbarg;
|
||||
|
||||
switch (msg->mh.msg_id) {
|
||||
case BFI_MSGQ_I2H_INIT_RSP:
|
||||
bfa_msgq_init_rsp(msgq, msg);
|
||||
break;
|
||||
|
||||
case BFI_MSGQ_I2H_DOORBELL_PI:
|
||||
bfa_msgq_rspq_pi_update(&msgq->rspq, msg);
|
||||
break;
|
||||
|
||||
case BFI_MSGQ_I2H_DOORBELL_CI:
|
||||
bfa_msgq_cmdq_ci_update(&msgq->cmdq, msg);
|
||||
break;
|
||||
|
||||
case BFI_MSGQ_I2H_CMDQ_COPY_REQ:
|
||||
bfa_msgq_cmdq_copy_req(&msgq->cmdq, msg);
|
||||
break;
|
||||
|
||||
default:
|
||||
BUG_ON(1);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_msgq_notify(void *cbarg, enum bfa_ioc_event event)
|
||||
{
|
||||
struct bfa_msgq *msgq = (struct bfa_msgq *)cbarg;
|
||||
|
||||
switch (event) {
|
||||
case BFA_IOC_E_ENABLED:
|
||||
bfa_wc_init(&msgq->init_wc, bfa_msgq_init, msgq);
|
||||
bfa_wc_up(&msgq->init_wc);
|
||||
bfa_fsm_send_event(&msgq->cmdq, CMDQ_E_START);
|
||||
bfa_wc_up(&msgq->init_wc);
|
||||
bfa_fsm_send_event(&msgq->rspq, RSPQ_E_START);
|
||||
bfa_wc_wait(&msgq->init_wc);
|
||||
break;
|
||||
|
||||
case BFA_IOC_E_DISABLED:
|
||||
bfa_fsm_send_event(&msgq->cmdq, CMDQ_E_STOP);
|
||||
bfa_fsm_send_event(&msgq->rspq, RSPQ_E_STOP);
|
||||
break;
|
||||
|
||||
case BFA_IOC_E_FAILED:
|
||||
bfa_fsm_send_event(&msgq->cmdq, CMDQ_E_FAIL);
|
||||
bfa_fsm_send_event(&msgq->rspq, RSPQ_E_FAIL);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
u32
|
||||
bfa_msgq_meminfo(void)
|
||||
{
|
||||
return roundup(BFA_MSGQ_CMDQ_SIZE, BFA_DMA_ALIGN_SZ) +
|
||||
roundup(BFA_MSGQ_RSPQ_SIZE, BFA_DMA_ALIGN_SZ);
|
||||
}
|
||||
|
||||
void
|
||||
bfa_msgq_memclaim(struct bfa_msgq *msgq, u8 *kva, u64 pa)
|
||||
{
|
||||
msgq->cmdq.addr.kva = kva;
|
||||
msgq->cmdq.addr.pa = pa;
|
||||
|
||||
kva += roundup(BFA_MSGQ_CMDQ_SIZE, BFA_DMA_ALIGN_SZ);
|
||||
pa += roundup(BFA_MSGQ_CMDQ_SIZE, BFA_DMA_ALIGN_SZ);
|
||||
|
||||
msgq->rspq.addr.kva = kva;
|
||||
msgq->rspq.addr.pa = pa;
|
||||
}
|
||||
|
||||
void
|
||||
bfa_msgq_attach(struct bfa_msgq *msgq, struct bfa_ioc *ioc)
|
||||
{
|
||||
msgq->ioc = ioc;
|
||||
|
||||
bfa_msgq_cmdq_attach(&msgq->cmdq, msgq);
|
||||
bfa_msgq_rspq_attach(&msgq->rspq, msgq);
|
||||
|
||||
bfa_nw_ioc_mbox_regisr(msgq->ioc, BFI_MC_MSGQ, bfa_msgq_isr, msgq);
|
||||
bfa_q_qe_init(&msgq->ioc_notify);
|
||||
bfa_ioc_notify_init(&msgq->ioc_notify, bfa_msgq_notify, msgq);
|
||||
bfa_nw_ioc_notify_register(msgq->ioc, &msgq->ioc_notify);
|
||||
}
|
||||
|
||||
void
|
||||
bfa_msgq_regisr(struct bfa_msgq *msgq, enum bfi_mclass mc,
|
||||
bfa_msgq_mcfunc_t cbfn, void *cbarg)
|
||||
{
|
||||
msgq->rspq.rsphdlr[mc].cbfn = cbfn;
|
||||
msgq->rspq.rsphdlr[mc].cbarg = cbarg;
|
||||
}
|
||||
|
||||
void
|
||||
bfa_msgq_cmd_post(struct bfa_msgq *msgq, struct bfa_msgq_cmd_entry *cmd)
|
||||
{
|
||||
if (ntohs(cmd->msg_hdr->num_entries) <=
|
||||
BFA_MSGQ_FREE_CNT(&msgq->cmdq)) {
|
||||
__cmd_copy(&msgq->cmdq, cmd);
|
||||
call_cmdq_ent_cbfn(cmd, BFA_STATUS_OK);
|
||||
bfa_fsm_send_event(&msgq->cmdq, CMDQ_E_POST);
|
||||
} else {
|
||||
list_add_tail(&cmd->qe, &msgq->cmdq.pending_q);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
bfa_msgq_rsp_copy(struct bfa_msgq *msgq, u8 *buf, size_t buf_len)
|
||||
{
|
||||
struct bfa_msgq_rspq *rspq = &msgq->rspq;
|
||||
size_t len = buf_len;
|
||||
size_t to_copy;
|
||||
int ci;
|
||||
u8 *src, *dst;
|
||||
|
||||
ci = rspq->consumer_index;
|
||||
src = (u8 *)rspq->addr.kva;
|
||||
src += (ci * BFI_MSGQ_RSP_ENTRY_SIZE);
|
||||
dst = buf;
|
||||
|
||||
while (len) {
|
||||
to_copy = (len < BFI_MSGQ_RSP_ENTRY_SIZE) ?
|
||||
len : BFI_MSGQ_RSP_ENTRY_SIZE;
|
||||
memcpy(dst, src, to_copy);
|
||||
len -= to_copy;
|
||||
dst += BFI_MSGQ_RSP_ENTRY_SIZE;
|
||||
BFA_MSGQ_INDX_ADD(ci, 1, rspq->depth);
|
||||
src = (u8 *)rspq->addr.kva;
|
||||
src += (ci * BFI_MSGQ_RSP_ENTRY_SIZE);
|
||||
}
|
||||
}
|
130
drivers/net/ethernet/brocade/bna/bfa_msgq.h
Normal file
130
drivers/net/ethernet/brocade/bna/bfa_msgq.h
Normal file
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#ifndef __BFA_MSGQ_H__
|
||||
#define __BFA_MSGQ_H__
|
||||
|
||||
#include "bfa_defs.h"
|
||||
#include "bfi.h"
|
||||
#include "bfa_ioc.h"
|
||||
#include "bfa_cs.h"
|
||||
|
||||
#define BFA_MSGQ_FREE_CNT(_q) \
|
||||
(((_q)->consumer_index - (_q)->producer_index - 1) & ((_q)->depth - 1))
|
||||
|
||||
#define BFA_MSGQ_INDX_ADD(_q_indx, _qe_num, _q_depth) \
|
||||
((_q_indx) = (((_q_indx) + (_qe_num)) & ((_q_depth) - 1)))
|
||||
|
||||
#define BFA_MSGQ_CMDQ_NUM_ENTRY 128
|
||||
#define BFA_MSGQ_CMDQ_SIZE \
|
||||
(BFI_MSGQ_CMD_ENTRY_SIZE * BFA_MSGQ_CMDQ_NUM_ENTRY)
|
||||
|
||||
#define BFA_MSGQ_RSPQ_NUM_ENTRY 128
|
||||
#define BFA_MSGQ_RSPQ_SIZE \
|
||||
(BFI_MSGQ_RSP_ENTRY_SIZE * BFA_MSGQ_RSPQ_NUM_ENTRY)
|
||||
|
||||
#define bfa_msgq_cmd_set(_cmd, _cbfn, _cbarg, _msg_size, _msg_hdr) \
|
||||
do { \
|
||||
(_cmd)->cbfn = (_cbfn); \
|
||||
(_cmd)->cbarg = (_cbarg); \
|
||||
(_cmd)->msg_size = (_msg_size); \
|
||||
(_cmd)->msg_hdr = (_msg_hdr); \
|
||||
} while (0)
|
||||
|
||||
struct bfa_msgq;
|
||||
|
||||
typedef void (*bfa_msgq_cmdcbfn_t)(void *cbarg, enum bfa_status status);
|
||||
|
||||
struct bfa_msgq_cmd_entry {
|
||||
struct list_head qe;
|
||||
bfa_msgq_cmdcbfn_t cbfn;
|
||||
void *cbarg;
|
||||
size_t msg_size;
|
||||
struct bfi_msgq_mhdr *msg_hdr;
|
||||
};
|
||||
|
||||
enum bfa_msgq_cmdq_flags {
|
||||
BFA_MSGQ_CMDQ_F_DB_UPDATE = 1,
|
||||
};
|
||||
|
||||
struct bfa_msgq_cmdq {
|
||||
bfa_fsm_t fsm;
|
||||
enum bfa_msgq_cmdq_flags flags;
|
||||
|
||||
u16 producer_index;
|
||||
u16 consumer_index;
|
||||
u16 depth; /* FW Q depth is 16 bits */
|
||||
struct bfa_dma addr;
|
||||
struct bfa_mbox_cmd dbell_mb;
|
||||
|
||||
u16 token;
|
||||
int offset;
|
||||
int bytes_to_copy;
|
||||
struct bfa_mbox_cmd copy_mb;
|
||||
|
||||
struct list_head pending_q; /* pending command queue */
|
||||
|
||||
struct bfa_msgq *msgq;
|
||||
};
|
||||
|
||||
enum bfa_msgq_rspq_flags {
|
||||
BFA_MSGQ_RSPQ_F_DB_UPDATE = 1,
|
||||
};
|
||||
|
||||
typedef void (*bfa_msgq_mcfunc_t)(void *cbarg, struct bfi_msgq_mhdr *mhdr);
|
||||
|
||||
struct bfa_msgq_rspq {
|
||||
bfa_fsm_t fsm;
|
||||
enum bfa_msgq_rspq_flags flags;
|
||||
|
||||
u16 producer_index;
|
||||
u16 consumer_index;
|
||||
u16 depth; /* FW Q depth is 16 bits */
|
||||
struct bfa_dma addr;
|
||||
struct bfa_mbox_cmd dbell_mb;
|
||||
|
||||
int nmclass;
|
||||
struct {
|
||||
bfa_msgq_mcfunc_t cbfn;
|
||||
void *cbarg;
|
||||
} rsphdlr[BFI_MC_MAX];
|
||||
|
||||
struct bfa_msgq *msgq;
|
||||
};
|
||||
|
||||
struct bfa_msgq {
|
||||
struct bfa_msgq_cmdq cmdq;
|
||||
struct bfa_msgq_rspq rspq;
|
||||
|
||||
struct bfa_wc init_wc;
|
||||
struct bfa_mbox_cmd init_mb;
|
||||
|
||||
struct bfa_ioc_notify ioc_notify;
|
||||
struct bfa_ioc *ioc;
|
||||
};
|
||||
|
||||
u32 bfa_msgq_meminfo(void);
|
||||
void bfa_msgq_memclaim(struct bfa_msgq *msgq, u8 *kva, u64 pa);
|
||||
void bfa_msgq_attach(struct bfa_msgq *msgq, struct bfa_ioc *ioc);
|
||||
void bfa_msgq_regisr(struct bfa_msgq *msgq, enum bfi_mclass mc,
|
||||
bfa_msgq_mcfunc_t cbfn, void *cbarg);
|
||||
void bfa_msgq_cmd_post(struct bfa_msgq *msgq,
|
||||
struct bfa_msgq_cmd_entry *cmd);
|
||||
void bfa_msgq_rsp_copy(struct bfa_msgq *msgq, u8 *buf, size_t buf_len);
|
||||
|
||||
#endif
|
570
drivers/net/ethernet/brocade/bna/bfi.h
Normal file
570
drivers/net/ethernet/brocade/bna/bfi.h
Normal file
|
@ -0,0 +1,570 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
#ifndef __BFI_H__
|
||||
#define __BFI_H__
|
||||
|
||||
#include "bfa_defs.h"
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
/* BFI FW image type */
|
||||
#define BFI_FLASH_CHUNK_SZ 256 /*!< Flash chunk size */
|
||||
#define BFI_FLASH_CHUNK_SZ_WORDS (BFI_FLASH_CHUNK_SZ/sizeof(u32))
|
||||
#define BFI_FLASH_IMAGE_SZ 0x100000
|
||||
|
||||
/* Msg header common to all msgs */
|
||||
struct bfi_mhdr {
|
||||
u8 msg_class; /*!< @ref enum bfi_mclass */
|
||||
u8 msg_id; /*!< msg opcode with in the class */
|
||||
union {
|
||||
struct {
|
||||
u8 qid;
|
||||
u8 fn_lpu; /*!< msg destination */
|
||||
} h2i;
|
||||
u16 i2htok; /*!< token in msgs to host */
|
||||
} mtag;
|
||||
};
|
||||
|
||||
#define bfi_fn_lpu(__fn, __lpu) ((__fn) << 1 | (__lpu))
|
||||
#define bfi_mhdr_2_fn(_mh) ((_mh)->mtag.h2i.fn_lpu >> 1)
|
||||
#define bfi_mhdr_2_qid(_mh) ((_mh)->mtag.h2i.qid)
|
||||
|
||||
#define bfi_h2i_set(_mh, _mc, _op, _fn_lpu) do { \
|
||||
(_mh).msg_class = (_mc); \
|
||||
(_mh).msg_id = (_op); \
|
||||
(_mh).mtag.h2i.fn_lpu = (_fn_lpu); \
|
||||
} while (0)
|
||||
|
||||
#define bfi_i2h_set(_mh, _mc, _op, _i2htok) do { \
|
||||
(_mh).msg_class = (_mc); \
|
||||
(_mh).msg_id = (_op); \
|
||||
(_mh).mtag.i2htok = (_i2htok); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Message opcodes: 0-127 to firmware, 128-255 to host
|
||||
*/
|
||||
#define BFI_I2H_OPCODE_BASE 128
|
||||
#define BFA_I2HM(_x) ((_x) + BFI_I2H_OPCODE_BASE)
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Scatter Gather Element and Page definition
|
||||
*
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
/* DMA addresses */
|
||||
union bfi_addr_u {
|
||||
struct {
|
||||
u32 addr_lo;
|
||||
u32 addr_hi;
|
||||
} a32;
|
||||
};
|
||||
|
||||
/* Generic DMA addr-len pair. */
|
||||
struct bfi_alen {
|
||||
union bfi_addr_u al_addr; /* DMA addr of buffer */
|
||||
u32 al_len; /* length of buffer */
|
||||
};
|
||||
|
||||
/*
|
||||
* Large Message structure - 128 Bytes size Msgs
|
||||
*/
|
||||
#define BFI_LMSG_SZ 128
|
||||
#define BFI_LMSG_PL_WSZ \
|
||||
((BFI_LMSG_SZ - sizeof(struct bfi_mhdr)) / 4)
|
||||
|
||||
/* Mailbox message structure */
|
||||
#define BFI_MBMSG_SZ 7
|
||||
struct bfi_mbmsg {
|
||||
struct bfi_mhdr mh;
|
||||
u32 pl[BFI_MBMSG_SZ];
|
||||
};
|
||||
|
||||
/* Supported PCI function class codes (personality) */
|
||||
enum bfi_pcifn_class {
|
||||
BFI_PCIFN_CLASS_FC = 0x0c04,
|
||||
BFI_PCIFN_CLASS_ETH = 0x0200,
|
||||
};
|
||||
|
||||
/* Message Classes */
|
||||
enum bfi_mclass {
|
||||
BFI_MC_IOC = 1, /*!< IO Controller (IOC) */
|
||||
BFI_MC_DIAG = 2, /*!< Diagnostic Msgs */
|
||||
BFI_MC_FLASH = 3, /*!< Flash message class */
|
||||
BFI_MC_CEE = 4, /*!< CEE */
|
||||
BFI_MC_FCPORT = 5, /*!< FC port */
|
||||
BFI_MC_IOCFC = 6, /*!< FC - IO Controller (IOC) */
|
||||
BFI_MC_LL = 7, /*!< Link Layer */
|
||||
BFI_MC_UF = 8, /*!< Unsolicited frame receive */
|
||||
BFI_MC_FCXP = 9, /*!< FC Transport */
|
||||
BFI_MC_LPS = 10, /*!< lport fc login services */
|
||||
BFI_MC_RPORT = 11, /*!< Remote port */
|
||||
BFI_MC_ITNIM = 12, /*!< I-T nexus (Initiator mode) */
|
||||
BFI_MC_IOIM_READ = 13, /*!< read IO (Initiator mode) */
|
||||
BFI_MC_IOIM_WRITE = 14, /*!< write IO (Initiator mode) */
|
||||
BFI_MC_IOIM_IO = 15, /*!< IO (Initiator mode) */
|
||||
BFI_MC_IOIM = 16, /*!< IO (Initiator mode) */
|
||||
BFI_MC_IOIM_IOCOM = 17, /*!< good IO completion */
|
||||
BFI_MC_TSKIM = 18, /*!< Initiator Task management */
|
||||
BFI_MC_SBOOT = 19, /*!< SAN boot services */
|
||||
BFI_MC_IPFC = 20, /*!< IP over FC Msgs */
|
||||
BFI_MC_PORT = 21, /*!< Physical port */
|
||||
BFI_MC_SFP = 22, /*!< SFP module */
|
||||
BFI_MC_MSGQ = 23, /*!< MSGQ */
|
||||
BFI_MC_ENET = 24, /*!< ENET commands/responses */
|
||||
BFI_MC_PHY = 25, /*!< External PHY message class */
|
||||
BFI_MC_NBOOT = 26, /*!< Network Boot */
|
||||
BFI_MC_TIO_READ = 27, /*!< read IO (Target mode) */
|
||||
BFI_MC_TIO_WRITE = 28, /*!< write IO (Target mode) */
|
||||
BFI_MC_TIO_DATA_XFERED = 29, /*!< ds transferred (target mode) */
|
||||
BFI_MC_TIO_IO = 30, /*!< IO (Target mode) */
|
||||
BFI_MC_TIO = 31, /*!< IO (target mode) */
|
||||
BFI_MC_MFG = 32, /*!< MFG/ASIC block commands */
|
||||
BFI_MC_EDMA = 33, /*!< EDMA copy commands */
|
||||
BFI_MC_MAX = 34
|
||||
};
|
||||
|
||||
#define BFI_IOC_MSGLEN_MAX 32 /* 32 bytes */
|
||||
|
||||
#define BFI_FWBOOT_ENV_OS 0
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
* IOC
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* Different asic generations */
|
||||
enum bfi_asic_gen {
|
||||
BFI_ASIC_GEN_CB = 1,
|
||||
BFI_ASIC_GEN_CT = 2,
|
||||
BFI_ASIC_GEN_CT2 = 3,
|
||||
};
|
||||
|
||||
enum bfi_asic_mode {
|
||||
BFI_ASIC_MODE_FC = 1, /* FC upto 8G speed */
|
||||
BFI_ASIC_MODE_FC16 = 2, /* FC upto 16G speed */
|
||||
BFI_ASIC_MODE_ETH = 3, /* Ethernet ports */
|
||||
BFI_ASIC_MODE_COMBO = 4, /* FC 16G and Ethernet 10G port */
|
||||
};
|
||||
|
||||
enum bfi_ioc_h2i_msgs {
|
||||
BFI_IOC_H2I_ENABLE_REQ = 1,
|
||||
BFI_IOC_H2I_DISABLE_REQ = 2,
|
||||
BFI_IOC_H2I_GETATTR_REQ = 3,
|
||||
BFI_IOC_H2I_DBG_SYNC = 4,
|
||||
BFI_IOC_H2I_DBG_DUMP = 5,
|
||||
};
|
||||
|
||||
enum bfi_ioc_i2h_msgs {
|
||||
BFI_IOC_I2H_ENABLE_REPLY = BFA_I2HM(1),
|
||||
BFI_IOC_I2H_DISABLE_REPLY = BFA_I2HM(2),
|
||||
BFI_IOC_I2H_GETATTR_REPLY = BFA_I2HM(3),
|
||||
BFI_IOC_I2H_HBEAT = BFA_I2HM(4),
|
||||
};
|
||||
|
||||
/* BFI_IOC_H2I_GETATTR_REQ message */
|
||||
struct bfi_ioc_getattr_req {
|
||||
struct bfi_mhdr mh;
|
||||
union bfi_addr_u attr_addr;
|
||||
};
|
||||
|
||||
struct bfi_ioc_attr {
|
||||
u64 mfg_pwwn; /*!< Mfg port wwn */
|
||||
u64 mfg_nwwn; /*!< Mfg node wwn */
|
||||
mac_t mfg_mac; /*!< Mfg mac */
|
||||
u8 port_mode; /* enum bfi_port_mode */
|
||||
u8 rsvd_a;
|
||||
u64 pwwn;
|
||||
u64 nwwn;
|
||||
mac_t mac; /*!< PBC or Mfg mac */
|
||||
u16 rsvd_b;
|
||||
mac_t fcoe_mac;
|
||||
u16 rsvd_c;
|
||||
char brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)];
|
||||
u8 pcie_gen;
|
||||
u8 pcie_lanes_orig;
|
||||
u8 pcie_lanes;
|
||||
u8 rx_bbcredit; /*!< receive buffer credits */
|
||||
u32 adapter_prop; /*!< adapter properties */
|
||||
u16 maxfrsize; /*!< max receive frame size */
|
||||
char asic_rev;
|
||||
u8 rsvd_d;
|
||||
char fw_version[BFA_VERSION_LEN];
|
||||
char optrom_version[BFA_VERSION_LEN];
|
||||
struct bfa_mfg_vpd vpd;
|
||||
u32 card_type; /*!< card type */
|
||||
};
|
||||
|
||||
/* BFI_IOC_I2H_GETATTR_REPLY message */
|
||||
struct bfi_ioc_getattr_reply {
|
||||
struct bfi_mhdr mh; /*!< Common msg header */
|
||||
u8 status; /*!< cfg reply status */
|
||||
u8 rsvd[3];
|
||||
};
|
||||
|
||||
/* Firmware memory page offsets */
|
||||
#define BFI_IOC_SMEM_PG0_CB (0x40)
|
||||
#define BFI_IOC_SMEM_PG0_CT (0x180)
|
||||
|
||||
/* Firmware statistic offset */
|
||||
#define BFI_IOC_FWSTATS_OFF (0x6B40)
|
||||
#define BFI_IOC_FWSTATS_SZ (4096)
|
||||
|
||||
/* Firmware trace offset */
|
||||
#define BFI_IOC_TRC_OFF (0x4b00)
|
||||
#define BFI_IOC_TRC_ENTS 256
|
||||
#define BFI_IOC_TRC_ENT_SZ 16
|
||||
#define BFI_IOC_TRC_HDR_SZ 32
|
||||
|
||||
#define BFI_IOC_FW_SIGNATURE (0xbfadbfad)
|
||||
#define BFI_IOC_FW_INV_SIGN (0xdeaddead)
|
||||
#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 {
|
||||
u32 signature; /*!< constant signature */
|
||||
u8 asic_gen; /*!< asic generation */
|
||||
u8 asic_mode;
|
||||
u8 port0_mode; /*!< device mode for port 0 */
|
||||
u8 port1_mode; /*!< device mode for port 1 */
|
||||
u32 exec; /*!< exec vector */
|
||||
u32 bootenv; /*!< firmware boot env */
|
||||
u32 rsvd_b[2];
|
||||
struct bfi_ioc_fwver fwver;
|
||||
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_TYPE_OFF 8
|
||||
#define BFI_FWBOOT_ENV_OFF 12
|
||||
#define BFI_FWBOOT_DEVMODE(__asic_gen, __asic_mode, __p0_mode, __p1_mode) \
|
||||
(((u32)(__asic_gen)) << 24 | \
|
||||
((u32)(__asic_mode)) << 16 | \
|
||||
((u32)(__p0_mode)) << 8 | \
|
||||
((u32)(__p1_mode)))
|
||||
|
||||
enum bfi_fwboot_type {
|
||||
BFI_FWBOOT_TYPE_NORMAL = 0,
|
||||
BFI_FWBOOT_TYPE_FLASH = 1,
|
||||
BFI_FWBOOT_TYPE_MEMTEST = 2,
|
||||
};
|
||||
|
||||
enum bfi_port_mode {
|
||||
BFI_PORT_MODE_FC = 1,
|
||||
BFI_PORT_MODE_ETH = 2,
|
||||
};
|
||||
|
||||
struct bfi_ioc_hbeat {
|
||||
struct bfi_mhdr mh; /*!< common msg header */
|
||||
u32 hb_count; /*!< current heart beat count */
|
||||
};
|
||||
|
||||
/* IOC hardware/firmware state */
|
||||
enum bfi_ioc_state {
|
||||
BFI_IOC_UNINIT = 0, /*!< not initialized */
|
||||
BFI_IOC_INITING = 1, /*!< h/w is being initialized */
|
||||
BFI_IOC_HWINIT = 2, /*!< h/w is initialized */
|
||||
BFI_IOC_CFG = 3, /*!< IOC configuration in progress */
|
||||
BFI_IOC_OP = 4, /*!< IOC is operational */
|
||||
BFI_IOC_DISABLING = 5, /*!< IOC is being disabled */
|
||||
BFI_IOC_DISABLED = 6, /*!< IOC is disabled */
|
||||
BFI_IOC_CFG_DISABLED = 7, /*!< IOC is being disabled;transient */
|
||||
BFI_IOC_FAIL = 8, /*!< IOC heart-beat failure */
|
||||
BFI_IOC_MEMTEST = 9, /*!< IOC is doing memtest */
|
||||
};
|
||||
|
||||
#define BFI_IOC_ENDIAN_SIG 0x12345678
|
||||
|
||||
enum {
|
||||
BFI_ADAPTER_TYPE_FC = 0x01, /*!< FC adapters */
|
||||
BFI_ADAPTER_TYPE_MK = 0x0f0000, /*!< adapter type mask */
|
||||
BFI_ADAPTER_TYPE_SH = 16, /*!< adapter type shift */
|
||||
BFI_ADAPTER_NPORTS_MK = 0xff00, /*!< number of ports mask */
|
||||
BFI_ADAPTER_NPORTS_SH = 8, /*!< number of ports shift */
|
||||
BFI_ADAPTER_SPEED_MK = 0xff, /*!< adapter speed mask */
|
||||
BFI_ADAPTER_SPEED_SH = 0, /*!< adapter speed shift */
|
||||
BFI_ADAPTER_PROTO = 0x100000, /*!< prototype adapaters */
|
||||
BFI_ADAPTER_TTV = 0x200000, /*!< TTV debug capable */
|
||||
BFI_ADAPTER_UNSUPP = 0x400000, /*!< unknown adapter type */
|
||||
};
|
||||
|
||||
#define BFI_ADAPTER_GETP(__prop, __adap_prop) \
|
||||
(((__adap_prop) & BFI_ADAPTER_ ## __prop ## _MK) >> \
|
||||
BFI_ADAPTER_ ## __prop ## _SH)
|
||||
#define BFI_ADAPTER_SETP(__prop, __val) \
|
||||
((__val) << BFI_ADAPTER_ ## __prop ## _SH)
|
||||
#define BFI_ADAPTER_IS_PROTO(__adap_type) \
|
||||
((__adap_type) & BFI_ADAPTER_PROTO)
|
||||
#define BFI_ADAPTER_IS_TTV(__adap_type) \
|
||||
((__adap_type) & BFI_ADAPTER_TTV)
|
||||
#define BFI_ADAPTER_IS_UNSUPP(__adap_type) \
|
||||
((__adap_type) & BFI_ADAPTER_UNSUPP)
|
||||
#define BFI_ADAPTER_IS_SPECIAL(__adap_type) \
|
||||
((__adap_type) & (BFI_ADAPTER_TTV | BFI_ADAPTER_PROTO | \
|
||||
BFI_ADAPTER_UNSUPP))
|
||||
|
||||
/* BFI_IOC_H2I_ENABLE_REQ & BFI_IOC_H2I_DISABLE_REQ messages */
|
||||
struct bfi_ioc_ctrl_req {
|
||||
struct bfi_mhdr mh;
|
||||
u16 clscode;
|
||||
u16 rsvd;
|
||||
u32 tv_sec;
|
||||
};
|
||||
|
||||
/* BFI_IOC_I2H_ENABLE_REPLY & BFI_IOC_I2H_DISABLE_REPLY messages */
|
||||
struct bfi_ioc_ctrl_reply {
|
||||
struct bfi_mhdr mh; /*!< Common msg header */
|
||||
u8 status; /*!< enable/disable status */
|
||||
u8 port_mode; /*!< enum bfa_mode */
|
||||
u8 cap_bm; /*!< capability bit mask */
|
||||
u8 rsvd;
|
||||
};
|
||||
|
||||
#define BFI_IOC_MSGSZ 8
|
||||
/* H2I Messages */
|
||||
union bfi_ioc_h2i_msg_u {
|
||||
struct bfi_mhdr mh;
|
||||
struct bfi_ioc_ctrl_req enable_req;
|
||||
struct bfi_ioc_ctrl_req disable_req;
|
||||
struct bfi_ioc_getattr_req getattr_req;
|
||||
u32 mboxmsg[BFI_IOC_MSGSZ];
|
||||
};
|
||||
|
||||
/* I2H Messages */
|
||||
union bfi_ioc_i2h_msg_u {
|
||||
struct bfi_mhdr mh;
|
||||
struct bfi_ioc_ctrl_reply fw_event;
|
||||
u32 mboxmsg[BFI_IOC_MSGSZ];
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
* MSGQ
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
enum bfi_msgq_h2i_msgs {
|
||||
BFI_MSGQ_H2I_INIT_REQ = 1,
|
||||
BFI_MSGQ_H2I_DOORBELL_PI = 2,
|
||||
BFI_MSGQ_H2I_DOORBELL_CI = 3,
|
||||
BFI_MSGQ_H2I_CMDQ_COPY_RSP = 4,
|
||||
};
|
||||
|
||||
enum bfi_msgq_i2h_msgs {
|
||||
BFI_MSGQ_I2H_INIT_RSP = BFA_I2HM(BFI_MSGQ_H2I_INIT_REQ),
|
||||
BFI_MSGQ_I2H_DOORBELL_PI = BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_PI),
|
||||
BFI_MSGQ_I2H_DOORBELL_CI = BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_CI),
|
||||
BFI_MSGQ_I2H_CMDQ_COPY_REQ = BFA_I2HM(BFI_MSGQ_H2I_CMDQ_COPY_RSP),
|
||||
};
|
||||
|
||||
/* Messages(commands/responsed/AENS will have the following header */
|
||||
struct bfi_msgq_mhdr {
|
||||
u8 msg_class;
|
||||
u8 msg_id;
|
||||
u16 msg_token;
|
||||
u16 num_entries;
|
||||
u8 enet_id;
|
||||
u8 rsvd[1];
|
||||
};
|
||||
|
||||
#define bfi_msgq_mhdr_set(_mh, _mc, _mid, _tok, _enet_id) do { \
|
||||
(_mh).msg_class = (_mc); \
|
||||
(_mh).msg_id = (_mid); \
|
||||
(_mh).msg_token = (_tok); \
|
||||
(_mh).enet_id = (_enet_id); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Mailbox for messaging interface
|
||||
*/
|
||||
#define BFI_MSGQ_CMD_ENTRY_SIZE (64) /* TBD */
|
||||
#define BFI_MSGQ_RSP_ENTRY_SIZE (64) /* TBD */
|
||||
|
||||
#define bfi_msgq_num_cmd_entries(_size) \
|
||||
(((_size) + BFI_MSGQ_CMD_ENTRY_SIZE - 1) / BFI_MSGQ_CMD_ENTRY_SIZE)
|
||||
|
||||
struct bfi_msgq {
|
||||
union bfi_addr_u addr;
|
||||
u16 q_depth; /* Total num of entries in the queue */
|
||||
u8 rsvd[2];
|
||||
};
|
||||
|
||||
/* BFI_ENET_MSGQ_CFG_REQ TBD init or cfg? */
|
||||
struct bfi_msgq_cfg_req {
|
||||
struct bfi_mhdr mh;
|
||||
struct bfi_msgq cmdq;
|
||||
struct bfi_msgq rspq;
|
||||
};
|
||||
|
||||
/* BFI_ENET_MSGQ_CFG_RSP */
|
||||
struct bfi_msgq_cfg_rsp {
|
||||
struct bfi_mhdr mh;
|
||||
u8 cmd_status;
|
||||
u8 rsvd[3];
|
||||
};
|
||||
|
||||
/* BFI_MSGQ_H2I_DOORBELL */
|
||||
struct bfi_msgq_h2i_db {
|
||||
struct bfi_mhdr mh;
|
||||
union {
|
||||
u16 cmdq_pi;
|
||||
u16 rspq_ci;
|
||||
} idx;
|
||||
};
|
||||
|
||||
/* BFI_MSGQ_I2H_DOORBELL */
|
||||
struct bfi_msgq_i2h_db {
|
||||
struct bfi_mhdr mh;
|
||||
union {
|
||||
u16 rspq_pi;
|
||||
u16 cmdq_ci;
|
||||
} idx;
|
||||
};
|
||||
|
||||
#define BFI_CMD_COPY_SZ 28
|
||||
|
||||
/* BFI_MSGQ_H2I_CMD_COPY_RSP */
|
||||
struct bfi_msgq_h2i_cmdq_copy_rsp {
|
||||
struct bfi_mhdr mh;
|
||||
u8 data[BFI_CMD_COPY_SZ];
|
||||
};
|
||||
|
||||
/* BFI_MSGQ_I2H_CMD_COPY_REQ */
|
||||
struct bfi_msgq_i2h_cmdq_copy_req {
|
||||
struct bfi_mhdr mh;
|
||||
u16 offset;
|
||||
u16 len;
|
||||
};
|
||||
|
||||
/*
|
||||
* FLASH module specific
|
||||
*/
|
||||
enum bfi_flash_h2i_msgs {
|
||||
BFI_FLASH_H2I_QUERY_REQ = 1,
|
||||
BFI_FLASH_H2I_ERASE_REQ = 2,
|
||||
BFI_FLASH_H2I_WRITE_REQ = 3,
|
||||
BFI_FLASH_H2I_READ_REQ = 4,
|
||||
BFI_FLASH_H2I_BOOT_VER_REQ = 5,
|
||||
};
|
||||
|
||||
enum bfi_flash_i2h_msgs {
|
||||
BFI_FLASH_I2H_QUERY_RSP = BFA_I2HM(1),
|
||||
BFI_FLASH_I2H_ERASE_RSP = BFA_I2HM(2),
|
||||
BFI_FLASH_I2H_WRITE_RSP = BFA_I2HM(3),
|
||||
BFI_FLASH_I2H_READ_RSP = BFA_I2HM(4),
|
||||
BFI_FLASH_I2H_BOOT_VER_RSP = BFA_I2HM(5),
|
||||
BFI_FLASH_I2H_EVENT = BFA_I2HM(127),
|
||||
};
|
||||
|
||||
/*
|
||||
* Flash query request
|
||||
*/
|
||||
struct bfi_flash_query_req {
|
||||
struct bfi_mhdr mh; /* Common msg header */
|
||||
struct bfi_alen alen;
|
||||
};
|
||||
|
||||
/*
|
||||
* Flash write request
|
||||
*/
|
||||
struct bfi_flash_write_req {
|
||||
struct bfi_mhdr mh; /* Common msg header */
|
||||
struct bfi_alen alen;
|
||||
u32 type; /* partition type */
|
||||
u8 instance; /* partition instance */
|
||||
u8 last;
|
||||
u8 rsv[2];
|
||||
u32 offset;
|
||||
u32 length;
|
||||
};
|
||||
|
||||
/*
|
||||
* Flash read request
|
||||
*/
|
||||
struct bfi_flash_read_req {
|
||||
struct bfi_mhdr mh; /* Common msg header */
|
||||
u32 type; /* partition type */
|
||||
u8 instance; /* partition instance */
|
||||
u8 rsv[3];
|
||||
u32 offset;
|
||||
u32 length;
|
||||
struct bfi_alen alen;
|
||||
};
|
||||
|
||||
/*
|
||||
* Flash query response
|
||||
*/
|
||||
struct bfi_flash_query_rsp {
|
||||
struct bfi_mhdr mh; /* Common msg header */
|
||||
u32 status;
|
||||
};
|
||||
|
||||
/*
|
||||
* Flash read response
|
||||
*/
|
||||
struct bfi_flash_read_rsp {
|
||||
struct bfi_mhdr mh; /* Common msg header */
|
||||
u32 type; /* partition type */
|
||||
u8 instance; /* partition instance */
|
||||
u8 rsv[3];
|
||||
u32 status;
|
||||
u32 length;
|
||||
};
|
||||
|
||||
/*
|
||||
* Flash write response
|
||||
*/
|
||||
struct bfi_flash_write_rsp {
|
||||
struct bfi_mhdr mh; /* Common msg header */
|
||||
u32 type; /* partition type */
|
||||
u8 instance; /* partition instance */
|
||||
u8 rsv[3];
|
||||
u32 status;
|
||||
u32 length;
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif /* __BFI_H__ */
|
163
drivers/net/ethernet/brocade/bna/bfi_cna.h
Normal file
163
drivers/net/ethernet/brocade/bna/bfi_cna.h
Normal file
|
@ -0,0 +1,163 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
#ifndef __BFI_CNA_H__
|
||||
#define __BFI_CNA_H__
|
||||
|
||||
#include "bfi.h"
|
||||
#include "bfa_defs_cna.h"
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
enum bfi_port_h2i {
|
||||
BFI_PORT_H2I_ENABLE_REQ = (1),
|
||||
BFI_PORT_H2I_DISABLE_REQ = (2),
|
||||
BFI_PORT_H2I_GET_STATS_REQ = (3),
|
||||
BFI_PORT_H2I_CLEAR_STATS_REQ = (4),
|
||||
};
|
||||
|
||||
enum bfi_port_i2h {
|
||||
BFI_PORT_I2H_ENABLE_RSP = BFA_I2HM(1),
|
||||
BFI_PORT_I2H_DISABLE_RSP = BFA_I2HM(2),
|
||||
BFI_PORT_I2H_GET_STATS_RSP = BFA_I2HM(3),
|
||||
BFI_PORT_I2H_CLEAR_STATS_RSP = BFA_I2HM(4),
|
||||
};
|
||||
|
||||
/* Generic REQ type */
|
||||
struct bfi_port_generic_req {
|
||||
struct bfi_mhdr mh; /*!< msg header */
|
||||
u32 msgtag; /*!< msgtag for reply */
|
||||
u32 rsvd;
|
||||
};
|
||||
|
||||
/* Generic RSP type */
|
||||
struct bfi_port_generic_rsp {
|
||||
struct bfi_mhdr mh; /*!< common msg header */
|
||||
u8 status; /*!< port enable status */
|
||||
u8 rsvd[3];
|
||||
u32 msgtag; /*!< msgtag for reply */
|
||||
};
|
||||
|
||||
/* BFI_PORT_H2I_GET_STATS_REQ */
|
||||
struct bfi_port_get_stats_req {
|
||||
struct bfi_mhdr mh; /*!< common msg header */
|
||||
union bfi_addr_u dma_addr;
|
||||
};
|
||||
|
||||
union bfi_port_h2i_msg_u {
|
||||
struct bfi_mhdr mh;
|
||||
struct bfi_port_generic_req enable_req;
|
||||
struct bfi_port_generic_req disable_req;
|
||||
struct bfi_port_get_stats_req getstats_req;
|
||||
struct bfi_port_generic_req clearstats_req;
|
||||
};
|
||||
|
||||
union bfi_port_i2h_msg_u {
|
||||
struct bfi_mhdr mh;
|
||||
struct bfi_port_generic_rsp enable_rsp;
|
||||
struct bfi_port_generic_rsp disable_rsp;
|
||||
struct bfi_port_generic_rsp getstats_rsp;
|
||||
struct bfi_port_generic_rsp clearstats_rsp;
|
||||
};
|
||||
|
||||
/* @brief Mailbox commands from host to (DCBX/LLDP) firmware */
|
||||
enum bfi_cee_h2i_msgs {
|
||||
BFI_CEE_H2I_GET_CFG_REQ = 1,
|
||||
BFI_CEE_H2I_RESET_STATS = 2,
|
||||
BFI_CEE_H2I_GET_STATS_REQ = 3,
|
||||
};
|
||||
|
||||
/* @brief Mailbox reply and AEN messages from DCBX/LLDP firmware to host */
|
||||
enum bfi_cee_i2h_msgs {
|
||||
BFI_CEE_I2H_GET_CFG_RSP = BFA_I2HM(1),
|
||||
BFI_CEE_I2H_RESET_STATS_RSP = BFA_I2HM(2),
|
||||
BFI_CEE_I2H_GET_STATS_RSP = BFA_I2HM(3),
|
||||
};
|
||||
|
||||
/* Data structures */
|
||||
|
||||
/*
|
||||
* @brief H2I command structure for resetting the stats.
|
||||
* BFI_CEE_H2I_RESET_STATS
|
||||
*/
|
||||
struct bfi_lldp_reset_stats {
|
||||
struct bfi_mhdr mh;
|
||||
};
|
||||
|
||||
/*
|
||||
* @brief H2I command structure for resetting the stats.
|
||||
* BFI_CEE_H2I_RESET_STATS
|
||||
*/
|
||||
struct bfi_cee_reset_stats {
|
||||
struct bfi_mhdr mh;
|
||||
};
|
||||
|
||||
/*
|
||||
* @brief get configuration command from host
|
||||
* BFI_CEE_H2I_GET_CFG_REQ
|
||||
*/
|
||||
struct bfi_cee_get_req {
|
||||
struct bfi_mhdr mh;
|
||||
union bfi_addr_u dma_addr;
|
||||
};
|
||||
|
||||
/*
|
||||
* @brief reply message from firmware
|
||||
* BFI_CEE_I2H_GET_CFG_RSP
|
||||
*/
|
||||
struct bfi_cee_get_rsp {
|
||||
struct bfi_mhdr mh;
|
||||
u8 cmd_status;
|
||||
u8 rsvd[3];
|
||||
};
|
||||
|
||||
/*
|
||||
* @brief get configuration command from host
|
||||
* BFI_CEE_H2I_GET_STATS_REQ
|
||||
*/
|
||||
struct bfi_cee_stats_req {
|
||||
struct bfi_mhdr mh;
|
||||
union bfi_addr_u dma_addr;
|
||||
};
|
||||
|
||||
/*
|
||||
* @brief reply message from firmware
|
||||
* BFI_CEE_I2H_GET_STATS_RSP
|
||||
*/
|
||||
struct bfi_cee_stats_rsp {
|
||||
struct bfi_mhdr mh;
|
||||
u8 cmd_status;
|
||||
u8 rsvd[3];
|
||||
};
|
||||
|
||||
/* @brief mailbox command structures from host to firmware */
|
||||
union bfi_cee_h2i_msg_u {
|
||||
struct bfi_mhdr mh;
|
||||
struct bfi_cee_get_req get_req;
|
||||
struct bfi_cee_stats_req stats_req;
|
||||
};
|
||||
|
||||
/* @brief mailbox message structures from firmware to host */
|
||||
union bfi_cee_i2h_msg_u {
|
||||
struct bfi_mhdr mh;
|
||||
struct bfi_cee_get_rsp get_rsp;
|
||||
struct bfi_cee_stats_rsp stats_rsp;
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif /* __BFI_CNA_H__ */
|
858
drivers/net/ethernet/brocade/bna/bfi_enet.h
Normal file
858
drivers/net/ethernet/brocade/bna/bfi_enet.h
Normal file
|
@ -0,0 +1,858 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
/* BNA Hardware and Firmware Interface */
|
||||
|
||||
/* Skipping statistics collection to avoid clutter.
|
||||
* Command is no longer needed:
|
||||
* MTU
|
||||
* TxQ Stop
|
||||
* RxQ Stop
|
||||
* RxF Enable/Disable
|
||||
*
|
||||
* HDS-off request is dynamic
|
||||
* keep structures as multiple of 32-bit fields for alignment.
|
||||
* All values must be written in big-endian.
|
||||
*/
|
||||
#ifndef __BFI_ENET_H__
|
||||
#define __BFI_ENET_H__
|
||||
|
||||
#include "bfa_defs.h"
|
||||
#include "bfi.h"
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
#define BFI_ENET_CFG_MAX 32 /* Max resources per PF */
|
||||
|
||||
#define BFI_ENET_TXQ_PRIO_MAX 8
|
||||
#define BFI_ENET_RX_QSET_MAX 16
|
||||
#define BFI_ENET_TXQ_WI_VECT_MAX 4
|
||||
|
||||
#define BFI_ENET_VLAN_ID_MAX 4096
|
||||
#define BFI_ENET_VLAN_BLOCK_SIZE 512 /* in bits */
|
||||
#define BFI_ENET_VLAN_BLOCKS_MAX \
|
||||
(BFI_ENET_VLAN_ID_MAX / BFI_ENET_VLAN_BLOCK_SIZE)
|
||||
#define BFI_ENET_VLAN_WORD_SIZE 32 /* in bits */
|
||||
#define BFI_ENET_VLAN_WORDS_MAX \
|
||||
(BFI_ENET_VLAN_BLOCK_SIZE / BFI_ENET_VLAN_WORD_SIZE)
|
||||
|
||||
#define BFI_ENET_RSS_RIT_MAX 64 /* entries */
|
||||
#define BFI_ENET_RSS_KEY_LEN 10 /* 32-bit words */
|
||||
|
||||
union bfi_addr_be_u {
|
||||
struct {
|
||||
u32 addr_hi; /* Most Significant 32-bits */
|
||||
u32 addr_lo; /* Least Significant 32-Bits */
|
||||
} a32;
|
||||
};
|
||||
|
||||
/* T X Q U E U E D E F I N E S */
|
||||
/* TxQ Vector (a.k.a. Tx-Buffer Descriptor) */
|
||||
/* TxQ Entry Opcodes */
|
||||
#define BFI_ENET_TXQ_WI_SEND (0x402) /* Single Frame Transmission */
|
||||
#define BFI_ENET_TXQ_WI_SEND_LSO (0x403) /* Multi-Frame Transmission */
|
||||
#define BFI_ENET_TXQ_WI_EXTENSION (0x104) /* Extension WI */
|
||||
|
||||
/* TxQ Entry Control Flags */
|
||||
#define BFI_ENET_TXQ_WI_CF_FCOE_CRC (1 << 8)
|
||||
#define BFI_ENET_TXQ_WI_CF_IPID_MODE (1 << 5)
|
||||
#define BFI_ENET_TXQ_WI_CF_INS_PRIO (1 << 4)
|
||||
#define BFI_ENET_TXQ_WI_CF_INS_VLAN (1 << 3)
|
||||
#define BFI_ENET_TXQ_WI_CF_UDP_CKSUM (1 << 2)
|
||||
#define BFI_ENET_TXQ_WI_CF_TCP_CKSUM (1 << 1)
|
||||
#define BFI_ENET_TXQ_WI_CF_IP_CKSUM (1 << 0)
|
||||
|
||||
struct bfi_enet_txq_wi_base {
|
||||
u8 reserved;
|
||||
u8 num_vectors; /* number of vectors present */
|
||||
u16 opcode;
|
||||
/* BFI_ENET_TXQ_WI_SEND or BFI_ENET_TXQ_WI_SEND_LSO */
|
||||
u16 flags; /* OR of all the flags */
|
||||
u16 l4_hdr_size_n_offset;
|
||||
u16 vlan_tag;
|
||||
u16 lso_mss; /* Only 14 LSB are valid */
|
||||
u32 frame_length; /* Only 24 LSB are valid */
|
||||
};
|
||||
|
||||
struct bfi_enet_txq_wi_ext {
|
||||
u16 reserved;
|
||||
u16 opcode; /* BFI_ENET_TXQ_WI_EXTENSION */
|
||||
u32 reserved2[3];
|
||||
};
|
||||
|
||||
struct bfi_enet_txq_wi_vector { /* Tx Buffer Descriptor */
|
||||
u16 reserved;
|
||||
u16 length; /* Only 14 LSB are valid */
|
||||
union bfi_addr_be_u addr;
|
||||
};
|
||||
|
||||
/* TxQ Entry Structure */
|
||||
struct bfi_enet_txq_entry {
|
||||
union {
|
||||
struct bfi_enet_txq_wi_base base;
|
||||
struct bfi_enet_txq_wi_ext ext;
|
||||
} wi;
|
||||
struct bfi_enet_txq_wi_vector vector[BFI_ENET_TXQ_WI_VECT_MAX];
|
||||
};
|
||||
|
||||
#define wi_hdr wi.base
|
||||
#define wi_ext_hdr wi.ext
|
||||
|
||||
#define BFI_ENET_TXQ_WI_L4_HDR_N_OFFSET(_hdr_size, _offset) \
|
||||
(((_hdr_size) << 10) | ((_offset) & 0x3FF))
|
||||
|
||||
/* R X Q U E U E D E F I N E S */
|
||||
struct bfi_enet_rxq_entry {
|
||||
union bfi_addr_be_u rx_buffer;
|
||||
};
|
||||
|
||||
/* R X C O M P L E T I O N Q U E U E D E F I N E S */
|
||||
/* CQ Entry Flags */
|
||||
#define BFI_ENET_CQ_EF_MAC_ERROR (1 << 0)
|
||||
#define BFI_ENET_CQ_EF_FCS_ERROR (1 << 1)
|
||||
#define BFI_ENET_CQ_EF_TOO_LONG (1 << 2)
|
||||
#define BFI_ENET_CQ_EF_FC_CRC_OK (1 << 3)
|
||||
|
||||
#define BFI_ENET_CQ_EF_RSVD1 (1 << 4)
|
||||
#define BFI_ENET_CQ_EF_L4_CKSUM_OK (1 << 5)
|
||||
#define BFI_ENET_CQ_EF_L3_CKSUM_OK (1 << 6)
|
||||
#define BFI_ENET_CQ_EF_HDS_HEADER (1 << 7)
|
||||
|
||||
#define BFI_ENET_CQ_EF_UDP (1 << 8)
|
||||
#define BFI_ENET_CQ_EF_TCP (1 << 9)
|
||||
#define BFI_ENET_CQ_EF_IP_OPTIONS (1 << 10)
|
||||
#define BFI_ENET_CQ_EF_IPV6 (1 << 11)
|
||||
|
||||
#define BFI_ENET_CQ_EF_IPV4 (1 << 12)
|
||||
#define BFI_ENET_CQ_EF_VLAN (1 << 13)
|
||||
#define BFI_ENET_CQ_EF_RSS (1 << 14)
|
||||
#define BFI_ENET_CQ_EF_RSVD2 (1 << 15)
|
||||
|
||||
#define BFI_ENET_CQ_EF_MCAST_MATCH (1 << 16)
|
||||
#define BFI_ENET_CQ_EF_MCAST (1 << 17)
|
||||
#define BFI_ENET_CQ_EF_BCAST (1 << 18)
|
||||
#define BFI_ENET_CQ_EF_REMOTE (1 << 19)
|
||||
|
||||
#define BFI_ENET_CQ_EF_LOCAL (1 << 20)
|
||||
|
||||
/* CQ Entry Structure */
|
||||
struct bfi_enet_cq_entry {
|
||||
u32 flags;
|
||||
u16 vlan_tag;
|
||||
u16 length;
|
||||
u32 rss_hash;
|
||||
u8 valid;
|
||||
u8 reserved1;
|
||||
u8 reserved2;
|
||||
u8 rxq_id;
|
||||
};
|
||||
|
||||
/* E N E T C O N T R O L P A T H C O M M A N D S */
|
||||
struct bfi_enet_q {
|
||||
union bfi_addr_u pg_tbl;
|
||||
union bfi_addr_u first_entry;
|
||||
u16 pages; /* # of pages */
|
||||
u16 page_sz;
|
||||
};
|
||||
|
||||
struct bfi_enet_txq {
|
||||
struct bfi_enet_q q;
|
||||
u8 priority;
|
||||
u8 rsvd[3];
|
||||
};
|
||||
|
||||
struct bfi_enet_rxq {
|
||||
struct bfi_enet_q q;
|
||||
u16 rx_buffer_size;
|
||||
u16 rsvd;
|
||||
};
|
||||
|
||||
struct bfi_enet_cq {
|
||||
struct bfi_enet_q q;
|
||||
};
|
||||
|
||||
struct bfi_enet_ib_cfg {
|
||||
u8 int_pkt_dma;
|
||||
u8 int_enabled;
|
||||
u8 int_pkt_enabled;
|
||||
u8 continuous_coalescing;
|
||||
u8 msix;
|
||||
u8 rsvd[3];
|
||||
u32 coalescing_timeout;
|
||||
u32 inter_pkt_timeout;
|
||||
u8 inter_pkt_count;
|
||||
u8 rsvd1[3];
|
||||
};
|
||||
|
||||
struct bfi_enet_ib {
|
||||
union bfi_addr_u index_addr;
|
||||
union {
|
||||
u16 msix_index;
|
||||
u16 intx_bitmask;
|
||||
} intr;
|
||||
u16 rsvd;
|
||||
};
|
||||
|
||||
/* ENET command messages */
|
||||
enum bfi_enet_h2i_msgs {
|
||||
/* Rx Commands */
|
||||
BFI_ENET_H2I_RX_CFG_SET_REQ = 1,
|
||||
BFI_ENET_H2I_RX_CFG_CLR_REQ = 2,
|
||||
|
||||
BFI_ENET_H2I_RIT_CFG_REQ = 3,
|
||||
BFI_ENET_H2I_RSS_CFG_REQ = 4,
|
||||
BFI_ENET_H2I_RSS_ENABLE_REQ = 5,
|
||||
BFI_ENET_H2I_RX_PROMISCUOUS_REQ = 6,
|
||||
BFI_ENET_H2I_RX_DEFAULT_REQ = 7,
|
||||
|
||||
BFI_ENET_H2I_MAC_UCAST_SET_REQ = 8,
|
||||
BFI_ENET_H2I_MAC_UCAST_CLR_REQ = 9,
|
||||
BFI_ENET_H2I_MAC_UCAST_ADD_REQ = 10,
|
||||
BFI_ENET_H2I_MAC_UCAST_DEL_REQ = 11,
|
||||
|
||||
BFI_ENET_H2I_MAC_MCAST_ADD_REQ = 12,
|
||||
BFI_ENET_H2I_MAC_MCAST_DEL_REQ = 13,
|
||||
BFI_ENET_H2I_MAC_MCAST_FILTER_REQ = 14,
|
||||
|
||||
BFI_ENET_H2I_RX_VLAN_SET_REQ = 15,
|
||||
BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ = 16,
|
||||
|
||||
/* Tx Commands */
|
||||
BFI_ENET_H2I_TX_CFG_SET_REQ = 17,
|
||||
BFI_ENET_H2I_TX_CFG_CLR_REQ = 18,
|
||||
|
||||
/* Port Commands */
|
||||
BFI_ENET_H2I_PORT_ADMIN_UP_REQ = 19,
|
||||
BFI_ENET_H2I_SET_PAUSE_REQ = 20,
|
||||
BFI_ENET_H2I_DIAG_LOOPBACK_REQ = 21,
|
||||
|
||||
/* Get Attributes Command */
|
||||
BFI_ENET_H2I_GET_ATTR_REQ = 22,
|
||||
|
||||
/* Statistics Commands */
|
||||
BFI_ENET_H2I_STATS_GET_REQ = 23,
|
||||
BFI_ENET_H2I_STATS_CLR_REQ = 24,
|
||||
|
||||
BFI_ENET_H2I_WOL_MAGIC_REQ = 25,
|
||||
BFI_ENET_H2I_WOL_FRAME_REQ = 26,
|
||||
|
||||
BFI_ENET_H2I_MAX = 27,
|
||||
};
|
||||
|
||||
enum bfi_enet_i2h_msgs {
|
||||
/* Rx Responses */
|
||||
BFI_ENET_I2H_RX_CFG_SET_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_RX_CFG_SET_REQ),
|
||||
BFI_ENET_I2H_RX_CFG_CLR_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_RX_CFG_CLR_REQ),
|
||||
|
||||
BFI_ENET_I2H_RIT_CFG_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_RIT_CFG_REQ),
|
||||
BFI_ENET_I2H_RSS_CFG_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_RSS_CFG_REQ),
|
||||
BFI_ENET_I2H_RSS_ENABLE_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_RSS_ENABLE_REQ),
|
||||
BFI_ENET_I2H_RX_PROMISCUOUS_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_RX_PROMISCUOUS_REQ),
|
||||
BFI_ENET_I2H_RX_DEFAULT_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_RX_DEFAULT_REQ),
|
||||
|
||||
BFI_ENET_I2H_MAC_UCAST_SET_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_SET_REQ),
|
||||
BFI_ENET_I2H_MAC_UCAST_CLR_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_CLR_REQ),
|
||||
BFI_ENET_I2H_MAC_UCAST_ADD_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_ADD_REQ),
|
||||
BFI_ENET_I2H_MAC_UCAST_DEL_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_DEL_REQ),
|
||||
|
||||
BFI_ENET_I2H_MAC_MCAST_ADD_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_ADD_REQ),
|
||||
BFI_ENET_I2H_MAC_MCAST_DEL_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_DEL_REQ),
|
||||
BFI_ENET_I2H_MAC_MCAST_FILTER_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_FILTER_REQ),
|
||||
|
||||
BFI_ENET_I2H_RX_VLAN_SET_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_RX_VLAN_SET_REQ),
|
||||
|
||||
BFI_ENET_I2H_RX_VLAN_STRIP_ENABLE_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ),
|
||||
|
||||
/* Tx Responses */
|
||||
BFI_ENET_I2H_TX_CFG_SET_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_TX_CFG_SET_REQ),
|
||||
BFI_ENET_I2H_TX_CFG_CLR_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_TX_CFG_CLR_REQ),
|
||||
|
||||
/* Port Responses */
|
||||
BFI_ENET_I2H_PORT_ADMIN_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_PORT_ADMIN_UP_REQ),
|
||||
|
||||
BFI_ENET_I2H_SET_PAUSE_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_SET_PAUSE_REQ),
|
||||
BFI_ENET_I2H_DIAG_LOOPBACK_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_DIAG_LOOPBACK_REQ),
|
||||
|
||||
/* Attributes Response */
|
||||
BFI_ENET_I2H_GET_ATTR_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_GET_ATTR_REQ),
|
||||
|
||||
/* Statistics Responses */
|
||||
BFI_ENET_I2H_STATS_GET_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_STATS_GET_REQ),
|
||||
BFI_ENET_I2H_STATS_CLR_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_STATS_CLR_REQ),
|
||||
|
||||
BFI_ENET_I2H_WOL_MAGIC_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_WOL_MAGIC_REQ),
|
||||
BFI_ENET_I2H_WOL_FRAME_RSP =
|
||||
BFA_I2HM(BFI_ENET_H2I_WOL_FRAME_REQ),
|
||||
|
||||
/* AENs */
|
||||
BFI_ENET_I2H_LINK_DOWN_AEN = BFA_I2HM(BFI_ENET_H2I_MAX),
|
||||
BFI_ENET_I2H_LINK_UP_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 1),
|
||||
|
||||
BFI_ENET_I2H_PORT_ENABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 2),
|
||||
BFI_ENET_I2H_PORT_DISABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 3),
|
||||
|
||||
BFI_ENET_I2H_BW_UPDATE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 4),
|
||||
};
|
||||
|
||||
/* The following error codes can be returned by the enet commands */
|
||||
enum bfi_enet_err {
|
||||
BFI_ENET_CMD_OK = 0,
|
||||
BFI_ENET_CMD_FAIL = 1,
|
||||
BFI_ENET_CMD_DUP_ENTRY = 2, /* !< Duplicate entry in CAM */
|
||||
BFI_ENET_CMD_CAM_FULL = 3, /* !< CAM is full */
|
||||
BFI_ENET_CMD_NOT_OWNER = 4, /* !< Not permitted, b'cos not owner */
|
||||
BFI_ENET_CMD_NOT_EXEC = 5, /* !< Was not sent to f/w at all */
|
||||
BFI_ENET_CMD_WAITING = 6, /* !< Waiting for completion */
|
||||
BFI_ENET_CMD_PORT_DISABLED = 7, /* !< port in disabled state */
|
||||
};
|
||||
|
||||
/* Generic Request
|
||||
*
|
||||
* bfi_enet_req is used by:
|
||||
* BFI_ENET_H2I_RX_CFG_CLR_REQ
|
||||
* BFI_ENET_H2I_TX_CFG_CLR_REQ
|
||||
*/
|
||||
struct bfi_enet_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
};
|
||||
|
||||
/* Enable/Disable Request
|
||||
*
|
||||
* bfi_enet_enable_req is used by:
|
||||
* BFI_ENET_H2I_RSS_ENABLE_REQ (enet_id must be zero)
|
||||
* BFI_ENET_H2I_RX_PROMISCUOUS_REQ (enet_id must be zero)
|
||||
* BFI_ENET_H2I_RX_DEFAULT_REQ (enet_id must be zero)
|
||||
* BFI_ENET_H2I_RX_MAC_MCAST_FILTER_REQ
|
||||
* BFI_ENET_H2I_PORT_ADMIN_UP_REQ (enet_id must be zero)
|
||||
*/
|
||||
struct bfi_enet_enable_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u8 enable; /* 1 = enable; 0 = disable */
|
||||
u8 rsvd[3];
|
||||
};
|
||||
|
||||
/* Generic Response */
|
||||
struct bfi_enet_rsp {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u8 error; /*!< if error see cmd_offset */
|
||||
u8 rsvd;
|
||||
u16 cmd_offset; /*!< offset to invalid parameter */
|
||||
};
|
||||
|
||||
/* GLOBAL CONFIGURATION */
|
||||
|
||||
/* bfi_enet_attr_req is used by:
|
||||
* BFI_ENET_H2I_GET_ATTR_REQ
|
||||
*/
|
||||
struct bfi_enet_attr_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
};
|
||||
|
||||
/* bfi_enet_attr_rsp is used by:
|
||||
* BFI_ENET_I2H_GET_ATTR_RSP
|
||||
*/
|
||||
struct bfi_enet_attr_rsp {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u8 error; /*!< if error see cmd_offset */
|
||||
u8 rsvd;
|
||||
u16 cmd_offset; /*!< offset to invalid parameter */
|
||||
u32 max_cfg;
|
||||
u32 max_ucmac;
|
||||
u32 rit_size;
|
||||
};
|
||||
|
||||
/* Tx Configuration
|
||||
*
|
||||
* bfi_enet_tx_cfg is used by:
|
||||
* BFI_ENET_H2I_TX_CFG_SET_REQ
|
||||
*/
|
||||
enum bfi_enet_tx_vlan_mode {
|
||||
BFI_ENET_TX_VLAN_NOP = 0,
|
||||
BFI_ENET_TX_VLAN_INS = 1,
|
||||
BFI_ENET_TX_VLAN_WI = 2,
|
||||
};
|
||||
|
||||
struct bfi_enet_tx_cfg {
|
||||
u8 vlan_mode; /*!< processing mode */
|
||||
u8 rsvd;
|
||||
u16 vlan_id;
|
||||
u8 admit_tagged_frame;
|
||||
u8 apply_vlan_filter;
|
||||
u8 add_to_vswitch;
|
||||
u8 rsvd1[1];
|
||||
};
|
||||
|
||||
struct bfi_enet_tx_cfg_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u8 num_queues; /* # of Tx Queues */
|
||||
u8 rsvd[3];
|
||||
|
||||
struct {
|
||||
struct bfi_enet_txq q;
|
||||
struct bfi_enet_ib ib;
|
||||
} q_cfg[BFI_ENET_TXQ_PRIO_MAX];
|
||||
|
||||
struct bfi_enet_ib_cfg ib_cfg;
|
||||
|
||||
struct bfi_enet_tx_cfg tx_cfg;
|
||||
};
|
||||
|
||||
struct bfi_enet_tx_cfg_rsp {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u8 error;
|
||||
u8 hw_id; /* For debugging */
|
||||
u8 rsvd[2];
|
||||
struct {
|
||||
u32 q_dbell; /* PCI base address offset */
|
||||
u32 i_dbell; /* PCI base address offset */
|
||||
u8 hw_qid; /* For debugging */
|
||||
u8 rsvd[3];
|
||||
} q_handles[BFI_ENET_TXQ_PRIO_MAX];
|
||||
};
|
||||
|
||||
/* Rx Configuration
|
||||
*
|
||||
* bfi_enet_rx_cfg is used by:
|
||||
* BFI_ENET_H2I_RX_CFG_SET_REQ
|
||||
*/
|
||||
enum bfi_enet_rxq_type {
|
||||
BFI_ENET_RXQ_SINGLE = 1,
|
||||
BFI_ENET_RXQ_LARGE_SMALL = 2,
|
||||
BFI_ENET_RXQ_HDS = 3,
|
||||
BFI_ENET_RXQ_HDS_OPT_BASED = 4,
|
||||
};
|
||||
|
||||
enum bfi_enet_hds_type {
|
||||
BFI_ENET_HDS_FORCED = 0x01,
|
||||
BFI_ENET_HDS_IPV6_UDP = 0x02,
|
||||
BFI_ENET_HDS_IPV6_TCP = 0x04,
|
||||
BFI_ENET_HDS_IPV4_TCP = 0x08,
|
||||
BFI_ENET_HDS_IPV4_UDP = 0x10,
|
||||
};
|
||||
|
||||
struct bfi_enet_rx_cfg {
|
||||
u8 rxq_type;
|
||||
u8 rsvd[1];
|
||||
u16 frame_size;
|
||||
|
||||
struct {
|
||||
u8 max_header_size;
|
||||
u8 force_offset;
|
||||
u8 type;
|
||||
u8 rsvd1;
|
||||
} hds;
|
||||
|
||||
u8 multi_buffer;
|
||||
u8 strip_vlan;
|
||||
u8 drop_untagged;
|
||||
u8 rsvd2;
|
||||
};
|
||||
|
||||
/*
|
||||
* Multicast frames are received on the ql of q-set index zero.
|
||||
* On the completion queue. RxQ ID = even is for large/data buffer queues
|
||||
* and RxQ ID = odd is for small/header buffer queues.
|
||||
*/
|
||||
struct bfi_enet_rx_cfg_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u8 num_queue_sets; /* # of Rx Queue Sets */
|
||||
u8 rsvd[3];
|
||||
|
||||
struct {
|
||||
struct bfi_enet_rxq ql; /* large/data/single buffers */
|
||||
struct bfi_enet_rxq qs; /* small/header buffers */
|
||||
struct bfi_enet_cq cq;
|
||||
struct bfi_enet_ib ib;
|
||||
} q_cfg[BFI_ENET_RX_QSET_MAX];
|
||||
|
||||
struct bfi_enet_ib_cfg ib_cfg;
|
||||
|
||||
struct bfi_enet_rx_cfg rx_cfg;
|
||||
};
|
||||
|
||||
struct bfi_enet_rx_cfg_rsp {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u8 error;
|
||||
u8 hw_id; /* For debugging */
|
||||
u8 rsvd[2];
|
||||
struct {
|
||||
u32 ql_dbell; /* PCI base address offset */
|
||||
u32 qs_dbell; /* PCI base address offset */
|
||||
u32 i_dbell; /* PCI base address offset */
|
||||
u8 hw_lqid; /* For debugging */
|
||||
u8 hw_sqid; /* For debugging */
|
||||
u8 hw_cqid; /* For debugging */
|
||||
u8 rsvd;
|
||||
} q_handles[BFI_ENET_RX_QSET_MAX];
|
||||
};
|
||||
|
||||
/* RIT
|
||||
*
|
||||
* bfi_enet_rit_req is used by:
|
||||
* BFI_ENET_H2I_RIT_CFG_REQ
|
||||
*/
|
||||
struct bfi_enet_rit_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u16 size; /* number of table-entries used */
|
||||
u8 rsvd[2];
|
||||
u8 table[BFI_ENET_RSS_RIT_MAX];
|
||||
};
|
||||
|
||||
/* RSS
|
||||
*
|
||||
* bfi_enet_rss_cfg_req is used by:
|
||||
* BFI_ENET_H2I_RSS_CFG_REQ
|
||||
*/
|
||||
enum bfi_enet_rss_type {
|
||||
BFI_ENET_RSS_IPV6 = 0x01,
|
||||
BFI_ENET_RSS_IPV6_TCP = 0x02,
|
||||
BFI_ENET_RSS_IPV4 = 0x04,
|
||||
BFI_ENET_RSS_IPV4_TCP = 0x08
|
||||
};
|
||||
|
||||
struct bfi_enet_rss_cfg {
|
||||
u8 type;
|
||||
u8 mask;
|
||||
u8 rsvd[2];
|
||||
u32 key[BFI_ENET_RSS_KEY_LEN];
|
||||
};
|
||||
|
||||
struct bfi_enet_rss_cfg_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
struct bfi_enet_rss_cfg cfg;
|
||||
};
|
||||
|
||||
/* MAC Unicast
|
||||
*
|
||||
* bfi_enet_rx_vlan_req is used by:
|
||||
* BFI_ENET_H2I_MAC_UCAST_SET_REQ
|
||||
* BFI_ENET_H2I_MAC_UCAST_CLR_REQ
|
||||
* BFI_ENET_H2I_MAC_UCAST_ADD_REQ
|
||||
* BFI_ENET_H2I_MAC_UCAST_DEL_REQ
|
||||
*/
|
||||
struct bfi_enet_ucast_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
mac_t mac_addr;
|
||||
u8 rsvd[2];
|
||||
};
|
||||
|
||||
/* MAC Unicast + VLAN */
|
||||
struct bfi_enet_mac_n_vlan_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u16 vlan_id;
|
||||
mac_t mac_addr;
|
||||
};
|
||||
|
||||
/* MAC Multicast
|
||||
*
|
||||
* bfi_enet_mac_mfilter_add_req is used by:
|
||||
* BFI_ENET_H2I_MAC_MCAST_ADD_REQ
|
||||
*/
|
||||
struct bfi_enet_mcast_add_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
mac_t mac_addr;
|
||||
u8 rsvd[2];
|
||||
};
|
||||
|
||||
/* bfi_enet_mac_mfilter_add_rsp is used by:
|
||||
* BFI_ENET_I2H_MAC_MCAST_ADD_RSP
|
||||
*/
|
||||
struct bfi_enet_mcast_add_rsp {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u8 error;
|
||||
u8 rsvd;
|
||||
u16 cmd_offset;
|
||||
u16 handle;
|
||||
u8 rsvd1[2];
|
||||
};
|
||||
|
||||
/* bfi_enet_mac_mfilter_del_req is used by:
|
||||
* BFI_ENET_H2I_MAC_MCAST_DEL_REQ
|
||||
*/
|
||||
struct bfi_enet_mcast_del_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u16 handle;
|
||||
u8 rsvd[2];
|
||||
};
|
||||
|
||||
/* VLAN
|
||||
*
|
||||
* bfi_enet_rx_vlan_req is used by:
|
||||
* BFI_ENET_H2I_RX_VLAN_SET_REQ
|
||||
*/
|
||||
struct bfi_enet_rx_vlan_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u8 block_idx;
|
||||
u8 rsvd[3];
|
||||
u32 bit_mask[BFI_ENET_VLAN_WORDS_MAX];
|
||||
};
|
||||
|
||||
/* PAUSE
|
||||
*
|
||||
* bfi_enet_set_pause_req is used by:
|
||||
* BFI_ENET_H2I_SET_PAUSE_REQ
|
||||
*/
|
||||
struct bfi_enet_set_pause_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u8 rsvd[2];
|
||||
u8 tx_pause; /* 1 = enable; 0 = disable */
|
||||
u8 rx_pause; /* 1 = enable; 0 = disable */
|
||||
};
|
||||
|
||||
/* DIAGNOSTICS
|
||||
*
|
||||
* bfi_enet_diag_lb_req is used by:
|
||||
* BFI_ENET_H2I_DIAG_LOOPBACK
|
||||
*/
|
||||
struct bfi_enet_diag_lb_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u8 rsvd[2];
|
||||
u8 mode; /* cable or Serdes */
|
||||
u8 enable; /* 1 = enable; 0 = disable */
|
||||
};
|
||||
|
||||
/* enum for Loopback opmodes */
|
||||
enum {
|
||||
BFI_ENET_DIAG_LB_OPMODE_EXT = 0,
|
||||
BFI_ENET_DIAG_LB_OPMODE_CBL = 1,
|
||||
};
|
||||
|
||||
/* STATISTICS
|
||||
*
|
||||
* bfi_enet_stats_req is used by:
|
||||
* BFI_ENET_H2I_STATS_GET_REQ
|
||||
* BFI_ENET_I2H_STATS_CLR_REQ
|
||||
*/
|
||||
struct bfi_enet_stats_req {
|
||||
struct bfi_msgq_mhdr mh;
|
||||
u16 stats_mask;
|
||||
u8 rsvd[2];
|
||||
u32 rx_enet_mask;
|
||||
u32 tx_enet_mask;
|
||||
union bfi_addr_u host_buffer;
|
||||
};
|
||||
|
||||
/* defines for "stats_mask" above. */
|
||||
#define BFI_ENET_STATS_MAC (1 << 0) /* !< MAC Statistics */
|
||||
#define BFI_ENET_STATS_BPC (1 << 1) /* !< Pause Stats from BPC */
|
||||
#define BFI_ENET_STATS_RAD (1 << 2) /* !< Rx Admission Statistics */
|
||||
#define BFI_ENET_STATS_RX_FC (1 << 3) /* !< Rx FC Stats from RxA */
|
||||
#define BFI_ENET_STATS_TX_FC (1 << 4) /* !< Tx FC Stats from TxA */
|
||||
|
||||
#define BFI_ENET_STATS_ALL 0x1f
|
||||
|
||||
/* TxF Frame Statistics */
|
||||
struct bfi_enet_stats_txf {
|
||||
u64 ucast_octets;
|
||||
u64 ucast;
|
||||
u64 ucast_vlan;
|
||||
|
||||
u64 mcast_octets;
|
||||
u64 mcast;
|
||||
u64 mcast_vlan;
|
||||
|
||||
u64 bcast_octets;
|
||||
u64 bcast;
|
||||
u64 bcast_vlan;
|
||||
|
||||
u64 errors;
|
||||
u64 filter_vlan; /* frames filtered due to VLAN */
|
||||
u64 filter_mac_sa; /* frames filtered due to SA check */
|
||||
};
|
||||
|
||||
/* RxF Frame Statistics */
|
||||
struct bfi_enet_stats_rxf {
|
||||
u64 ucast_octets;
|
||||
u64 ucast;
|
||||
u64 ucast_vlan;
|
||||
|
||||
u64 mcast_octets;
|
||||
u64 mcast;
|
||||
u64 mcast_vlan;
|
||||
|
||||
u64 bcast_octets;
|
||||
u64 bcast;
|
||||
u64 bcast_vlan;
|
||||
u64 frame_drops;
|
||||
};
|
||||
|
||||
/* FC Tx Frame Statistics */
|
||||
struct bfi_enet_stats_fc_tx {
|
||||
u64 txf_ucast_octets;
|
||||
u64 txf_ucast;
|
||||
u64 txf_ucast_vlan;
|
||||
|
||||
u64 txf_mcast_octets;
|
||||
u64 txf_mcast;
|
||||
u64 txf_mcast_vlan;
|
||||
|
||||
u64 txf_bcast_octets;
|
||||
u64 txf_bcast;
|
||||
u64 txf_bcast_vlan;
|
||||
|
||||
u64 txf_parity_errors;
|
||||
u64 txf_timeout;
|
||||
u64 txf_fid_parity_errors;
|
||||
};
|
||||
|
||||
/* FC Rx Frame Statistics */
|
||||
struct bfi_enet_stats_fc_rx {
|
||||
u64 rxf_ucast_octets;
|
||||
u64 rxf_ucast;
|
||||
u64 rxf_ucast_vlan;
|
||||
|
||||
u64 rxf_mcast_octets;
|
||||
u64 rxf_mcast;
|
||||
u64 rxf_mcast_vlan;
|
||||
|
||||
u64 rxf_bcast_octets;
|
||||
u64 rxf_bcast;
|
||||
u64 rxf_bcast_vlan;
|
||||
};
|
||||
|
||||
/* RAD Frame Statistics */
|
||||
struct bfi_enet_stats_rad {
|
||||
u64 rx_frames;
|
||||
u64 rx_octets;
|
||||
u64 rx_vlan_frames;
|
||||
|
||||
u64 rx_ucast;
|
||||
u64 rx_ucast_octets;
|
||||
u64 rx_ucast_vlan;
|
||||
|
||||
u64 rx_mcast;
|
||||
u64 rx_mcast_octets;
|
||||
u64 rx_mcast_vlan;
|
||||
|
||||
u64 rx_bcast;
|
||||
u64 rx_bcast_octets;
|
||||
u64 rx_bcast_vlan;
|
||||
|
||||
u64 rx_drops;
|
||||
};
|
||||
|
||||
/* BPC Tx Registers */
|
||||
struct bfi_enet_stats_bpc {
|
||||
/* transmit stats */
|
||||
u64 tx_pause[8];
|
||||
u64 tx_zero_pause[8]; /*!< Pause cancellation */
|
||||
/*!<Pause initiation rather than retention */
|
||||
u64 tx_first_pause[8];
|
||||
|
||||
/* receive stats */
|
||||
u64 rx_pause[8];
|
||||
u64 rx_zero_pause[8]; /*!< Pause cancellation */
|
||||
/*!<Pause initiation rather than retention */
|
||||
u64 rx_first_pause[8];
|
||||
};
|
||||
|
||||
/* MAC Rx Statistics */
|
||||
struct bfi_enet_stats_mac {
|
||||
u64 stats_clr_cnt; /* times this stats cleared */
|
||||
u64 frame_64; /* both rx and tx counter */
|
||||
u64 frame_65_127; /* both rx and tx counter */
|
||||
u64 frame_128_255; /* both rx and tx counter */
|
||||
u64 frame_256_511; /* both rx and tx counter */
|
||||
u64 frame_512_1023; /* both rx and tx counter */
|
||||
u64 frame_1024_1518; /* both rx and tx counter */
|
||||
u64 frame_1519_1522; /* both rx and tx counter */
|
||||
|
||||
/* receive stats */
|
||||
u64 rx_bytes;
|
||||
u64 rx_packets;
|
||||
u64 rx_fcs_error;
|
||||
u64 rx_multicast;
|
||||
u64 rx_broadcast;
|
||||
u64 rx_control_frames;
|
||||
u64 rx_pause;
|
||||
u64 rx_unknown_opcode;
|
||||
u64 rx_alignment_error;
|
||||
u64 rx_frame_length_error;
|
||||
u64 rx_code_error;
|
||||
u64 rx_carrier_sense_error;
|
||||
u64 rx_undersize;
|
||||
u64 rx_oversize;
|
||||
u64 rx_fragments;
|
||||
u64 rx_jabber;
|
||||
u64 rx_drop;
|
||||
|
||||
/* transmit stats */
|
||||
u64 tx_bytes;
|
||||
u64 tx_packets;
|
||||
u64 tx_multicast;
|
||||
u64 tx_broadcast;
|
||||
u64 tx_pause;
|
||||
u64 tx_deferral;
|
||||
u64 tx_excessive_deferral;
|
||||
u64 tx_single_collision;
|
||||
u64 tx_muliple_collision;
|
||||
u64 tx_late_collision;
|
||||
u64 tx_excessive_collision;
|
||||
u64 tx_total_collision;
|
||||
u64 tx_pause_honored;
|
||||
u64 tx_drop;
|
||||
u64 tx_jabber;
|
||||
u64 tx_fcs_error;
|
||||
u64 tx_control_frame;
|
||||
u64 tx_oversize;
|
||||
u64 tx_undersize;
|
||||
u64 tx_fragments;
|
||||
};
|
||||
|
||||
/* Complete statistics, DMAed from fw to host followed by
|
||||
* BFI_ENET_I2H_STATS_GET_RSP
|
||||
*/
|
||||
struct bfi_enet_stats {
|
||||
struct bfi_enet_stats_mac mac_stats;
|
||||
struct bfi_enet_stats_bpc bpc_stats;
|
||||
struct bfi_enet_stats_rad rad_stats;
|
||||
struct bfi_enet_stats_rad rlb_stats;
|
||||
struct bfi_enet_stats_fc_rx fc_rx_stats;
|
||||
struct bfi_enet_stats_fc_tx fc_tx_stats;
|
||||
struct bfi_enet_stats_rxf rxf_stats[BFI_ENET_CFG_MAX];
|
||||
struct bfi_enet_stats_txf txf_stats[BFI_ENET_CFG_MAX];
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif /* __BFI_ENET_H__ */
|
456
drivers/net/ethernet/brocade/bna/bfi_reg.h
Normal file
456
drivers/net/ethernet/brocade/bna/bfi_reg.h
Normal file
|
@ -0,0 +1,456 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
/*
|
||||
* bfi_reg.h ASIC register defines for all Brocade adapter ASICs
|
||||
*/
|
||||
|
||||
#ifndef __BFI_REG_H__
|
||||
#define __BFI_REG_H__
|
||||
|
||||
#define HOSTFN0_INT_STATUS 0x00014000 /* cb/ct */
|
||||
#define HOSTFN1_INT_STATUS 0x00014100 /* cb/ct */
|
||||
#define HOSTFN2_INT_STATUS 0x00014300 /* ct */
|
||||
#define HOSTFN3_INT_STATUS 0x00014400 /* ct */
|
||||
#define HOSTFN0_INT_MSK 0x00014004 /* cb/ct */
|
||||
#define HOSTFN1_INT_MSK 0x00014104 /* cb/ct */
|
||||
#define HOSTFN2_INT_MSK 0x00014304 /* ct */
|
||||
#define HOSTFN3_INT_MSK 0x00014404 /* ct */
|
||||
|
||||
#define HOST_PAGE_NUM_FN0 0x00014008 /* cb/ct */
|
||||
#define HOST_PAGE_NUM_FN1 0x00014108 /* cb/ct */
|
||||
#define HOST_PAGE_NUM_FN2 0x00014308 /* ct */
|
||||
#define HOST_PAGE_NUM_FN3 0x00014408 /* ct */
|
||||
|
||||
#define APP_PLL_LCLK_CTL_REG 0x00014204 /* cb/ct */
|
||||
#define __P_LCLK_PLL_LOCK 0x80000000
|
||||
#define __APP_PLL_LCLK_SRAM_USE_100MHZ 0x00100000
|
||||
#define __APP_PLL_LCLK_RESET_TIMER_MK 0x000e0000
|
||||
#define __APP_PLL_LCLK_RESET_TIMER_SH 17
|
||||
#define __APP_PLL_LCLK_RESET_TIMER(_v) ((_v) << __APP_PLL_LCLK_RESET_TIMER_SH)
|
||||
#define __APP_PLL_LCLK_LOGIC_SOFT_RESET 0x00010000
|
||||
#define __APP_PLL_LCLK_CNTLMT0_1_MK 0x0000c000
|
||||
#define __APP_PLL_LCLK_CNTLMT0_1_SH 14
|
||||
#define __APP_PLL_LCLK_CNTLMT0_1(_v) ((_v) << __APP_PLL_LCLK_CNTLMT0_1_SH)
|
||||
#define __APP_PLL_LCLK_JITLMT0_1_MK 0x00003000
|
||||
#define __APP_PLL_LCLK_JITLMT0_1_SH 12
|
||||
#define __APP_PLL_LCLK_JITLMT0_1(_v) ((_v) << __APP_PLL_LCLK_JITLMT0_1_SH)
|
||||
#define __APP_PLL_LCLK_HREF 0x00000800
|
||||
#define __APP_PLL_LCLK_HDIV 0x00000400
|
||||
#define __APP_PLL_LCLK_P0_1_MK 0x00000300
|
||||
#define __APP_PLL_LCLK_P0_1_SH 8
|
||||
#define __APP_PLL_LCLK_P0_1(_v) ((_v) << __APP_PLL_LCLK_P0_1_SH)
|
||||
#define __APP_PLL_LCLK_Z0_2_MK 0x000000e0
|
||||
#define __APP_PLL_LCLK_Z0_2_SH 5
|
||||
#define __APP_PLL_LCLK_Z0_2(_v) ((_v) << __APP_PLL_LCLK_Z0_2_SH)
|
||||
#define __APP_PLL_LCLK_RSEL200500 0x00000010
|
||||
#define __APP_PLL_LCLK_ENARST 0x00000008
|
||||
#define __APP_PLL_LCLK_BYPASS 0x00000004
|
||||
#define __APP_PLL_LCLK_LRESETN 0x00000002
|
||||
#define __APP_PLL_LCLK_ENABLE 0x00000001
|
||||
#define APP_PLL_SCLK_CTL_REG 0x00014208 /* cb/ct */
|
||||
#define __P_SCLK_PLL_LOCK 0x80000000
|
||||
#define __APP_PLL_SCLK_RESET_TIMER_MK 0x000e0000
|
||||
#define __APP_PLL_SCLK_RESET_TIMER_SH 17
|
||||
#define __APP_PLL_SCLK_RESET_TIMER(_v) ((_v) << __APP_PLL_SCLK_RESET_TIMER_SH)
|
||||
#define __APP_PLL_SCLK_LOGIC_SOFT_RESET 0x00010000
|
||||
#define __APP_PLL_SCLK_CNTLMT0_1_MK 0x0000c000
|
||||
#define __APP_PLL_SCLK_CNTLMT0_1_SH 14
|
||||
#define __APP_PLL_SCLK_CNTLMT0_1(_v) ((_v) << __APP_PLL_SCLK_CNTLMT0_1_SH)
|
||||
#define __APP_PLL_SCLK_JITLMT0_1_MK 0x00003000
|
||||
#define __APP_PLL_SCLK_JITLMT0_1_SH 12
|
||||
#define __APP_PLL_SCLK_JITLMT0_1(_v) ((_v) << __APP_PLL_SCLK_JITLMT0_1_SH)
|
||||
#define __APP_PLL_SCLK_HREF 0x00000800
|
||||
#define __APP_PLL_SCLK_HDIV 0x00000400
|
||||
#define __APP_PLL_SCLK_P0_1_MK 0x00000300
|
||||
#define __APP_PLL_SCLK_P0_1_SH 8
|
||||
#define __APP_PLL_SCLK_P0_1(_v) ((_v) << __APP_PLL_SCLK_P0_1_SH)
|
||||
#define __APP_PLL_SCLK_Z0_2_MK 0x000000e0
|
||||
#define __APP_PLL_SCLK_Z0_2_SH 5
|
||||
#define __APP_PLL_SCLK_Z0_2(_v) ((_v) << __APP_PLL_SCLK_Z0_2_SH)
|
||||
#define __APP_PLL_SCLK_RSEL200500 0x00000010
|
||||
#define __APP_PLL_SCLK_ENARST 0x00000008
|
||||
#define __APP_PLL_SCLK_BYPASS 0x00000004
|
||||
#define __APP_PLL_SCLK_LRESETN 0x00000002
|
||||
#define __APP_PLL_SCLK_ENABLE 0x00000001
|
||||
#define __ENABLE_MAC_AHB_1 0x00800000 /* ct */
|
||||
#define __ENABLE_MAC_AHB_0 0x00400000 /* ct */
|
||||
#define __ENABLE_MAC_1 0x00200000 /* ct */
|
||||
#define __ENABLE_MAC_0 0x00100000 /* ct */
|
||||
|
||||
#define HOST_SEM0_REG 0x00014230 /* cb/ct */
|
||||
#define HOST_SEM1_REG 0x00014234 /* cb/ct */
|
||||
#define HOST_SEM2_REG 0x00014238 /* cb/ct */
|
||||
#define HOST_SEM3_REG 0x0001423c /* cb/ct */
|
||||
#define HOST_SEM4_REG 0x00014610 /* cb/ct */
|
||||
#define HOST_SEM5_REG 0x00014614 /* cb/ct */
|
||||
#define HOST_SEM6_REG 0x00014618 /* cb/ct */
|
||||
#define HOST_SEM7_REG 0x0001461c /* cb/ct */
|
||||
#define HOST_SEM0_INFO_REG 0x00014240 /* cb/ct */
|
||||
#define HOST_SEM1_INFO_REG 0x00014244 /* cb/ct */
|
||||
#define HOST_SEM2_INFO_REG 0x00014248 /* cb/ct */
|
||||
#define HOST_SEM3_INFO_REG 0x0001424c /* cb/ct */
|
||||
#define HOST_SEM4_INFO_REG 0x00014620 /* cb/ct */
|
||||
#define HOST_SEM5_INFO_REG 0x00014624 /* cb/ct */
|
||||
#define HOST_SEM6_INFO_REG 0x00014628 /* cb/ct */
|
||||
#define HOST_SEM7_INFO_REG 0x0001462c /* cb/ct */
|
||||
|
||||
#define HOSTFN0_LPU0_CMD_STAT 0x00019000 /* cb/ct */
|
||||
#define HOSTFN0_LPU1_CMD_STAT 0x00019004 /* cb/ct */
|
||||
#define HOSTFN1_LPU0_CMD_STAT 0x00019010 /* cb/ct */
|
||||
#define HOSTFN1_LPU1_CMD_STAT 0x00019014 /* cb/ct */
|
||||
#define HOSTFN2_LPU0_CMD_STAT 0x00019150 /* ct */
|
||||
#define HOSTFN2_LPU1_CMD_STAT 0x00019154 /* ct */
|
||||
#define HOSTFN3_LPU0_CMD_STAT 0x00019160 /* ct */
|
||||
#define HOSTFN3_LPU1_CMD_STAT 0x00019164 /* ct */
|
||||
#define LPU0_HOSTFN0_CMD_STAT 0x00019008 /* cb/ct */
|
||||
#define LPU1_HOSTFN0_CMD_STAT 0x0001900c /* cb/ct */
|
||||
#define LPU0_HOSTFN1_CMD_STAT 0x00019018 /* cb/ct */
|
||||
#define LPU1_HOSTFN1_CMD_STAT 0x0001901c /* cb/ct */
|
||||
#define LPU0_HOSTFN2_CMD_STAT 0x00019158 /* ct */
|
||||
#define LPU1_HOSTFN2_CMD_STAT 0x0001915c /* ct */
|
||||
#define LPU0_HOSTFN3_CMD_STAT 0x00019168 /* ct */
|
||||
#define LPU1_HOSTFN3_CMD_STAT 0x0001916c /* ct */
|
||||
|
||||
#define PSS_CTL_REG 0x00018800 /* cb/ct */
|
||||
#define __PSS_I2C_CLK_DIV_MK 0x007f0000
|
||||
#define __PSS_I2C_CLK_DIV_SH 16
|
||||
#define __PSS_I2C_CLK_DIV(_v) ((_v) << __PSS_I2C_CLK_DIV_SH)
|
||||
#define __PSS_LMEM_INIT_DONE 0x00001000
|
||||
#define __PSS_LMEM_RESET 0x00000200
|
||||
#define __PSS_LMEM_INIT_EN 0x00000100
|
||||
#define __PSS_LPU1_RESET 0x00000002
|
||||
#define __PSS_LPU0_RESET 0x00000001
|
||||
#define PSS_ERR_STATUS_REG 0x00018810 /* cb/ct */
|
||||
#define ERR_SET_REG 0x00018818 /* cb/ct */
|
||||
#define PSS_GPIO_OUT_REG 0x000188c0 /* cb/ct */
|
||||
#define __PSS_GPIO_OUT_REG 0x00000fff
|
||||
#define PSS_GPIO_OE_REG 0x000188c8 /* cb/ct */
|
||||
#define __PSS_GPIO_OE_REG 0x000000ff
|
||||
|
||||
#define HOSTFN0_LPU_MBOX0_0 0x00019200 /* cb/ct */
|
||||
#define HOSTFN1_LPU_MBOX0_8 0x00019260 /* cb/ct */
|
||||
#define LPU_HOSTFN0_MBOX0_0 0x00019280 /* cb/ct */
|
||||
#define LPU_HOSTFN1_MBOX0_8 0x000192e0 /* cb/ct */
|
||||
#define HOSTFN2_LPU_MBOX0_0 0x00019400 /* ct */
|
||||
#define HOSTFN3_LPU_MBOX0_8 0x00019460 /* ct */
|
||||
#define LPU_HOSTFN2_MBOX0_0 0x00019480 /* ct */
|
||||
#define LPU_HOSTFN3_MBOX0_8 0x000194e0 /* ct */
|
||||
|
||||
#define HOST_MSIX_ERR_INDEX_FN0 0x0001400c /* ct */
|
||||
#define HOST_MSIX_ERR_INDEX_FN1 0x0001410c /* ct */
|
||||
#define HOST_MSIX_ERR_INDEX_FN2 0x0001430c /* ct */
|
||||
#define HOST_MSIX_ERR_INDEX_FN3 0x0001440c /* ct */
|
||||
|
||||
#define MBIST_CTL_REG 0x00014220 /* ct */
|
||||
#define __EDRAM_BISTR_START 0x00000004
|
||||
#define MBIST_STAT_REG 0x00014224 /* ct */
|
||||
#define ETH_MAC_SER_REG 0x00014288 /* ct */
|
||||
#define __APP_EMS_CKBUFAMPIN 0x00000020
|
||||
#define __APP_EMS_REFCLKSEL 0x00000010
|
||||
#define __APP_EMS_CMLCKSEL 0x00000008
|
||||
#define __APP_EMS_REFCKBUFEN2 0x00000004
|
||||
#define __APP_EMS_REFCKBUFEN1 0x00000002
|
||||
#define __APP_EMS_CHANNEL_SEL 0x00000001
|
||||
#define FNC_PERS_REG 0x00014604 /* ct */
|
||||
#define __F3_FUNCTION_ACTIVE 0x80000000
|
||||
#define __F3_FUNCTION_MODE 0x40000000
|
||||
#define __F3_PORT_MAP_MK 0x30000000
|
||||
#define __F3_PORT_MAP_SH 28
|
||||
#define __F3_PORT_MAP(_v) ((_v) << __F3_PORT_MAP_SH)
|
||||
#define __F3_VM_MODE 0x08000000
|
||||
#define __F3_INTX_STATUS_MK 0x07000000
|
||||
#define __F3_INTX_STATUS_SH 24
|
||||
#define __F3_INTX_STATUS(_v) ((_v) << __F3_INTX_STATUS_SH)
|
||||
#define __F2_FUNCTION_ACTIVE 0x00800000
|
||||
#define __F2_FUNCTION_MODE 0x00400000
|
||||
#define __F2_PORT_MAP_MK 0x00300000
|
||||
#define __F2_PORT_MAP_SH 20
|
||||
#define __F2_PORT_MAP(_v) ((_v) << __F2_PORT_MAP_SH)
|
||||
#define __F2_VM_MODE 0x00080000
|
||||
#define __F2_INTX_STATUS_MK 0x00070000
|
||||
#define __F2_INTX_STATUS_SH 16
|
||||
#define __F2_INTX_STATUS(_v) ((_v) << __F2_INTX_STATUS_SH)
|
||||
#define __F1_FUNCTION_ACTIVE 0x00008000
|
||||
#define __F1_FUNCTION_MODE 0x00004000
|
||||
#define __F1_PORT_MAP_MK 0x00003000
|
||||
#define __F1_PORT_MAP_SH 12
|
||||
#define __F1_PORT_MAP(_v) ((_v) << __F1_PORT_MAP_SH)
|
||||
#define __F1_VM_MODE 0x00000800
|
||||
#define __F1_INTX_STATUS_MK 0x00000700
|
||||
#define __F1_INTX_STATUS_SH 8
|
||||
#define __F1_INTX_STATUS(_v) ((_v) << __F1_INTX_STATUS_SH)
|
||||
#define __F0_FUNCTION_ACTIVE 0x00000080
|
||||
#define __F0_FUNCTION_MODE 0x00000040
|
||||
#define __F0_PORT_MAP_MK 0x00000030
|
||||
#define __F0_PORT_MAP_SH 4
|
||||
#define __F0_PORT_MAP(_v) ((_v) << __F0_PORT_MAP_SH)
|
||||
#define __F0_VM_MODE 0x00000008
|
||||
#define __F0_INTX_STATUS 0x00000007
|
||||
enum {
|
||||
__F0_INTX_STATUS_MSIX = 0x0,
|
||||
__F0_INTX_STATUS_INTA = 0x1,
|
||||
__F0_INTX_STATUS_INTB = 0x2,
|
||||
__F0_INTX_STATUS_INTC = 0x3,
|
||||
__F0_INTX_STATUS_INTD = 0x4,
|
||||
};
|
||||
|
||||
#define OP_MODE 0x0001460c
|
||||
#define __APP_ETH_CLK_LOWSPEED 0x00000004
|
||||
#define __GLOBAL_CORECLK_HALFSPEED 0x00000002
|
||||
#define __GLOBAL_FCOE_MODE 0x00000001
|
||||
#define FW_INIT_HALT_P0 0x000191ac
|
||||
#define __FW_INIT_HALT_P 0x00000001
|
||||
#define FW_INIT_HALT_P1 0x000191bc
|
||||
#define PMM_1T_RESET_REG_P0 0x0002381c
|
||||
#define __PMM_1T_RESET_P 0x00000001
|
||||
#define PMM_1T_RESET_REG_P1 0x00023c1c
|
||||
|
||||
/* Brocade 1860 Adapter specific defines */
|
||||
#define CT2_PCI_CPQ_BASE 0x00030000
|
||||
#define CT2_PCI_APP_BASE 0x00030100
|
||||
#define CT2_PCI_ETH_BASE 0x00030400
|
||||
|
||||
/*
|
||||
* APP block registers
|
||||
*/
|
||||
#define CT2_HOSTFN_INT_STATUS (CT2_PCI_APP_BASE + 0x00)
|
||||
#define CT2_HOSTFN_INTR_MASK (CT2_PCI_APP_BASE + 0x04)
|
||||
#define CT2_HOSTFN_PERSONALITY0 (CT2_PCI_APP_BASE + 0x08)
|
||||
#define __PME_STATUS_ 0x00200000
|
||||
#define __PF_VF_BAR_SIZE_MODE__MK 0x00180000
|
||||
#define __PF_VF_BAR_SIZE_MODE__SH 19
|
||||
#define __PF_VF_BAR_SIZE_MODE_(_v) ((_v) << __PF_VF_BAR_SIZE_MODE__SH)
|
||||
#define __FC_LL_PORT_MAP__MK 0x00060000
|
||||
#define __FC_LL_PORT_MAP__SH 17
|
||||
#define __FC_LL_PORT_MAP_(_v) ((_v) << __FC_LL_PORT_MAP__SH)
|
||||
#define __PF_VF_ACTIVE_ 0x00010000
|
||||
#define __PF_VF_CFG_RDY_ 0x00008000
|
||||
#define __PF_VF_ENABLE_ 0x00004000
|
||||
#define __PF_DRIVER_ACTIVE_ 0x00002000
|
||||
#define __PF_PME_SEND_ENABLE_ 0x00001000
|
||||
#define __PF_EXROM_OFFSET__MK 0x00000ff0
|
||||
#define __PF_EXROM_OFFSET__SH 4
|
||||
#define __PF_EXROM_OFFSET_(_v) ((_v) << __PF_EXROM_OFFSET__SH)
|
||||
#define __FC_LL_MODE_ 0x00000008
|
||||
#define __PF_INTX_PIN_ 0x00000007
|
||||
#define CT2_HOSTFN_PERSONALITY1 (CT2_PCI_APP_BASE + 0x0C)
|
||||
#define __PF_NUM_QUEUES1__MK 0xff000000
|
||||
#define __PF_NUM_QUEUES1__SH 24
|
||||
#define __PF_NUM_QUEUES1_(_v) ((_v) << __PF_NUM_QUEUES1__SH)
|
||||
#define __PF_VF_QUE_OFFSET1__MK 0x00ff0000
|
||||
#define __PF_VF_QUE_OFFSET1__SH 16
|
||||
#define __PF_VF_QUE_OFFSET1_(_v) ((_v) << __PF_VF_QUE_OFFSET1__SH)
|
||||
#define __PF_VF_NUM_QUEUES__MK 0x0000ff00
|
||||
#define __PF_VF_NUM_QUEUES__SH 8
|
||||
#define __PF_VF_NUM_QUEUES_(_v) ((_v) << __PF_VF_NUM_QUEUES__SH)
|
||||
#define __PF_VF_QUE_OFFSET_ 0x000000ff
|
||||
#define CT2_HOSTFN_PAGE_NUM (CT2_PCI_APP_BASE + 0x18)
|
||||
#define CT2_HOSTFN_MSIX_VT_INDEX_MBOX_ERR (CT2_PCI_APP_BASE + 0x38)
|
||||
|
||||
/*
|
||||
* Brocade 1860 adapter CPQ block registers
|
||||
*/
|
||||
#define CT2_HOSTFN_LPU0_MBOX0 (CT2_PCI_CPQ_BASE + 0x00)
|
||||
#define CT2_HOSTFN_LPU1_MBOX0 (CT2_PCI_CPQ_BASE + 0x20)
|
||||
#define CT2_LPU0_HOSTFN_MBOX0 (CT2_PCI_CPQ_BASE + 0x40)
|
||||
#define CT2_LPU1_HOSTFN_MBOX0 (CT2_PCI_CPQ_BASE + 0x60)
|
||||
#define CT2_HOSTFN_LPU0_CMD_STAT (CT2_PCI_CPQ_BASE + 0x80)
|
||||
#define CT2_HOSTFN_LPU1_CMD_STAT (CT2_PCI_CPQ_BASE + 0x84)
|
||||
#define CT2_LPU0_HOSTFN_CMD_STAT (CT2_PCI_CPQ_BASE + 0x88)
|
||||
#define CT2_LPU1_HOSTFN_CMD_STAT (CT2_PCI_CPQ_BASE + 0x8c)
|
||||
#define CT2_HOSTFN_LPU0_READ_STAT (CT2_PCI_CPQ_BASE + 0x90)
|
||||
#define CT2_HOSTFN_LPU1_READ_STAT (CT2_PCI_CPQ_BASE + 0x94)
|
||||
#define CT2_LPU0_HOSTFN_MBOX0_MSK (CT2_PCI_CPQ_BASE + 0x98)
|
||||
#define CT2_LPU1_HOSTFN_MBOX0_MSK (CT2_PCI_CPQ_BASE + 0x9C)
|
||||
#define CT2_HOST_SEM0_REG 0x000148f0
|
||||
#define CT2_HOST_SEM1_REG 0x000148f4
|
||||
#define CT2_HOST_SEM2_REG 0x000148f8
|
||||
#define CT2_HOST_SEM3_REG 0x000148fc
|
||||
#define CT2_HOST_SEM4_REG 0x00014900
|
||||
#define CT2_HOST_SEM5_REG 0x00014904
|
||||
#define CT2_HOST_SEM6_REG 0x00014908
|
||||
#define CT2_HOST_SEM7_REG 0x0001490c
|
||||
#define CT2_HOST_SEM0_INFO_REG 0x000148b0
|
||||
#define CT2_HOST_SEM1_INFO_REG 0x000148b4
|
||||
#define CT2_HOST_SEM2_INFO_REG 0x000148b8
|
||||
#define CT2_HOST_SEM3_INFO_REG 0x000148bc
|
||||
#define CT2_HOST_SEM4_INFO_REG 0x000148c0
|
||||
#define CT2_HOST_SEM5_INFO_REG 0x000148c4
|
||||
#define CT2_HOST_SEM6_INFO_REG 0x000148c8
|
||||
#define CT2_HOST_SEM7_INFO_REG 0x000148cc
|
||||
|
||||
#define CT2_APP_PLL_LCLK_CTL_REG 0x00014808
|
||||
#define __APP_LPUCLK_HALFSPEED 0x40000000
|
||||
#define __APP_PLL_LCLK_LOAD 0x20000000
|
||||
#define __APP_PLL_LCLK_FBCNT_MK 0x1fe00000
|
||||
#define __APP_PLL_LCLK_FBCNT_SH 21
|
||||
#define __APP_PLL_LCLK_FBCNT(_v) ((_v) << __APP_PLL_SCLK_FBCNT_SH)
|
||||
enum {
|
||||
__APP_PLL_LCLK_FBCNT_425_MHZ = 6,
|
||||
__APP_PLL_LCLK_FBCNT_468_MHZ = 4,
|
||||
};
|
||||
#define __APP_PLL_LCLK_EXTFB 0x00000800
|
||||
#define __APP_PLL_LCLK_ENOUTS 0x00000400
|
||||
#define __APP_PLL_LCLK_RATE 0x00000010
|
||||
#define CT2_APP_PLL_SCLK_CTL_REG 0x0001480c
|
||||
#define __P_SCLK_PLL_LOCK 0x80000000
|
||||
#define __APP_PLL_SCLK_REFCLK_SEL 0x40000000
|
||||
#define __APP_PLL_SCLK_CLK_DIV2 0x20000000
|
||||
#define __APP_PLL_SCLK_LOAD 0x10000000
|
||||
#define __APP_PLL_SCLK_FBCNT_MK 0x0ff00000
|
||||
#define __APP_PLL_SCLK_FBCNT_SH 20
|
||||
#define __APP_PLL_SCLK_FBCNT(_v) ((_v) << __APP_PLL_SCLK_FBCNT_SH)
|
||||
enum {
|
||||
__APP_PLL_SCLK_FBCNT_NORM = 6,
|
||||
__APP_PLL_SCLK_FBCNT_10G_FC = 10,
|
||||
};
|
||||
#define __APP_PLL_SCLK_EXTFB 0x00000800
|
||||
#define __APP_PLL_SCLK_ENOUTS 0x00000400
|
||||
#define __APP_PLL_SCLK_RATE 0x00000010
|
||||
#define CT2_PCIE_MISC_REG 0x00014804
|
||||
#define __ETH_CLK_ENABLE_PORT1 0x00000010
|
||||
#define CT2_CHIP_MISC_PRG 0x000148a4
|
||||
#define __ETH_CLK_ENABLE_PORT0 0x00004000
|
||||
#define __APP_LPU_SPEED 0x00000002
|
||||
#define CT2_MBIST_STAT_REG 0x00014818
|
||||
#define CT2_MBIST_CTL_REG 0x0001481c
|
||||
#define CT2_PMM_1T_CONTROL_REG_P0 0x0002381c
|
||||
#define __PMM_1T_PNDB_P 0x00000002
|
||||
#define CT2_PMM_1T_CONTROL_REG_P1 0x00023c1c
|
||||
#define CT2_WGN_STATUS 0x00014990
|
||||
#define __A2T_AHB_LOAD 0x00000800
|
||||
#define __WGN_READY 0x00000400
|
||||
#define __GLBL_PF_VF_CFG_RDY 0x00000200
|
||||
#define CT2_NFC_CSR_CLR_REG 0x00027420
|
||||
#define CT2_NFC_CSR_SET_REG 0x00027424
|
||||
#define __HALT_NFC_CONTROLLER 0x00000002
|
||||
#define __NFC_CONTROLLER_HALTED 0x00001000
|
||||
|
||||
#define CT2_RSC_GPR15_REG 0x0002765c
|
||||
#define CT2_CSI_FW_CTL_REG 0x00027080
|
||||
#define __RESET_AND_START_SCLK_LCLK_PLLS 0x00010000
|
||||
#define CT2_CSI_FW_CTL_SET_REG 0x00027088
|
||||
|
||||
#define CT2_CSI_MAC0_CONTROL_REG 0x000270d0
|
||||
#define __CSI_MAC_RESET 0x00000010
|
||||
#define __CSI_MAC_AHB_RESET 0x00000008
|
||||
#define CT2_CSI_MAC1_CONTROL_REG 0x000270d4
|
||||
#define CT2_CSI_MAC_CONTROL_REG(__n) \
|
||||
(CT2_CSI_MAC0_CONTROL_REG + \
|
||||
(__n) * (CT2_CSI_MAC1_CONTROL_REG - CT2_CSI_MAC0_CONTROL_REG))
|
||||
|
||||
/*
|
||||
* Name semaphore registers based on usage
|
||||
*/
|
||||
#define BFA_IOC0_HBEAT_REG HOST_SEM0_INFO_REG
|
||||
#define BFA_IOC0_STATE_REG HOST_SEM1_INFO_REG
|
||||
#define BFA_IOC1_HBEAT_REG HOST_SEM2_INFO_REG
|
||||
#define BFA_IOC1_STATE_REG HOST_SEM3_INFO_REG
|
||||
#define BFA_FW_USE_COUNT HOST_SEM4_INFO_REG
|
||||
#define BFA_IOC_FAIL_SYNC HOST_SEM5_INFO_REG
|
||||
|
||||
/*
|
||||
* CT2 semaphore register locations changed
|
||||
*/
|
||||
#define CT2_BFA_IOC0_HBEAT_REG CT2_HOST_SEM0_INFO_REG
|
||||
#define CT2_BFA_IOC0_STATE_REG CT2_HOST_SEM1_INFO_REG
|
||||
#define CT2_BFA_IOC1_HBEAT_REG CT2_HOST_SEM2_INFO_REG
|
||||
#define CT2_BFA_IOC1_STATE_REG CT2_HOST_SEM3_INFO_REG
|
||||
#define CT2_BFA_FW_USE_COUNT CT2_HOST_SEM4_INFO_REG
|
||||
#define CT2_BFA_IOC_FAIL_SYNC CT2_HOST_SEM5_INFO_REG
|
||||
|
||||
#define CPE_Q_NUM(__fn, __q) (((__fn) << 2) + (__q))
|
||||
#define RME_Q_NUM(__fn, __q) (((__fn) << 2) + (__q))
|
||||
|
||||
/*
|
||||
* And corresponding host interrupt status bit field defines
|
||||
*/
|
||||
#define __HFN_INT_CPE_Q0 0x00000001U
|
||||
#define __HFN_INT_CPE_Q1 0x00000002U
|
||||
#define __HFN_INT_CPE_Q2 0x00000004U
|
||||
#define __HFN_INT_CPE_Q3 0x00000008U
|
||||
#define __HFN_INT_CPE_Q4 0x00000010U
|
||||
#define __HFN_INT_CPE_Q5 0x00000020U
|
||||
#define __HFN_INT_CPE_Q6 0x00000040U
|
||||
#define __HFN_INT_CPE_Q7 0x00000080U
|
||||
#define __HFN_INT_RME_Q0 0x00000100U
|
||||
#define __HFN_INT_RME_Q1 0x00000200U
|
||||
#define __HFN_INT_RME_Q2 0x00000400U
|
||||
#define __HFN_INT_RME_Q3 0x00000800U
|
||||
#define __HFN_INT_RME_Q4 0x00001000U
|
||||
#define __HFN_INT_RME_Q5 0x00002000U
|
||||
#define __HFN_INT_RME_Q6 0x00004000U
|
||||
#define __HFN_INT_RME_Q7 0x00008000U
|
||||
#define __HFN_INT_ERR_EMC 0x00010000U
|
||||
#define __HFN_INT_ERR_LPU0 0x00020000U
|
||||
#define __HFN_INT_ERR_LPU1 0x00040000U
|
||||
#define __HFN_INT_ERR_PSS 0x00080000U
|
||||
#define __HFN_INT_MBOX_LPU0 0x00100000U
|
||||
#define __HFN_INT_MBOX_LPU1 0x00200000U
|
||||
#define __HFN_INT_MBOX1_LPU0 0x00400000U
|
||||
#define __HFN_INT_MBOX1_LPU1 0x00800000U
|
||||
#define __HFN_INT_LL_HALT 0x01000000U
|
||||
#define __HFN_INT_CPE_MASK 0x000000ffU
|
||||
#define __HFN_INT_RME_MASK 0x0000ff00U
|
||||
#define __HFN_INT_ERR_MASK \
|
||||
(__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 | __HFN_INT_ERR_LPU1 | \
|
||||
__HFN_INT_ERR_PSS | __HFN_INT_LL_HALT)
|
||||
#define __HFN_INT_FN0_MASK \
|
||||
(__HFN_INT_CPE_Q0 | __HFN_INT_CPE_Q1 | __HFN_INT_CPE_Q2 | \
|
||||
__HFN_INT_CPE_Q3 | __HFN_INT_RME_Q0 | __HFN_INT_RME_Q1 | \
|
||||
__HFN_INT_RME_Q2 | __HFN_INT_RME_Q3 | __HFN_INT_MBOX_LPU0)
|
||||
#define __HFN_INT_FN1_MASK \
|
||||
(__HFN_INT_CPE_Q4 | __HFN_INT_CPE_Q5 | __HFN_INT_CPE_Q6 | \
|
||||
__HFN_INT_CPE_Q7 | __HFN_INT_RME_Q4 | __HFN_INT_RME_Q5 | \
|
||||
__HFN_INT_RME_Q6 | __HFN_INT_RME_Q7 | __HFN_INT_MBOX_LPU1)
|
||||
|
||||
/*
|
||||
* Host interrupt status defines for 1860
|
||||
*/
|
||||
#define __HFN_INT_MBOX_LPU0_CT2 0x00010000U
|
||||
#define __HFN_INT_MBOX_LPU1_CT2 0x00020000U
|
||||
#define __HFN_INT_ERR_PSS_CT2 0x00040000U
|
||||
#define __HFN_INT_ERR_LPU0_CT2 0x00080000U
|
||||
#define __HFN_INT_ERR_LPU1_CT2 0x00100000U
|
||||
#define __HFN_INT_CPQ_HALT_CT2 0x00200000U
|
||||
#define __HFN_INT_ERR_WGN_CT2 0x00400000U
|
||||
#define __HFN_INT_ERR_LEHRX_CT2 0x00800000U
|
||||
#define __HFN_INT_ERR_LEHTX_CT2 0x01000000U
|
||||
#define __HFN_INT_ERR_MASK_CT2 \
|
||||
(__HFN_INT_ERR_PSS_CT2 | __HFN_INT_ERR_LPU0_CT2 | \
|
||||
__HFN_INT_ERR_LPU1_CT2 | __HFN_INT_CPQ_HALT_CT2 | \
|
||||
__HFN_INT_ERR_WGN_CT2 | __HFN_INT_ERR_LEHRX_CT2 | \
|
||||
__HFN_INT_ERR_LEHTX_CT2)
|
||||
#define __HFN_INT_FN0_MASK_CT2 \
|
||||
(__HFN_INT_CPE_Q0 | __HFN_INT_CPE_Q1 | __HFN_INT_CPE_Q2 | \
|
||||
__HFN_INT_CPE_Q3 | __HFN_INT_RME_Q0 | __HFN_INT_RME_Q1 | \
|
||||
__HFN_INT_RME_Q2 | __HFN_INT_RME_Q3 | __HFN_INT_MBOX_LPU0_CT2)
|
||||
#define __HFN_INT_FN1_MASK_CT2 \
|
||||
(__HFN_INT_CPE_Q4 | __HFN_INT_CPE_Q5 | __HFN_INT_CPE_Q6 | \
|
||||
__HFN_INT_CPE_Q7 | __HFN_INT_RME_Q4 | __HFN_INT_RME_Q5 | \
|
||||
__HFN_INT_RME_Q6 | __HFN_INT_RME_Q7 | __HFN_INT_MBOX_LPU1_CT2)
|
||||
|
||||
/*
|
||||
* asic memory map.
|
||||
*/
|
||||
#define PSS_SMEM_PAGE_START 0x8000
|
||||
#define PSS_SMEM_PGNUM(_pg0, _ma) ((_pg0) + ((_ma) >> 15))
|
||||
#define PSS_SMEM_PGOFF(_ma) ((_ma) & 0x7fff)
|
||||
|
||||
#endif /* __BFI_REG_H__ */
|
564
drivers/net/ethernet/brocade/bna/bna.h
Normal file
564
drivers/net/ethernet/brocade/bna/bna.h
Normal file
|
@ -0,0 +1,564 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
#ifndef __BNA_H__
|
||||
#define __BNA_H__
|
||||
|
||||
#include "bfa_defs.h"
|
||||
#include "bfa_ioc.h"
|
||||
#include "bfi_enet.h"
|
||||
#include "bna_types.h"
|
||||
|
||||
extern const u32 bna_napi_dim_vector[][BNA_BIAS_T_MAX];
|
||||
|
||||
/* Macros and constants */
|
||||
|
||||
#define BNA_IOC_TIMER_FREQ 200
|
||||
|
||||
/* Log string size */
|
||||
#define BNA_MESSAGE_SIZE 256
|
||||
|
||||
#define bna_is_small_rxq(_id) ((_id) & 0x1)
|
||||
|
||||
#define BNA_MAC_IS_EQUAL(_mac1, _mac2) \
|
||||
(!memcmp((_mac1), (_mac2), sizeof(mac_t)))
|
||||
|
||||
#define BNA_POWER_OF_2(x) (((x) & ((x) - 1)) == 0)
|
||||
|
||||
#define BNA_TO_POWER_OF_2(x) \
|
||||
do { \
|
||||
int _shift = 0; \
|
||||
while ((x) && (x) != 1) { \
|
||||
(x) >>= 1; \
|
||||
_shift++; \
|
||||
} \
|
||||
(x) <<= _shift; \
|
||||
} while (0)
|
||||
|
||||
#define BNA_TO_POWER_OF_2_HIGH(x) \
|
||||
do { \
|
||||
int n = 1; \
|
||||
while (n < (x)) \
|
||||
n <<= 1; \
|
||||
(x) = n; \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* input : _addr-> os dma addr in host endian format,
|
||||
* output : _bna_dma_addr-> pointer to hw dma addr
|
||||
*/
|
||||
#define BNA_SET_DMA_ADDR(_addr, _bna_dma_addr) \
|
||||
do { \
|
||||
u64 tmp_addr = \
|
||||
cpu_to_be64((u64)(_addr)); \
|
||||
(_bna_dma_addr)->msb = ((struct bna_dma_addr *)&tmp_addr)->msb; \
|
||||
(_bna_dma_addr)->lsb = ((struct bna_dma_addr *)&tmp_addr)->lsb; \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* input : _bna_dma_addr-> pointer to hw dma addr
|
||||
* output : _addr-> os dma addr in host endian format
|
||||
*/
|
||||
#define BNA_GET_DMA_ADDR(_bna_dma_addr, _addr) \
|
||||
do { \
|
||||
(_addr) = ((((u64)ntohl((_bna_dma_addr)->msb))) << 32) \
|
||||
| ((ntohl((_bna_dma_addr)->lsb) & 0xffffffff)); \
|
||||
} while (0)
|
||||
|
||||
#define containing_rec(addr, type, field) \
|
||||
((type *)((unsigned char *)(addr) - \
|
||||
(unsigned char *)(&((type *)0)->field)))
|
||||
|
||||
#define BNA_TXQ_WI_NEEDED(_vectors) (((_vectors) + 3) >> 2)
|
||||
|
||||
/* TxQ element is 64 bytes */
|
||||
#define BNA_TXQ_PAGE_INDEX_MAX (PAGE_SIZE >> 6)
|
||||
#define BNA_TXQ_PAGE_INDEX_MAX_SHIFT (PAGE_SHIFT - 6)
|
||||
|
||||
#define BNA_TXQ_QPGE_PTR_GET(_qe_idx, _qpt_ptr, _qe_ptr, _qe_ptr_range) \
|
||||
{ \
|
||||
unsigned int page_index; /* index within a page */ \
|
||||
void *page_addr; \
|
||||
page_index = (_qe_idx) & (BNA_TXQ_PAGE_INDEX_MAX - 1); \
|
||||
(_qe_ptr_range) = (BNA_TXQ_PAGE_INDEX_MAX - page_index); \
|
||||
page_addr = (_qpt_ptr)[((_qe_idx) >> BNA_TXQ_PAGE_INDEX_MAX_SHIFT)];\
|
||||
(_qe_ptr) = &((struct bna_txq_entry *)(page_addr))[page_index]; \
|
||||
}
|
||||
|
||||
/* RxQ element is 8 bytes */
|
||||
#define BNA_RXQ_PAGE_INDEX_MAX (PAGE_SIZE >> 3)
|
||||
#define BNA_RXQ_PAGE_INDEX_MAX_SHIFT (PAGE_SHIFT - 3)
|
||||
|
||||
#define BNA_RXQ_QPGE_PTR_GET(_qe_idx, _qpt_ptr, _qe_ptr, _qe_ptr_range) \
|
||||
{ \
|
||||
unsigned int page_index; /* index within a page */ \
|
||||
void *page_addr; \
|
||||
page_index = (_qe_idx) & (BNA_RXQ_PAGE_INDEX_MAX - 1); \
|
||||
(_qe_ptr_range) = (BNA_RXQ_PAGE_INDEX_MAX - page_index); \
|
||||
page_addr = (_qpt_ptr)[((_qe_idx) >> \
|
||||
BNA_RXQ_PAGE_INDEX_MAX_SHIFT)]; \
|
||||
(_qe_ptr) = &((struct bna_rxq_entry *)(page_addr))[page_index]; \
|
||||
}
|
||||
|
||||
/* CQ element is 16 bytes */
|
||||
#define BNA_CQ_PAGE_INDEX_MAX (PAGE_SIZE >> 4)
|
||||
#define BNA_CQ_PAGE_INDEX_MAX_SHIFT (PAGE_SHIFT - 4)
|
||||
|
||||
#define BNA_CQ_QPGE_PTR_GET(_qe_idx, _qpt_ptr, _qe_ptr, _qe_ptr_range) \
|
||||
{ \
|
||||
unsigned int page_index; /* index within a page */ \
|
||||
void *page_addr; \
|
||||
\
|
||||
page_index = (_qe_idx) & (BNA_CQ_PAGE_INDEX_MAX - 1); \
|
||||
(_qe_ptr_range) = (BNA_CQ_PAGE_INDEX_MAX - page_index); \
|
||||
page_addr = (_qpt_ptr)[((_qe_idx) >> \
|
||||
BNA_CQ_PAGE_INDEX_MAX_SHIFT)]; \
|
||||
(_qe_ptr) = &((struct bna_cq_entry *)(page_addr))[page_index];\
|
||||
}
|
||||
|
||||
#define BNA_QE_INDX_2_PTR(_cast, _qe_idx, _q_base) \
|
||||
(&((_cast *)(_q_base))[(_qe_idx)])
|
||||
|
||||
#define BNA_QE_INDX_RANGE(_qe_idx, _q_depth) ((_q_depth) - (_qe_idx))
|
||||
|
||||
#define BNA_QE_INDX_ADD(_qe_idx, _qe_num, _q_depth) \
|
||||
((_qe_idx) = ((_qe_idx) + (_qe_num)) & ((_q_depth) - 1))
|
||||
|
||||
#define BNA_QE_INDX_INC(_idx, _q_depth) BNA_QE_INDX_ADD(_idx, 1, _q_depth)
|
||||
|
||||
#define BNA_Q_INDEX_CHANGE(_old_idx, _updated_idx, _q_depth) \
|
||||
(((_updated_idx) - (_old_idx)) & ((_q_depth) - 1))
|
||||
|
||||
#define BNA_QE_FREE_CNT(_q_ptr, _q_depth) \
|
||||
(((_q_ptr)->consumer_index - (_q_ptr)->producer_index - 1) & \
|
||||
((_q_depth) - 1))
|
||||
|
||||
#define BNA_QE_IN_USE_CNT(_q_ptr, _q_depth) \
|
||||
((((_q_ptr)->producer_index - (_q_ptr)->consumer_index)) & \
|
||||
(_q_depth - 1))
|
||||
|
||||
#define BNA_Q_GET_CI(_q_ptr) ((_q_ptr)->q.consumer_index)
|
||||
|
||||
#define BNA_Q_GET_PI(_q_ptr) ((_q_ptr)->q.producer_index)
|
||||
|
||||
#define BNA_Q_PI_ADD(_q_ptr, _num) \
|
||||
(_q_ptr)->q.producer_index = \
|
||||
(((_q_ptr)->q.producer_index + (_num)) & \
|
||||
((_q_ptr)->q.q_depth - 1))
|
||||
|
||||
#define BNA_Q_CI_ADD(_q_ptr, _num) \
|
||||
(_q_ptr)->q.consumer_index = \
|
||||
(((_q_ptr)->q.consumer_index + (_num)) \
|
||||
& ((_q_ptr)->q.q_depth - 1))
|
||||
|
||||
#define BNA_Q_FREE_COUNT(_q_ptr) \
|
||||
(BNA_QE_FREE_CNT(&((_q_ptr)->q), (_q_ptr)->q.q_depth))
|
||||
|
||||
#define BNA_Q_IN_USE_COUNT(_q_ptr) \
|
||||
(BNA_QE_IN_USE_CNT(&(_q_ptr)->q, (_q_ptr)->q.q_depth))
|
||||
|
||||
#define BNA_LARGE_PKT_SIZE 1000
|
||||
|
||||
#define BNA_UPDATE_PKT_CNT(_pkt, _len) \
|
||||
do { \
|
||||
if ((_len) > BNA_LARGE_PKT_SIZE) { \
|
||||
(_pkt)->large_pkt_cnt++; \
|
||||
} else { \
|
||||
(_pkt)->small_pkt_cnt++; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define call_rxf_stop_cbfn(rxf) \
|
||||
do { \
|
||||
if ((rxf)->stop_cbfn) { \
|
||||
void (*cbfn)(struct bna_rx *); \
|
||||
struct bna_rx *cbarg; \
|
||||
cbfn = (rxf)->stop_cbfn; \
|
||||
cbarg = (rxf)->stop_cbarg; \
|
||||
(rxf)->stop_cbfn = NULL; \
|
||||
(rxf)->stop_cbarg = NULL; \
|
||||
cbfn(cbarg); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define call_rxf_start_cbfn(rxf) \
|
||||
do { \
|
||||
if ((rxf)->start_cbfn) { \
|
||||
void (*cbfn)(struct bna_rx *); \
|
||||
struct bna_rx *cbarg; \
|
||||
cbfn = (rxf)->start_cbfn; \
|
||||
cbarg = (rxf)->start_cbarg; \
|
||||
(rxf)->start_cbfn = NULL; \
|
||||
(rxf)->start_cbarg = NULL; \
|
||||
cbfn(cbarg); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define call_rxf_cam_fltr_cbfn(rxf) \
|
||||
do { \
|
||||
if ((rxf)->cam_fltr_cbfn) { \
|
||||
void (*cbfn)(struct bnad *, struct bna_rx *); \
|
||||
struct bnad *cbarg; \
|
||||
cbfn = (rxf)->cam_fltr_cbfn; \
|
||||
cbarg = (rxf)->cam_fltr_cbarg; \
|
||||
(rxf)->cam_fltr_cbfn = NULL; \
|
||||
(rxf)->cam_fltr_cbarg = NULL; \
|
||||
cbfn(cbarg, rxf->rx); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define call_rxf_pause_cbfn(rxf) \
|
||||
do { \
|
||||
if ((rxf)->oper_state_cbfn) { \
|
||||
void (*cbfn)(struct bnad *, struct bna_rx *); \
|
||||
struct bnad *cbarg; \
|
||||
cbfn = (rxf)->oper_state_cbfn; \
|
||||
cbarg = (rxf)->oper_state_cbarg; \
|
||||
(rxf)->oper_state_cbfn = NULL; \
|
||||
(rxf)->oper_state_cbarg = NULL; \
|
||||
cbfn(cbarg, rxf->rx); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define call_rxf_resume_cbfn(rxf) call_rxf_pause_cbfn(rxf)
|
||||
|
||||
#define is_xxx_enable(mode, bitmask, xxx) ((bitmask & xxx) && (mode & xxx))
|
||||
|
||||
#define is_xxx_disable(mode, bitmask, xxx) ((bitmask & xxx) && !(mode & xxx))
|
||||
|
||||
#define xxx_enable(mode, bitmask, xxx) \
|
||||
do { \
|
||||
bitmask |= xxx; \
|
||||
mode |= xxx; \
|
||||
} while (0)
|
||||
|
||||
#define xxx_disable(mode, bitmask, xxx) \
|
||||
do { \
|
||||
bitmask |= xxx; \
|
||||
mode &= ~xxx; \
|
||||
} while (0)
|
||||
|
||||
#define xxx_inactive(mode, bitmask, xxx) \
|
||||
do { \
|
||||
bitmask &= ~xxx; \
|
||||
mode &= ~xxx; \
|
||||
} while (0)
|
||||
|
||||
#define is_promisc_enable(mode, bitmask) \
|
||||
is_xxx_enable(mode, bitmask, BNA_RXMODE_PROMISC)
|
||||
|
||||
#define is_promisc_disable(mode, bitmask) \
|
||||
is_xxx_disable(mode, bitmask, BNA_RXMODE_PROMISC)
|
||||
|
||||
#define promisc_enable(mode, bitmask) \
|
||||
xxx_enable(mode, bitmask, BNA_RXMODE_PROMISC)
|
||||
|
||||
#define promisc_disable(mode, bitmask) \
|
||||
xxx_disable(mode, bitmask, BNA_RXMODE_PROMISC)
|
||||
|
||||
#define promisc_inactive(mode, bitmask) \
|
||||
xxx_inactive(mode, bitmask, BNA_RXMODE_PROMISC)
|
||||
|
||||
#define is_default_enable(mode, bitmask) \
|
||||
is_xxx_enable(mode, bitmask, BNA_RXMODE_DEFAULT)
|
||||
|
||||
#define is_default_disable(mode, bitmask) \
|
||||
is_xxx_disable(mode, bitmask, BNA_RXMODE_DEFAULT)
|
||||
|
||||
#define default_enable(mode, bitmask) \
|
||||
xxx_enable(mode, bitmask, BNA_RXMODE_DEFAULT)
|
||||
|
||||
#define default_disable(mode, bitmask) \
|
||||
xxx_disable(mode, bitmask, BNA_RXMODE_DEFAULT)
|
||||
|
||||
#define default_inactive(mode, bitmask) \
|
||||
xxx_inactive(mode, bitmask, BNA_RXMODE_DEFAULT)
|
||||
|
||||
#define is_allmulti_enable(mode, bitmask) \
|
||||
is_xxx_enable(mode, bitmask, BNA_RXMODE_ALLMULTI)
|
||||
|
||||
#define is_allmulti_disable(mode, bitmask) \
|
||||
is_xxx_disable(mode, bitmask, BNA_RXMODE_ALLMULTI)
|
||||
|
||||
#define allmulti_enable(mode, bitmask) \
|
||||
xxx_enable(mode, bitmask, BNA_RXMODE_ALLMULTI)
|
||||
|
||||
#define allmulti_disable(mode, bitmask) \
|
||||
xxx_disable(mode, bitmask, BNA_RXMODE_ALLMULTI)
|
||||
|
||||
#define allmulti_inactive(mode, bitmask) \
|
||||
xxx_inactive(mode, bitmask, BNA_RXMODE_ALLMULTI)
|
||||
|
||||
#define GET_RXQS(rxp, q0, q1) do { \
|
||||
switch ((rxp)->type) { \
|
||||
case BNA_RXP_SINGLE: \
|
||||
(q0) = rxp->rxq.single.only; \
|
||||
(q1) = NULL; \
|
||||
break; \
|
||||
case BNA_RXP_SLR: \
|
||||
(q0) = rxp->rxq.slr.large; \
|
||||
(q1) = rxp->rxq.slr.small; \
|
||||
break; \
|
||||
case BNA_RXP_HDS: \
|
||||
(q0) = rxp->rxq.hds.data; \
|
||||
(q1) = rxp->rxq.hds.hdr; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define bna_tx_rid_mask(_bna) ((_bna)->tx_mod.rid_mask)
|
||||
|
||||
#define bna_rx_rid_mask(_bna) ((_bna)->rx_mod.rid_mask)
|
||||
|
||||
#define bna_tx_from_rid(_bna, _rid, _tx) \
|
||||
do { \
|
||||
struct bna_tx_mod *__tx_mod = &(_bna)->tx_mod; \
|
||||
struct bna_tx *__tx; \
|
||||
struct list_head *qe; \
|
||||
_tx = NULL; \
|
||||
list_for_each(qe, &__tx_mod->tx_active_q) { \
|
||||
__tx = (struct bna_tx *)qe; \
|
||||
if (__tx->rid == (_rid)) { \
|
||||
(_tx) = __tx; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define bna_rx_from_rid(_bna, _rid, _rx) \
|
||||
do { \
|
||||
struct bna_rx_mod *__rx_mod = &(_bna)->rx_mod; \
|
||||
struct bna_rx *__rx; \
|
||||
struct list_head *qe; \
|
||||
_rx = NULL; \
|
||||
list_for_each(qe, &__rx_mod->rx_active_q) { \
|
||||
__rx = (struct bna_rx *)qe; \
|
||||
if (__rx->rid == (_rid)) { \
|
||||
(_rx) = __rx; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} 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 */
|
||||
|
||||
static inline struct bna_mac *bna_mac_find(struct list_head *q, u8 *addr)
|
||||
{
|
||||
struct bna_mac *mac = NULL;
|
||||
struct list_head *qe;
|
||||
list_for_each(qe, q) {
|
||||
if (BNA_MAC_IS_EQUAL(((struct bna_mac *)qe)->addr, addr)) {
|
||||
mac = (struct bna_mac *)qe;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return mac;
|
||||
}
|
||||
|
||||
#define bna_attr(_bna) (&(_bna)->ioceth.attr)
|
||||
|
||||
/* Function prototypes */
|
||||
|
||||
/* BNA */
|
||||
|
||||
/* FW response handlers */
|
||||
void bna_bfi_stats_clr_rsp(struct bna *bna, struct bfi_msgq_mhdr *msghdr);
|
||||
|
||||
/* APIs for BNAD */
|
||||
void bna_res_req(struct bna_res_info *res_info);
|
||||
void bna_mod_res_req(struct bna *bna, struct bna_res_info *res_info);
|
||||
void bna_init(struct bna *bna, struct bnad *bnad,
|
||||
struct bfa_pcidev *pcidev,
|
||||
struct bna_res_info *res_info);
|
||||
void bna_mod_init(struct bna *bna, struct bna_res_info *res_info);
|
||||
void bna_uninit(struct bna *bna);
|
||||
int bna_num_txq_set(struct bna *bna, int num_txq);
|
||||
int bna_num_rxp_set(struct bna *bna, int num_rxp);
|
||||
void bna_hw_stats_get(struct bna *bna);
|
||||
|
||||
/* APIs for RxF */
|
||||
struct bna_mac *bna_cam_mod_mac_get(struct list_head *head);
|
||||
void bna_cam_mod_mac_put(struct list_head *tail, struct bna_mac *mac);
|
||||
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,
|
||||
struct bna_mcam_handle *handle);
|
||||
|
||||
/* MBOX */
|
||||
|
||||
/* API for BNAD */
|
||||
void bna_mbox_handler(struct bna *bna, u32 intr_status);
|
||||
|
||||
/* ETHPORT */
|
||||
|
||||
/* Callbacks for RX */
|
||||
void bna_ethport_cb_rx_started(struct bna_ethport *ethport);
|
||||
void bna_ethport_cb_rx_stopped(struct bna_ethport *ethport);
|
||||
|
||||
/* TX MODULE AND TX */
|
||||
|
||||
/* FW response handelrs */
|
||||
void bna_bfi_tx_enet_start_rsp(struct bna_tx *tx,
|
||||
struct bfi_msgq_mhdr *msghdr);
|
||||
void bna_bfi_tx_enet_stop_rsp(struct bna_tx *tx,
|
||||
struct bfi_msgq_mhdr *msghdr);
|
||||
void bna_bfi_bw_update_aen(struct bna_tx_mod *tx_mod);
|
||||
|
||||
/* APIs for BNA */
|
||||
void bna_tx_mod_init(struct bna_tx_mod *tx_mod, struct bna *bna,
|
||||
struct bna_res_info *res_info);
|
||||
void bna_tx_mod_uninit(struct bna_tx_mod *tx_mod);
|
||||
|
||||
/* APIs for ENET */
|
||||
void bna_tx_mod_start(struct bna_tx_mod *tx_mod, enum bna_tx_type type);
|
||||
void bna_tx_mod_stop(struct bna_tx_mod *tx_mod, enum bna_tx_type type);
|
||||
void bna_tx_mod_fail(struct bna_tx_mod *tx_mod);
|
||||
|
||||
/* APIs for BNAD */
|
||||
void bna_tx_res_req(int num_txq, int txq_depth,
|
||||
struct bna_res_info *res_info);
|
||||
struct bna_tx *bna_tx_create(struct bna *bna, struct bnad *bnad,
|
||||
struct bna_tx_config *tx_cfg,
|
||||
const struct bna_tx_event_cbfn *tx_cbfn,
|
||||
struct bna_res_info *res_info, void *priv);
|
||||
void bna_tx_destroy(struct bna_tx *tx);
|
||||
void bna_tx_enable(struct bna_tx *tx);
|
||||
void bna_tx_disable(struct bna_tx *tx, enum bna_cleanup_type type,
|
||||
void (*cbfn)(void *, struct bna_tx *));
|
||||
void bna_tx_cleanup_complete(struct bna_tx *tx);
|
||||
void bna_tx_coalescing_timeo_set(struct bna_tx *tx, int coalescing_timeo);
|
||||
|
||||
/* RX MODULE, RX, RXF */
|
||||
|
||||
/* FW response handlers */
|
||||
void bna_bfi_rx_enet_start_rsp(struct bna_rx *rx,
|
||||
struct bfi_msgq_mhdr *msghdr);
|
||||
void bna_bfi_rx_enet_stop_rsp(struct bna_rx *rx,
|
||||
struct bfi_msgq_mhdr *msghdr);
|
||||
void bna_bfi_rxf_cfg_rsp(struct bna_rxf *rxf, struct bfi_msgq_mhdr *msghdr);
|
||||
void bna_bfi_rxf_mcast_add_rsp(struct bna_rxf *rxf,
|
||||
struct bfi_msgq_mhdr *msghdr);
|
||||
void bna_bfi_rxf_ucast_set_rsp(struct bna_rxf *rxf,
|
||||
struct bfi_msgq_mhdr *msghdr);
|
||||
|
||||
/* APIs for BNA */
|
||||
void bna_rx_mod_init(struct bna_rx_mod *rx_mod, struct bna *bna,
|
||||
struct bna_res_info *res_info);
|
||||
void bna_rx_mod_uninit(struct bna_rx_mod *rx_mod);
|
||||
|
||||
/* APIs for ENET */
|
||||
void bna_rx_mod_start(struct bna_rx_mod *rx_mod, enum bna_rx_type type);
|
||||
void bna_rx_mod_stop(struct bna_rx_mod *rx_mod, enum bna_rx_type type);
|
||||
void bna_rx_mod_fail(struct bna_rx_mod *rx_mod);
|
||||
|
||||
/* APIs for BNAD */
|
||||
void bna_rx_res_req(struct bna_rx_config *rx_config,
|
||||
struct bna_res_info *res_info);
|
||||
struct bna_rx *bna_rx_create(struct bna *bna, struct bnad *bnad,
|
||||
struct bna_rx_config *rx_cfg,
|
||||
const struct bna_rx_event_cbfn *rx_cbfn,
|
||||
struct bna_res_info *res_info, void *priv);
|
||||
void bna_rx_destroy(struct bna_rx *rx);
|
||||
void bna_rx_enable(struct bna_rx *rx);
|
||||
void bna_rx_disable(struct bna_rx *rx, enum bna_cleanup_type type,
|
||||
void (*cbfn)(void *, struct bna_rx *));
|
||||
void bna_rx_cleanup_complete(struct bna_rx *rx);
|
||||
void bna_rx_coalescing_timeo_set(struct bna_rx *rx, int coalescing_timeo);
|
||||
void bna_rx_dim_reconfig(struct bna *bna, const u32 vector[][BNA_BIAS_T_MAX]);
|
||||
void bna_rx_dim_update(struct bna_ccb *ccb);
|
||||
enum bna_cb_status
|
||||
bna_rx_ucast_set(struct bna_rx *rx, u8 *ucmac,
|
||||
void (*cbfn)(struct bnad *, struct bna_rx *));
|
||||
enum bna_cb_status
|
||||
bna_rx_ucast_add(struct bna_rx *rx, u8* ucmac,
|
||||
void (*cbfn)(struct bnad *, struct bna_rx *));
|
||||
enum bna_cb_status
|
||||
bna_rx_ucast_del(struct bna_rx *rx, u8 *ucmac,
|
||||
void (*cbfn)(struct bnad *, struct bna_rx *));
|
||||
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,
|
||||
void (*cbfn)(struct bnad *, struct bna_rx *));
|
||||
enum bna_cb_status
|
||||
bna_rx_mcast_listset(struct bna_rx *rx, int count, u8 *mcmac,
|
||||
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
|
||||
bna_rx_mode_set(struct bna_rx *rx, enum bna_rxmode rxmode,
|
||||
enum bna_rxmode bitmask,
|
||||
void (*cbfn)(struct bnad *, struct bna_rx *));
|
||||
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_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 */
|
||||
|
||||
/* API for RX */
|
||||
int bna_enet_mtu_get(struct bna_enet *enet);
|
||||
|
||||
/* Callbacks for TX, RX */
|
||||
void bna_enet_cb_tx_stopped(struct bna_enet *enet);
|
||||
void bna_enet_cb_rx_stopped(struct bna_enet *enet);
|
||||
|
||||
/* API for BNAD */
|
||||
void bna_enet_enable(struct bna_enet *enet);
|
||||
void bna_enet_disable(struct bna_enet *enet, enum bna_cleanup_type type,
|
||||
void (*cbfn)(void *));
|
||||
void bna_enet_pause_config(struct bna_enet *enet,
|
||||
struct bna_pause_config *pause_config,
|
||||
void (*cbfn)(struct bnad *));
|
||||
void bna_enet_mtu_set(struct bna_enet *enet, int mtu,
|
||||
void (*cbfn)(struct bnad *));
|
||||
void bna_enet_perm_mac_get(struct bna_enet *enet, mac_t *mac);
|
||||
|
||||
/* IOCETH */
|
||||
|
||||
/* APIs for BNAD */
|
||||
void bna_ioceth_enable(struct bna_ioceth *ioceth);
|
||||
void bna_ioceth_disable(struct bna_ioceth *ioceth,
|
||||
enum bna_cleanup_type type);
|
||||
|
||||
/* BNAD */
|
||||
|
||||
/* Callbacks for ENET */
|
||||
void bnad_cb_ethport_link_status(struct bnad *bnad,
|
||||
enum bna_link_status status);
|
||||
|
||||
/* Callbacks for IOCETH */
|
||||
void bnad_cb_ioceth_ready(struct bnad *bnad);
|
||||
void bnad_cb_ioceth_failed(struct bnad *bnad);
|
||||
void bnad_cb_ioceth_disabled(struct bnad *bnad);
|
||||
void bnad_cb_mbox_intr_enable(struct bnad *bnad);
|
||||
void bnad_cb_mbox_intr_disable(struct bnad *bnad);
|
||||
|
||||
/* Callbacks for BNA */
|
||||
void bnad_cb_stats_get(struct bnad *bnad, enum bna_cb_status status,
|
||||
struct bna_stats *stats);
|
||||
|
||||
#endif /* __BNA_H__ */
|
2158
drivers/net/ethernet/brocade/bna/bna_enet.c
Normal file
2158
drivers/net/ethernet/brocade/bna/bna_enet.c
Normal file
File diff suppressed because it is too large
Load diff
410
drivers/net/ethernet/brocade/bna/bna_hw_defs.h
Normal file
410
drivers/net/ethernet/brocade/bna/bna_hw_defs.h
Normal file
|
@ -0,0 +1,410 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
/* File for interrupt macros and functions */
|
||||
|
||||
#ifndef __BNA_HW_DEFS_H__
|
||||
#define __BNA_HW_DEFS_H__
|
||||
|
||||
#include "bfi_reg.h"
|
||||
|
||||
/* SW imposed limits */
|
||||
|
||||
#define BFI_ENET_DEF_TXQ 1
|
||||
#define BFI_ENET_DEF_RXP 1
|
||||
#define BFI_ENET_DEF_UCAM 1
|
||||
#define BFI_ENET_DEF_RITSZ 1
|
||||
|
||||
#define BFI_ENET_MAX_MCAM 256
|
||||
|
||||
#define BFI_INVALID_RID -1
|
||||
|
||||
#define BFI_IBIDX_SIZE 4
|
||||
|
||||
#define BFI_VLAN_WORD_SHIFT 5 /* 32 bits */
|
||||
#define BFI_VLAN_WORD_MASK 0x1F
|
||||
#define BFI_VLAN_BLOCK_SHIFT 9 /* 512 bits */
|
||||
#define BFI_VLAN_BMASK_ALL 0xFF
|
||||
|
||||
#define BFI_COALESCING_TIMER_UNIT 5 /* 5us */
|
||||
#define BFI_MAX_COALESCING_TIMEO 0xFF /* in 5us units */
|
||||
#define BFI_MAX_INTERPKT_COUNT 0xFF
|
||||
#define BFI_MAX_INTERPKT_TIMEO 0xF /* in 0.5us units */
|
||||
#define BFI_TX_COALESCING_TIMEO 20 /* 20 * 5 = 100us */
|
||||
#define BFI_TX_INTERPKT_COUNT 12 /* Pkt Cnt = 12 */
|
||||
#define BFI_TX_INTERPKT_TIMEO 15 /* 15 * 0.5 = 7.5us */
|
||||
#define BFI_RX_COALESCING_TIMEO 12 /* 12 * 5 = 60us */
|
||||
#define BFI_RX_INTERPKT_COUNT 6 /* Pkt Cnt = 6 */
|
||||
#define BFI_RX_INTERPKT_TIMEO 3 /* 3 * 0.5 = 1.5us */
|
||||
|
||||
#define BFI_TXQ_WI_SIZE 64 /* bytes */
|
||||
#define BFI_RXQ_WI_SIZE 8 /* bytes */
|
||||
#define BFI_CQ_WI_SIZE 16 /* bytes */
|
||||
#define BFI_TX_MAX_WRR_QUOTA 0xFFF
|
||||
|
||||
#define BFI_TX_MAX_VECTORS_PER_WI 4
|
||||
#define BFI_TX_MAX_VECTORS_PER_PKT 0xFF
|
||||
#define BFI_TX_MAX_DATA_PER_VECTOR 0xFFFF
|
||||
#define BFI_TX_MAX_DATA_PER_PKT 0xFFFFFF
|
||||
|
||||
/* Small Q buffer size */
|
||||
#define BFI_SMALL_RXBUF_SIZE 128
|
||||
|
||||
#define BFI_TX_MAX_PRIO 8
|
||||
#define BFI_TX_PRIO_MAP_ALL 0xFF
|
||||
|
||||
/*
|
||||
*
|
||||
* Register definitions and macros
|
||||
*
|
||||
*/
|
||||
|
||||
#define BNA_PCI_REG_CT_ADDRSZ (0x40000)
|
||||
|
||||
#define ct_reg_addr_init(_bna, _pcidev) \
|
||||
{ \
|
||||
struct bna_reg_offset reg_offset[] = \
|
||||
{{HOSTFN0_INT_STATUS, HOSTFN0_INT_MSK}, \
|
||||
{HOSTFN1_INT_STATUS, HOSTFN1_INT_MSK}, \
|
||||
{HOSTFN2_INT_STATUS, HOSTFN2_INT_MSK}, \
|
||||
{HOSTFN3_INT_STATUS, HOSTFN3_INT_MSK} }; \
|
||||
\
|
||||
(_bna)->regs.fn_int_status = (_pcidev)->pci_bar_kva + \
|
||||
reg_offset[(_pcidev)->pci_func].fn_int_status;\
|
||||
(_bna)->regs.fn_int_mask = (_pcidev)->pci_bar_kva + \
|
||||
reg_offset[(_pcidev)->pci_func].fn_int_mask;\
|
||||
}
|
||||
|
||||
#define ct_bit_defn_init(_bna, _pcidev) \
|
||||
{ \
|
||||
(_bna)->bits.mbox_status_bits = (__HFN_INT_MBOX_LPU0 | \
|
||||
__HFN_INT_MBOX_LPU1); \
|
||||
(_bna)->bits.mbox_mask_bits = (__HFN_INT_MBOX_LPU0 | \
|
||||
__HFN_INT_MBOX_LPU1); \
|
||||
(_bna)->bits.error_status_bits = (__HFN_INT_ERR_MASK); \
|
||||
(_bna)->bits.error_mask_bits = (__HFN_INT_ERR_MASK); \
|
||||
(_bna)->bits.halt_status_bits = __HFN_INT_LL_HALT; \
|
||||
(_bna)->bits.halt_mask_bits = __HFN_INT_LL_HALT; \
|
||||
}
|
||||
|
||||
#define ct2_reg_addr_init(_bna, _pcidev) \
|
||||
{ \
|
||||
(_bna)->regs.fn_int_status = (_pcidev)->pci_bar_kva + \
|
||||
CT2_HOSTFN_INT_STATUS; \
|
||||
(_bna)->regs.fn_int_mask = (_pcidev)->pci_bar_kva + \
|
||||
CT2_HOSTFN_INTR_MASK; \
|
||||
}
|
||||
|
||||
#define ct2_bit_defn_init(_bna, _pcidev) \
|
||||
{ \
|
||||
(_bna)->bits.mbox_status_bits = (__HFN_INT_MBOX_LPU0_CT2 | \
|
||||
__HFN_INT_MBOX_LPU1_CT2); \
|
||||
(_bna)->bits.mbox_mask_bits = (__HFN_INT_MBOX_LPU0_CT2 | \
|
||||
__HFN_INT_MBOX_LPU1_CT2); \
|
||||
(_bna)->bits.error_status_bits = (__HFN_INT_ERR_MASK_CT2); \
|
||||
(_bna)->bits.error_mask_bits = (__HFN_INT_ERR_MASK_CT2); \
|
||||
(_bna)->bits.halt_status_bits = __HFN_INT_CPQ_HALT_CT2; \
|
||||
(_bna)->bits.halt_mask_bits = __HFN_INT_CPQ_HALT_CT2; \
|
||||
}
|
||||
|
||||
#define bna_reg_addr_init(_bna, _pcidev) \
|
||||
{ \
|
||||
switch ((_pcidev)->device_id) { \
|
||||
case PCI_DEVICE_ID_BROCADE_CT: \
|
||||
ct_reg_addr_init((_bna), (_pcidev)); \
|
||||
ct_bit_defn_init((_bna), (_pcidev)); \
|
||||
break; \
|
||||
case BFA_PCI_DEVICE_ID_CT2: \
|
||||
ct2_reg_addr_init((_bna), (_pcidev)); \
|
||||
ct2_bit_defn_init((_bna), (_pcidev)); \
|
||||
break; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define bna_port_id_get(_bna) ((_bna)->ioceth.ioc.port_id)
|
||||
|
||||
/* Interrupt related bits, flags and macros */
|
||||
|
||||
#define IB_STATUS_BITS 0x0000ffff
|
||||
|
||||
#define BNA_IS_MBOX_INTR(_bna, _intr_status) \
|
||||
((_intr_status) & (_bna)->bits.mbox_status_bits)
|
||||
|
||||
#define BNA_IS_HALT_INTR(_bna, _intr_status) \
|
||||
((_intr_status) & (_bna)->bits.halt_status_bits)
|
||||
|
||||
#define BNA_IS_ERR_INTR(_bna, _intr_status) \
|
||||
((_intr_status) & (_bna)->bits.error_status_bits)
|
||||
|
||||
#define BNA_IS_MBOX_ERR_INTR(_bna, _intr_status) \
|
||||
(BNA_IS_MBOX_INTR(_bna, _intr_status) | \
|
||||
BNA_IS_ERR_INTR(_bna, _intr_status))
|
||||
|
||||
#define BNA_IS_INTX_DATA_INTR(_intr_status) \
|
||||
((_intr_status) & IB_STATUS_BITS)
|
||||
|
||||
#define bna_halt_clear(_bna) \
|
||||
do { \
|
||||
u32 init_halt; \
|
||||
init_halt = readl((_bna)->ioceth.ioc.ioc_regs.ll_halt); \
|
||||
init_halt &= ~__FW_INIT_HALT_P; \
|
||||
writel(init_halt, (_bna)->ioceth.ioc.ioc_regs.ll_halt); \
|
||||
init_halt = readl((_bna)->ioceth.ioc.ioc_regs.ll_halt); \
|
||||
} while (0)
|
||||
|
||||
#define bna_intx_disable(_bna, _cur_mask) \
|
||||
{ \
|
||||
(_cur_mask) = readl((_bna)->regs.fn_int_mask); \
|
||||
writel(0xffffffff, (_bna)->regs.fn_int_mask); \
|
||||
}
|
||||
|
||||
#define bna_intx_enable(bna, new_mask) \
|
||||
writel((new_mask), (bna)->regs.fn_int_mask)
|
||||
#define bna_mbox_intr_disable(bna) \
|
||||
do { \
|
||||
u32 mask; \
|
||||
mask = readl((bna)->regs.fn_int_mask); \
|
||||
writel((mask | (bna)->bits.mbox_mask_bits | \
|
||||
(bna)->bits.error_mask_bits), (bna)->regs.fn_int_mask); \
|
||||
mask = readl((bna)->regs.fn_int_mask); \
|
||||
} while (0)
|
||||
|
||||
#define bna_mbox_intr_enable(bna) \
|
||||
do { \
|
||||
u32 mask; \
|
||||
mask = readl((bna)->regs.fn_int_mask); \
|
||||
writel((mask & ~((bna)->bits.mbox_mask_bits | \
|
||||
(bna)->bits.error_mask_bits)), (bna)->regs.fn_int_mask);\
|
||||
mask = readl((bna)->regs.fn_int_mask); \
|
||||
} while (0)
|
||||
|
||||
#define bna_intr_status_get(_bna, _status) \
|
||||
{ \
|
||||
(_status) = readl((_bna)->regs.fn_int_status); \
|
||||
if (_status) { \
|
||||
writel(((_status) & ~(_bna)->bits.mbox_status_bits), \
|
||||
(_bna)->regs.fn_int_status); \
|
||||
} \
|
||||
}
|
||||
|
||||
/*
|
||||
* MAX ACK EVENTS : No. of acks that can be accumulated in driver,
|
||||
* before acking to h/w. The no. of bits is 16 in the doorbell register,
|
||||
* however we keep this limited to 15 bits.
|
||||
* This is because around the edge of 64K boundary (16 bits), one
|
||||
* single poll can make the accumulated ACK counter cross the 64K boundary,
|
||||
* causing problems, when we try to ack with a value greater than 64K.
|
||||
* 15 bits (32K) should be large enough to accumulate, anyways, and the max.
|
||||
* acked events to h/w can be (32K + max poll weight) (currently 64).
|
||||
*/
|
||||
#define BNA_IB_MAX_ACK_EVENTS (1 << 15)
|
||||
|
||||
/* These macros build the data portion of the TxQ/RxQ doorbell */
|
||||
#define BNA_DOORBELL_Q_PRD_IDX(_pi) (0x80000000 | (_pi))
|
||||
#define BNA_DOORBELL_Q_STOP (0x40000000)
|
||||
|
||||
/* These macros build the data portion of the IB doorbell */
|
||||
#define BNA_DOORBELL_IB_INT_ACK(_timeout, _events) \
|
||||
(0x80000000 | ((_timeout) << 16) | (_events))
|
||||
#define BNA_DOORBELL_IB_INT_DISABLE (0x40000000)
|
||||
|
||||
/* Set the coalescing timer for the given ib */
|
||||
#define bna_ib_coalescing_timer_set(_i_dbell, _cls_timer) \
|
||||
((_i_dbell)->doorbell_ack = BNA_DOORBELL_IB_INT_ACK((_cls_timer), 0));
|
||||
|
||||
/* Acks 'events' # of events for a given ib while disabling interrupts */
|
||||
#define bna_ib_ack_disable_irq(_i_dbell, _events) \
|
||||
(writel(BNA_DOORBELL_IB_INT_ACK(0, (_events)), \
|
||||
(_i_dbell)->doorbell_addr));
|
||||
|
||||
/* Acks 'events' # of events for a given ib */
|
||||
#define bna_ib_ack(_i_dbell, _events) \
|
||||
(writel(((_i_dbell)->doorbell_ack | (_events)), \
|
||||
(_i_dbell)->doorbell_addr));
|
||||
|
||||
#define bna_ib_start(_bna, _ib, _is_regular) \
|
||||
{ \
|
||||
u32 intx_mask; \
|
||||
struct bna_ib *ib = _ib; \
|
||||
if ((ib->intr_type == BNA_INTR_T_INTX)) { \
|
||||
bna_intx_disable((_bna), intx_mask); \
|
||||
intx_mask &= ~(ib->intr_vector); \
|
||||
bna_intx_enable((_bna), intx_mask); \
|
||||
} \
|
||||
bna_ib_coalescing_timer_set(&ib->door_bell, \
|
||||
ib->coalescing_timeo); \
|
||||
if (_is_regular) \
|
||||
bna_ib_ack(&ib->door_bell, 0); \
|
||||
}
|
||||
|
||||
#define bna_ib_stop(_bna, _ib) \
|
||||
{ \
|
||||
u32 intx_mask; \
|
||||
struct bna_ib *ib = _ib; \
|
||||
writel(BNA_DOORBELL_IB_INT_DISABLE, \
|
||||
ib->door_bell.doorbell_addr); \
|
||||
if (ib->intr_type == BNA_INTR_T_INTX) { \
|
||||
bna_intx_disable((_bna), intx_mask); \
|
||||
intx_mask |= ib->intr_vector; \
|
||||
bna_intx_enable((_bna), intx_mask); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define bna_txq_prod_indx_doorbell(_tcb) \
|
||||
(writel(BNA_DOORBELL_Q_PRD_IDX((_tcb)->producer_index), \
|
||||
(_tcb)->q_dbell));
|
||||
|
||||
#define bna_rxq_prod_indx_doorbell(_rcb) \
|
||||
(writel(BNA_DOORBELL_Q_PRD_IDX((_rcb)->producer_index), \
|
||||
(_rcb)->q_dbell));
|
||||
|
||||
/* TxQ, RxQ, CQ related bits, offsets, macros */
|
||||
|
||||
/* TxQ Entry Opcodes */
|
||||
#define BNA_TXQ_WI_SEND (0x402) /* Single Frame Transmission */
|
||||
#define BNA_TXQ_WI_SEND_LSO (0x403) /* Multi-Frame Transmission */
|
||||
#define BNA_TXQ_WI_EXTENSION (0x104) /* Extension WI */
|
||||
|
||||
/* TxQ Entry Control Flags */
|
||||
#define BNA_TXQ_WI_CF_FCOE_CRC (1 << 8)
|
||||
#define BNA_TXQ_WI_CF_IPID_MODE (1 << 5)
|
||||
#define BNA_TXQ_WI_CF_INS_PRIO (1 << 4)
|
||||
#define BNA_TXQ_WI_CF_INS_VLAN (1 << 3)
|
||||
#define BNA_TXQ_WI_CF_UDP_CKSUM (1 << 2)
|
||||
#define BNA_TXQ_WI_CF_TCP_CKSUM (1 << 1)
|
||||
#define BNA_TXQ_WI_CF_IP_CKSUM (1 << 0)
|
||||
|
||||
#define BNA_TXQ_WI_L4_HDR_N_OFFSET(_hdr_size, _offset) \
|
||||
(((_hdr_size) << 10) | ((_offset) & 0x3FF))
|
||||
|
||||
/*
|
||||
* Completion Q defines
|
||||
*/
|
||||
/* CQ Entry Flags */
|
||||
#define BNA_CQ_EF_MAC_ERROR (1 << 0)
|
||||
#define BNA_CQ_EF_FCS_ERROR (1 << 1)
|
||||
#define BNA_CQ_EF_TOO_LONG (1 << 2)
|
||||
#define BNA_CQ_EF_FC_CRC_OK (1 << 3)
|
||||
|
||||
#define BNA_CQ_EF_RSVD1 (1 << 4)
|
||||
#define BNA_CQ_EF_L4_CKSUM_OK (1 << 5)
|
||||
#define BNA_CQ_EF_L3_CKSUM_OK (1 << 6)
|
||||
#define BNA_CQ_EF_HDS_HEADER (1 << 7)
|
||||
|
||||
#define BNA_CQ_EF_UDP (1 << 8)
|
||||
#define BNA_CQ_EF_TCP (1 << 9)
|
||||
#define BNA_CQ_EF_IP_OPTIONS (1 << 10)
|
||||
#define BNA_CQ_EF_IPV6 (1 << 11)
|
||||
|
||||
#define BNA_CQ_EF_IPV4 (1 << 12)
|
||||
#define BNA_CQ_EF_VLAN (1 << 13)
|
||||
#define BNA_CQ_EF_RSS (1 << 14)
|
||||
#define BNA_CQ_EF_RSVD2 (1 << 15)
|
||||
|
||||
#define BNA_CQ_EF_MCAST_MATCH (1 << 16)
|
||||
#define BNA_CQ_EF_MCAST (1 << 17)
|
||||
#define BNA_CQ_EF_BCAST (1 << 18)
|
||||
#define BNA_CQ_EF_REMOTE (1 << 19)
|
||||
|
||||
#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 */
|
||||
|
||||
struct bna_reg_offset {
|
||||
u32 fn_int_status;
|
||||
u32 fn_int_mask;
|
||||
};
|
||||
|
||||
struct bna_bit_defn {
|
||||
u32 mbox_status_bits;
|
||||
u32 mbox_mask_bits;
|
||||
u32 error_status_bits;
|
||||
u32 error_mask_bits;
|
||||
u32 halt_status_bits;
|
||||
u32 halt_mask_bits;
|
||||
};
|
||||
|
||||
struct bna_reg {
|
||||
void __iomem *fn_int_status;
|
||||
void __iomem *fn_int_mask;
|
||||
};
|
||||
|
||||
/* TxQ Vector (a.k.a. Tx-Buffer Descriptor) */
|
||||
struct bna_dma_addr {
|
||||
u32 msb;
|
||||
u32 lsb;
|
||||
};
|
||||
|
||||
struct bna_txq_wi_vector {
|
||||
u16 reserved;
|
||||
u16 length; /* Only 14 LSB are valid */
|
||||
struct bna_dma_addr host_addr; /* Tx-Buf DMA addr */
|
||||
};
|
||||
|
||||
/* TxQ Entry Structure
|
||||
*
|
||||
* BEWARE: Load values into this structure with correct endianess.
|
||||
*/
|
||||
struct bna_txq_entry {
|
||||
union {
|
||||
struct {
|
||||
u8 reserved;
|
||||
u8 num_vectors; /* number of vectors present */
|
||||
u16 opcode; /* Either */
|
||||
/* BNA_TXQ_WI_SEND or */
|
||||
/* BNA_TXQ_WI_SEND_LSO */
|
||||
u16 flags; /* OR of all the flags */
|
||||
u16 l4_hdr_size_n_offset;
|
||||
u16 vlan_tag;
|
||||
u16 lso_mss; /* Only 14 LSB are valid */
|
||||
u32 frame_length; /* Only 24 LSB are valid */
|
||||
} wi;
|
||||
|
||||
struct {
|
||||
u16 reserved;
|
||||
u16 opcode; /* Must be */
|
||||
/* BNA_TXQ_WI_EXTENSION */
|
||||
u32 reserved2[3]; /* Place holder for */
|
||||
/* removed vector (12 bytes) */
|
||||
} wi_ext;
|
||||
} hdr;
|
||||
struct bna_txq_wi_vector vector[4];
|
||||
};
|
||||
|
||||
/* RxQ Entry Structure */
|
||||
struct bna_rxq_entry { /* Rx-Buffer */
|
||||
struct bna_dma_addr host_addr; /* Rx-Buffer DMA address */
|
||||
};
|
||||
|
||||
/* CQ Entry Structure */
|
||||
struct bna_cq_entry {
|
||||
u32 flags;
|
||||
u16 vlan_tag;
|
||||
u16 length;
|
||||
u32 rss_hash;
|
||||
u8 valid;
|
||||
u8 reserved1;
|
||||
u8 reserved2;
|
||||
u8 rxq_id;
|
||||
};
|
||||
|
||||
#endif /* __BNA_HW_DEFS_H__ */
|
4017
drivers/net/ethernet/brocade/bna/bna_tx_rx.c
Normal file
4017
drivers/net/ethernet/brocade/bna/bna_tx_rx.c
Normal file
File diff suppressed because it is too large
Load diff
956
drivers/net/ethernet/brocade/bna/bna_types.h
Normal file
956
drivers/net/ethernet/brocade/bna/bna_types.h
Normal file
|
@ -0,0 +1,956 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
#ifndef __BNA_TYPES_H__
|
||||
#define __BNA_TYPES_H__
|
||||
|
||||
#include "cna.h"
|
||||
#include "bna_hw_defs.h"
|
||||
#include "bfa_cee.h"
|
||||
#include "bfa_msgq.h"
|
||||
|
||||
/* Forward declarations */
|
||||
|
||||
struct bna_mcam_handle;
|
||||
struct bna_txq;
|
||||
struct bna_tx;
|
||||
struct bna_rxq;
|
||||
struct bna_cq;
|
||||
struct bna_rx;
|
||||
struct bna_rxf;
|
||||
struct bna_enet;
|
||||
struct bna;
|
||||
struct bnad;
|
||||
|
||||
/* Enums, primitive data types */
|
||||
|
||||
enum bna_status {
|
||||
BNA_STATUS_T_DISABLED = 0,
|
||||
BNA_STATUS_T_ENABLED = 1
|
||||
};
|
||||
|
||||
enum bna_cleanup_type {
|
||||
BNA_HARD_CLEANUP = 0,
|
||||
BNA_SOFT_CLEANUP = 1
|
||||
};
|
||||
|
||||
enum bna_cb_status {
|
||||
BNA_CB_SUCCESS = 0,
|
||||
BNA_CB_FAIL = 1,
|
||||
BNA_CB_INTERRUPT = 2,
|
||||
BNA_CB_BUSY = 3,
|
||||
BNA_CB_INVALID_MAC = 4,
|
||||
BNA_CB_MCAST_LIST_FULL = 5,
|
||||
BNA_CB_UCAST_CAM_FULL = 6,
|
||||
BNA_CB_WAITING = 7,
|
||||
BNA_CB_NOT_EXEC = 8
|
||||
};
|
||||
|
||||
enum bna_res_type {
|
||||
BNA_RES_T_MEM = 1,
|
||||
BNA_RES_T_INTR = 2
|
||||
};
|
||||
|
||||
enum bna_mem_type {
|
||||
BNA_MEM_T_KVA = 1,
|
||||
BNA_MEM_T_DMA = 2
|
||||
};
|
||||
|
||||
enum bna_intr_type {
|
||||
BNA_INTR_T_INTX = 1,
|
||||
BNA_INTR_T_MSIX = 2
|
||||
};
|
||||
|
||||
enum bna_res_req_type {
|
||||
BNA_RES_MEM_T_COM = 0,
|
||||
BNA_RES_MEM_T_ATTR = 1,
|
||||
BNA_RES_MEM_T_FWTRC = 2,
|
||||
BNA_RES_MEM_T_STATS = 3,
|
||||
BNA_RES_T_MAX
|
||||
};
|
||||
|
||||
enum bna_mod_res_req_type {
|
||||
BNA_MOD_RES_MEM_T_TX_ARRAY = 0,
|
||||
BNA_MOD_RES_MEM_T_TXQ_ARRAY = 1,
|
||||
BNA_MOD_RES_MEM_T_RX_ARRAY = 2,
|
||||
BNA_MOD_RES_MEM_T_RXP_ARRAY = 3,
|
||||
BNA_MOD_RES_MEM_T_RXQ_ARRAY = 4,
|
||||
BNA_MOD_RES_MEM_T_UCMAC_ARRAY = 5,
|
||||
BNA_MOD_RES_MEM_T_MCMAC_ARRAY = 6,
|
||||
BNA_MOD_RES_MEM_T_MCHANDLE_ARRAY = 7,
|
||||
BNA_MOD_RES_T_MAX
|
||||
};
|
||||
|
||||
enum bna_tx_res_req_type {
|
||||
BNA_TX_RES_MEM_T_TCB = 0,
|
||||
BNA_TX_RES_MEM_T_UNMAPQ = 1,
|
||||
BNA_TX_RES_MEM_T_QPT = 2,
|
||||
BNA_TX_RES_MEM_T_SWQPT = 3,
|
||||
BNA_TX_RES_MEM_T_PAGE = 4,
|
||||
BNA_TX_RES_MEM_T_IBIDX = 5,
|
||||
BNA_TX_RES_INTR_T_TXCMPL = 6,
|
||||
BNA_TX_RES_T_MAX,
|
||||
};
|
||||
|
||||
enum bna_rx_mem_type {
|
||||
BNA_RX_RES_MEM_T_CCB = 0, /* CQ context */
|
||||
BNA_RX_RES_MEM_T_RCB = 1, /* CQ context */
|
||||
BNA_RX_RES_MEM_T_UNMAPHQ = 2,
|
||||
BNA_RX_RES_MEM_T_UNMAPDQ = 3,
|
||||
BNA_RX_RES_MEM_T_CQPT = 4,
|
||||
BNA_RX_RES_MEM_T_CSWQPT = 5,
|
||||
BNA_RX_RES_MEM_T_CQPT_PAGE = 6,
|
||||
BNA_RX_RES_MEM_T_HQPT = 7,
|
||||
BNA_RX_RES_MEM_T_DQPT = 8,
|
||||
BNA_RX_RES_MEM_T_HSWQPT = 9,
|
||||
BNA_RX_RES_MEM_T_DSWQPT = 10,
|
||||
BNA_RX_RES_MEM_T_DPAGE = 11,
|
||||
BNA_RX_RES_MEM_T_HPAGE = 12,
|
||||
BNA_RX_RES_MEM_T_IBIDX = 13,
|
||||
BNA_RX_RES_MEM_T_RIT = 14,
|
||||
BNA_RX_RES_T_INTR = 15,
|
||||
BNA_RX_RES_T_MAX = 16
|
||||
};
|
||||
|
||||
enum bna_tx_type {
|
||||
BNA_TX_T_REGULAR = 0,
|
||||
BNA_TX_T_LOOPBACK = 1,
|
||||
};
|
||||
|
||||
enum bna_tx_flags {
|
||||
BNA_TX_F_ENET_STARTED = 1,
|
||||
BNA_TX_F_ENABLED = 2,
|
||||
BNA_TX_F_PRIO_CHANGED = 4,
|
||||
BNA_TX_F_BW_UPDATED = 8,
|
||||
};
|
||||
|
||||
enum bna_tx_mod_flags {
|
||||
BNA_TX_MOD_F_ENET_STARTED = 1,
|
||||
BNA_TX_MOD_F_ENET_LOOPBACK = 2,
|
||||
};
|
||||
|
||||
enum bna_rx_type {
|
||||
BNA_RX_T_REGULAR = 0,
|
||||
BNA_RX_T_LOOPBACK = 1,
|
||||
};
|
||||
|
||||
enum bna_rxp_type {
|
||||
BNA_RXP_SINGLE = 1,
|
||||
BNA_RXP_SLR = 2,
|
||||
BNA_RXP_HDS = 3
|
||||
};
|
||||
|
||||
enum bna_rxmode {
|
||||
BNA_RXMODE_PROMISC = 1,
|
||||
BNA_RXMODE_DEFAULT = 2,
|
||||
BNA_RXMODE_ALLMULTI = 4
|
||||
};
|
||||
|
||||
enum bna_rx_event {
|
||||
RX_E_START = 1,
|
||||
RX_E_STOP = 2,
|
||||
RX_E_FAIL = 3,
|
||||
RX_E_STARTED = 4,
|
||||
RX_E_STOPPED = 5,
|
||||
RX_E_RXF_STARTED = 6,
|
||||
RX_E_RXF_STOPPED = 7,
|
||||
RX_E_CLEANUP_DONE = 8,
|
||||
};
|
||||
|
||||
enum bna_rx_flags {
|
||||
BNA_RX_F_ENET_STARTED = 1,
|
||||
BNA_RX_F_ENABLED = 2,
|
||||
};
|
||||
|
||||
enum bna_rx_mod_flags {
|
||||
BNA_RX_MOD_F_ENET_STARTED = 1,
|
||||
BNA_RX_MOD_F_ENET_LOOPBACK = 2,
|
||||
};
|
||||
|
||||
enum bna_rxf_flags {
|
||||
BNA_RXF_F_PAUSED = 1,
|
||||
};
|
||||
|
||||
enum bna_rxf_event {
|
||||
RXF_E_START = 1,
|
||||
RXF_E_STOP = 2,
|
||||
RXF_E_FAIL = 3,
|
||||
RXF_E_CONFIG = 4,
|
||||
RXF_E_PAUSE = 5,
|
||||
RXF_E_RESUME = 6,
|
||||
RXF_E_FW_RESP = 7,
|
||||
};
|
||||
|
||||
enum bna_enet_type {
|
||||
BNA_ENET_T_REGULAR = 0,
|
||||
BNA_ENET_T_LOOPBACK_INTERNAL = 1,
|
||||
BNA_ENET_T_LOOPBACK_EXTERNAL = 2,
|
||||
};
|
||||
|
||||
enum bna_link_status {
|
||||
BNA_LINK_DOWN = 0,
|
||||
BNA_LINK_UP = 1,
|
||||
BNA_CEE_UP = 2
|
||||
};
|
||||
|
||||
enum bna_ethport_flags {
|
||||
BNA_ETHPORT_F_ADMIN_UP = 1,
|
||||
BNA_ETHPORT_F_PORT_ENABLED = 2,
|
||||
BNA_ETHPORT_F_RX_STARTED = 4,
|
||||
};
|
||||
|
||||
enum bna_enet_flags {
|
||||
BNA_ENET_F_IOCETH_READY = 1,
|
||||
BNA_ENET_F_ENABLED = 2,
|
||||
BNA_ENET_F_PAUSE_CHANGED = 4,
|
||||
BNA_ENET_F_MTU_CHANGED = 8
|
||||
};
|
||||
|
||||
enum bna_rss_flags {
|
||||
BNA_RSS_F_RIT_PENDING = 1,
|
||||
BNA_RSS_F_CFG_PENDING = 2,
|
||||
BNA_RSS_F_STATUS_PENDING = 4,
|
||||
};
|
||||
|
||||
enum bna_mod_flags {
|
||||
BNA_MOD_F_INIT_DONE = 1,
|
||||
};
|
||||
|
||||
enum bna_pkt_rates {
|
||||
BNA_PKT_RATE_10K = 10000,
|
||||
BNA_PKT_RATE_20K = 20000,
|
||||
BNA_PKT_RATE_30K = 30000,
|
||||
BNA_PKT_RATE_40K = 40000,
|
||||
BNA_PKT_RATE_50K = 50000,
|
||||
BNA_PKT_RATE_60K = 60000,
|
||||
BNA_PKT_RATE_70K = 70000,
|
||||
BNA_PKT_RATE_80K = 80000,
|
||||
};
|
||||
|
||||
enum bna_dim_load_types {
|
||||
BNA_LOAD_T_HIGH_4 = 0, /* 80K <= r */
|
||||
BNA_LOAD_T_HIGH_3 = 1, /* 60K <= r < 80K */
|
||||
BNA_LOAD_T_HIGH_2 = 2, /* 50K <= r < 60K */
|
||||
BNA_LOAD_T_HIGH_1 = 3, /* 40K <= r < 50K */
|
||||
BNA_LOAD_T_LOW_1 = 4, /* 30K <= r < 40K */
|
||||
BNA_LOAD_T_LOW_2 = 5, /* 20K <= r < 30K */
|
||||
BNA_LOAD_T_LOW_3 = 6, /* 10K <= r < 20K */
|
||||
BNA_LOAD_T_LOW_4 = 7, /* r < 10K */
|
||||
BNA_LOAD_T_MAX = 8
|
||||
};
|
||||
|
||||
enum bna_dim_bias_types {
|
||||
BNA_BIAS_T_SMALL = 0, /* small pkts > (large pkts * 2) */
|
||||
BNA_BIAS_T_LARGE = 1, /* Not BNA_BIAS_T_SMALL */
|
||||
BNA_BIAS_T_MAX = 2
|
||||
};
|
||||
|
||||
#define BNA_MAX_NAME_SIZE 64
|
||||
struct bna_ident {
|
||||
int id;
|
||||
char name[BNA_MAX_NAME_SIZE];
|
||||
};
|
||||
|
||||
struct bna_mac {
|
||||
/* This should be the first one */
|
||||
struct list_head qe;
|
||||
u8 addr[ETH_ALEN];
|
||||
struct bna_mcam_handle *handle;
|
||||
};
|
||||
|
||||
struct bna_mem_descr {
|
||||
u32 len;
|
||||
void *kva;
|
||||
struct bna_dma_addr dma;
|
||||
};
|
||||
|
||||
struct bna_mem_info {
|
||||
enum bna_mem_type mem_type;
|
||||
u32 len;
|
||||
u32 num;
|
||||
u32 align_sz; /* 0/1 = no alignment */
|
||||
struct bna_mem_descr *mdl;
|
||||
void *cookie; /* For bnad to unmap dma later */
|
||||
};
|
||||
|
||||
struct bna_intr_descr {
|
||||
int vector;
|
||||
};
|
||||
|
||||
struct bna_intr_info {
|
||||
enum bna_intr_type intr_type;
|
||||
int num;
|
||||
struct bna_intr_descr *idl;
|
||||
};
|
||||
|
||||
union bna_res_u {
|
||||
struct bna_mem_info mem_info;
|
||||
struct bna_intr_info intr_info;
|
||||
};
|
||||
|
||||
struct bna_res_info {
|
||||
enum bna_res_type res_type;
|
||||
union bna_res_u res_u;
|
||||
};
|
||||
|
||||
/* HW QPT */
|
||||
struct bna_qpt {
|
||||
struct bna_dma_addr hw_qpt_ptr;
|
||||
void *kv_qpt_ptr;
|
||||
u32 page_count;
|
||||
u32 page_size;
|
||||
};
|
||||
|
||||
struct bna_attr {
|
||||
bool fw_query_complete;
|
||||
int num_txq;
|
||||
int num_rxp;
|
||||
int num_ucmac;
|
||||
int num_mcmac;
|
||||
int max_rit_size;
|
||||
};
|
||||
|
||||
/* IOCEth */
|
||||
|
||||
struct bna_ioceth {
|
||||
bfa_fsm_t fsm;
|
||||
struct bfa_ioc ioc;
|
||||
|
||||
struct bna_attr attr;
|
||||
struct bfa_msgq_cmd_entry msgq_cmd;
|
||||
struct bfi_enet_attr_req attr_req;
|
||||
|
||||
void (*stop_cbfn)(struct bnad *bnad);
|
||||
struct bnad *stop_cbarg;
|
||||
|
||||
struct bna *bna;
|
||||
};
|
||||
|
||||
/* Enet */
|
||||
|
||||
/* Pause configuration */
|
||||
struct bna_pause_config {
|
||||
enum bna_status tx_pause;
|
||||
enum bna_status rx_pause;
|
||||
};
|
||||
|
||||
struct bna_enet {
|
||||
bfa_fsm_t fsm;
|
||||
enum bna_enet_flags flags;
|
||||
|
||||
enum bna_enet_type type;
|
||||
|
||||
struct bna_pause_config pause_config;
|
||||
int mtu;
|
||||
|
||||
/* Callback for bna_enet_disable(), enet_stop() */
|
||||
void (*stop_cbfn)(void *);
|
||||
void *stop_cbarg;
|
||||
|
||||
/* Callback for bna_enet_pause_config() */
|
||||
void (*pause_cbfn)(struct bnad *);
|
||||
|
||||
/* Callback for bna_enet_mtu_set() */
|
||||
void (*mtu_cbfn)(struct bnad *);
|
||||
|
||||
struct bfa_wc chld_stop_wc;
|
||||
|
||||
struct bfa_msgq_cmd_entry msgq_cmd;
|
||||
struct bfi_enet_set_pause_req pause_req;
|
||||
|
||||
struct bna *bna;
|
||||
};
|
||||
|
||||
/* Ethport */
|
||||
|
||||
struct bna_ethport {
|
||||
bfa_fsm_t fsm;
|
||||
enum bna_ethport_flags flags;
|
||||
|
||||
enum bna_link_status link_status;
|
||||
|
||||
int rx_started_count;
|
||||
|
||||
void (*stop_cbfn)(struct bna_enet *);
|
||||
|
||||
void (*adminup_cbfn)(struct bnad *, enum bna_cb_status);
|
||||
|
||||
void (*link_cbfn)(struct bnad *, enum bna_link_status);
|
||||
|
||||
struct bfa_msgq_cmd_entry msgq_cmd;
|
||||
union {
|
||||
struct bfi_enet_enable_req admin_req;
|
||||
struct bfi_enet_diag_lb_req lpbk_req;
|
||||
} bfi_enet_cmd;
|
||||
|
||||
struct bna *bna;
|
||||
};
|
||||
|
||||
/* Interrupt Block */
|
||||
|
||||
/* Doorbell structure */
|
||||
struct bna_ib_dbell {
|
||||
void __iomem *doorbell_addr;
|
||||
u32 doorbell_ack;
|
||||
};
|
||||
|
||||
/* IB structure */
|
||||
struct bna_ib {
|
||||
struct bna_dma_addr ib_seg_host_addr;
|
||||
void *ib_seg_host_addr_kva;
|
||||
|
||||
struct bna_ib_dbell door_bell;
|
||||
|
||||
enum bna_intr_type intr_type;
|
||||
int intr_vector;
|
||||
|
||||
u8 coalescing_timeo; /* Unit is 5usec. */
|
||||
|
||||
int interpkt_count;
|
||||
int interpkt_timeo;
|
||||
};
|
||||
|
||||
/* Tx object */
|
||||
|
||||
/* Tx datapath control structure */
|
||||
#define BNA_Q_NAME_SIZE 16
|
||||
struct bna_tcb {
|
||||
/* Fast path */
|
||||
void **sw_qpt;
|
||||
void *sw_q;
|
||||
void *unmap_q;
|
||||
u32 producer_index;
|
||||
u32 consumer_index;
|
||||
volatile u32 *hw_consumer_index;
|
||||
u32 q_depth;
|
||||
void __iomem *q_dbell;
|
||||
struct bna_ib_dbell *i_dbell;
|
||||
/* Control path */
|
||||
struct bna_txq *txq;
|
||||
struct bnad *bnad;
|
||||
void *priv; /* BNAD's cookie */
|
||||
enum bna_intr_type intr_type;
|
||||
int intr_vector;
|
||||
u8 priority; /* Current priority */
|
||||
unsigned long flags; /* Used by bnad as required */
|
||||
int id;
|
||||
char name[BNA_Q_NAME_SIZE];
|
||||
};
|
||||
|
||||
/* TxQ QPT and configuration */
|
||||
struct bna_txq {
|
||||
/* This should be the first one */
|
||||
struct list_head qe;
|
||||
|
||||
u8 priority;
|
||||
|
||||
struct bna_qpt qpt;
|
||||
struct bna_tcb *tcb;
|
||||
struct bna_ib ib;
|
||||
|
||||
struct bna_tx *tx;
|
||||
|
||||
int hw_id;
|
||||
|
||||
u64 tx_packets;
|
||||
u64 tx_bytes;
|
||||
};
|
||||
|
||||
/* Tx object */
|
||||
struct bna_tx {
|
||||
/* This should be the first one */
|
||||
struct list_head qe;
|
||||
int rid;
|
||||
int hw_id;
|
||||
|
||||
bfa_fsm_t fsm;
|
||||
enum bna_tx_flags flags;
|
||||
|
||||
enum bna_tx_type type;
|
||||
int num_txq;
|
||||
|
||||
struct list_head txq_q;
|
||||
u16 txf_vlan_id;
|
||||
|
||||
/* Tx event handlers */
|
||||
void (*tcb_setup_cbfn)(struct bnad *, struct bna_tcb *);
|
||||
void (*tcb_destroy_cbfn)(struct bnad *, struct bna_tcb *);
|
||||
void (*tx_stall_cbfn)(struct bnad *, struct bna_tx *);
|
||||
void (*tx_resume_cbfn)(struct bnad *, struct bna_tx *);
|
||||
void (*tx_cleanup_cbfn)(struct bnad *, struct bna_tx *);
|
||||
|
||||
/* callback for bna_tx_disable(), bna_tx_stop() */
|
||||
void (*stop_cbfn)(void *arg, struct bna_tx *tx);
|
||||
void *stop_cbarg;
|
||||
|
||||
/* callback for bna_tx_prio_set() */
|
||||
void (*prio_change_cbfn)(struct bnad *bnad, struct bna_tx *tx);
|
||||
|
||||
struct bfa_msgq_cmd_entry msgq_cmd;
|
||||
union {
|
||||
struct bfi_enet_tx_cfg_req cfg_req;
|
||||
struct bfi_enet_req req;
|
||||
struct bfi_enet_tx_cfg_rsp cfg_rsp;
|
||||
} bfi_enet_cmd;
|
||||
|
||||
struct bna *bna;
|
||||
void *priv; /* bnad's cookie */
|
||||
};
|
||||
|
||||
/* Tx object configuration used during creation */
|
||||
struct bna_tx_config {
|
||||
int num_txq;
|
||||
int txq_depth;
|
||||
int coalescing_timeo;
|
||||
enum bna_tx_type tx_type;
|
||||
};
|
||||
|
||||
struct bna_tx_event_cbfn {
|
||||
/* Optional */
|
||||
void (*tcb_setup_cbfn)(struct bnad *, struct bna_tcb *);
|
||||
void (*tcb_destroy_cbfn)(struct bnad *, struct bna_tcb *);
|
||||
/* Mandatory */
|
||||
void (*tx_stall_cbfn)(struct bnad *, struct bna_tx *);
|
||||
void (*tx_resume_cbfn)(struct bnad *, struct bna_tx *);
|
||||
void (*tx_cleanup_cbfn)(struct bnad *, struct bna_tx *);
|
||||
};
|
||||
|
||||
/* Tx module - keeps track of free, active tx objects */
|
||||
struct bna_tx_mod {
|
||||
struct bna_tx *tx; /* BFI_MAX_TXQ entries */
|
||||
struct bna_txq *txq; /* BFI_MAX_TXQ entries */
|
||||
|
||||
struct list_head tx_free_q;
|
||||
struct list_head tx_active_q;
|
||||
|
||||
struct list_head txq_free_q;
|
||||
|
||||
/* callback for bna_tx_mod_stop() */
|
||||
void (*stop_cbfn)(struct bna_enet *enet);
|
||||
|
||||
struct bfa_wc tx_stop_wc;
|
||||
|
||||
enum bna_tx_mod_flags flags;
|
||||
|
||||
u8 prio_map;
|
||||
int default_prio;
|
||||
int iscsi_over_cee;
|
||||
int iscsi_prio;
|
||||
int prio_reconfigured;
|
||||
|
||||
u32 rid_mask;
|
||||
|
||||
struct bna *bna;
|
||||
};
|
||||
|
||||
/* Rx object */
|
||||
|
||||
/* Rx datapath control structure */
|
||||
struct bna_rcb {
|
||||
/* Fast path */
|
||||
void **sw_qpt;
|
||||
void *sw_q;
|
||||
void *unmap_q;
|
||||
u32 producer_index;
|
||||
u32 consumer_index;
|
||||
u32 q_depth;
|
||||
void __iomem *q_dbell;
|
||||
/* Control path */
|
||||
struct bna_rxq *rxq;
|
||||
struct bna_ccb *ccb;
|
||||
struct bnad *bnad;
|
||||
void *priv; /* BNAD's cookie */
|
||||
unsigned long flags;
|
||||
int id;
|
||||
};
|
||||
|
||||
/* RxQ structure - QPT, configuration */
|
||||
struct bna_rxq {
|
||||
struct list_head qe;
|
||||
|
||||
int buffer_size;
|
||||
int q_depth;
|
||||
u32 num_vecs;
|
||||
enum bna_status multi_buffer;
|
||||
|
||||
struct bna_qpt qpt;
|
||||
struct bna_rcb *rcb;
|
||||
|
||||
struct bna_rxp *rxp;
|
||||
struct bna_rx *rx;
|
||||
|
||||
int hw_id;
|
||||
|
||||
u64 rx_packets;
|
||||
u64 rx_bytes;
|
||||
u64 rx_packets_with_error;
|
||||
u64 rxbuf_alloc_failed;
|
||||
};
|
||||
|
||||
/* RxQ pair */
|
||||
union bna_rxq_u {
|
||||
struct {
|
||||
struct bna_rxq *hdr;
|
||||
struct bna_rxq *data;
|
||||
} hds;
|
||||
struct {
|
||||
struct bna_rxq *small;
|
||||
struct bna_rxq *large;
|
||||
} slr;
|
||||
struct {
|
||||
struct bna_rxq *only;
|
||||
struct bna_rxq *reserved;
|
||||
} single;
|
||||
};
|
||||
|
||||
/* Packet rate for Dynamic Interrupt Moderation */
|
||||
struct bna_pkt_rate {
|
||||
u32 small_pkt_cnt;
|
||||
u32 large_pkt_cnt;
|
||||
};
|
||||
|
||||
/* Completion control structure */
|
||||
struct bna_ccb {
|
||||
/* Fast path */
|
||||
void **sw_qpt;
|
||||
void *sw_q;
|
||||
u32 producer_index;
|
||||
volatile u32 *hw_producer_index;
|
||||
u32 q_depth;
|
||||
struct bna_ib_dbell *i_dbell;
|
||||
struct bna_rcb *rcb[2];
|
||||
void *ctrl; /* For bnad */
|
||||
struct bna_pkt_rate pkt_rate;
|
||||
u32 pkts_una;
|
||||
u32 bytes_per_intr;
|
||||
|
||||
/* Control path */
|
||||
struct bna_cq *cq;
|
||||
struct bnad *bnad;
|
||||
void *priv; /* BNAD's cookie */
|
||||
enum bna_intr_type intr_type;
|
||||
int intr_vector;
|
||||
u8 rx_coalescing_timeo; /* For NAPI */
|
||||
int id;
|
||||
char name[BNA_Q_NAME_SIZE];
|
||||
};
|
||||
|
||||
/* CQ QPT, configuration */
|
||||
struct bna_cq {
|
||||
struct bna_qpt qpt;
|
||||
struct bna_ccb *ccb;
|
||||
|
||||
struct bna_ib ib;
|
||||
|
||||
struct bna_rx *rx;
|
||||
};
|
||||
|
||||
struct bna_rss_config {
|
||||
enum bfi_enet_rss_type hash_type;
|
||||
u8 hash_mask;
|
||||
u32 toeplitz_hash_key[BFI_ENET_RSS_KEY_LEN];
|
||||
};
|
||||
|
||||
struct bna_hds_config {
|
||||
enum bfi_enet_hds_type hdr_type;
|
||||
int forced_offset;
|
||||
};
|
||||
|
||||
/* Rx object configuration used during creation */
|
||||
struct bna_rx_config {
|
||||
enum bna_rx_type rx_type;
|
||||
int num_paths;
|
||||
enum bna_rxp_type rxp_type;
|
||||
int paused;
|
||||
int coalescing_timeo;
|
||||
/*
|
||||
* Small/Large (or Header/Data) buffer size to be configured
|
||||
* for SLR and HDS queue type.
|
||||
*/
|
||||
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;
|
||||
struct bna_rss_config rss_config;
|
||||
|
||||
struct bna_hds_config hds_config;
|
||||
|
||||
enum bna_status vlan_strip_status;
|
||||
};
|
||||
|
||||
/* Rx Path structure - one per MSIX vector/CPU */
|
||||
struct bna_rxp {
|
||||
/* This should be the first one */
|
||||
struct list_head qe;
|
||||
|
||||
enum bna_rxp_type type;
|
||||
union bna_rxq_u rxq;
|
||||
struct bna_cq cq;
|
||||
|
||||
struct bna_rx *rx;
|
||||
|
||||
/* MSI-x vector number for configuring RSS */
|
||||
int vector;
|
||||
int hw_id;
|
||||
};
|
||||
|
||||
/* RxF structure (hardware Rx Function) */
|
||||
struct bna_rxf {
|
||||
bfa_fsm_t fsm;
|
||||
enum bna_rxf_flags flags;
|
||||
|
||||
struct bfa_msgq_cmd_entry msgq_cmd;
|
||||
union {
|
||||
struct bfi_enet_enable_req req;
|
||||
struct bfi_enet_rss_cfg_req rss_req;
|
||||
struct bfi_enet_rit_req rit_req;
|
||||
struct bfi_enet_rx_vlan_req vlan_req;
|
||||
struct bfi_enet_mcast_add_req mcast_add_req;
|
||||
struct bfi_enet_mcast_del_req mcast_del_req;
|
||||
struct bfi_enet_ucast_req ucast_req;
|
||||
} bfi_enet_cmd;
|
||||
|
||||
/* callback for bna_rxf_start() */
|
||||
void (*start_cbfn) (struct bna_rx *rx);
|
||||
struct bna_rx *start_cbarg;
|
||||
|
||||
/* callback for bna_rxf_stop() */
|
||||
void (*stop_cbfn) (struct bna_rx *rx);
|
||||
struct bna_rx *stop_cbarg;
|
||||
|
||||
/* callback for bna_rx_receive_pause() / bna_rx_receive_resume() */
|
||||
void (*oper_state_cbfn) (struct bnad *bnad, struct bna_rx *rx);
|
||||
struct bnad *oper_state_cbarg;
|
||||
|
||||
/**
|
||||
* callback for:
|
||||
* bna_rxf_ucast_set()
|
||||
* bna_rxf_{ucast/mcast}_add(),
|
||||
* bna_rxf_{ucast/mcast}_del(),
|
||||
* bna_rxf_mode_set()
|
||||
*/
|
||||
void (*cam_fltr_cbfn)(struct bnad *bnad, struct bna_rx *rx);
|
||||
struct bnad *cam_fltr_cbarg;
|
||||
|
||||
/* List of unicast addresses yet to be applied to h/w */
|
||||
struct list_head ucast_pending_add_q;
|
||||
struct list_head ucast_pending_del_q;
|
||||
struct bna_mac *ucast_pending_mac;
|
||||
int ucast_pending_set;
|
||||
/* ucast addresses applied to the h/w */
|
||||
struct list_head ucast_active_q;
|
||||
struct bna_mac ucast_active_mac;
|
||||
int ucast_active_set;
|
||||
|
||||
/* List of multicast addresses yet to be applied to h/w */
|
||||
struct list_head mcast_pending_add_q;
|
||||
struct list_head mcast_pending_del_q;
|
||||
/* multicast addresses applied to the h/w */
|
||||
struct list_head mcast_active_q;
|
||||
struct list_head mcast_handle_q;
|
||||
|
||||
/* Rx modes yet to be applied to h/w */
|
||||
enum bna_rxmode rxmode_pending;
|
||||
enum bna_rxmode rxmode_pending_bitmask;
|
||||
/* Rx modes applied to h/w */
|
||||
enum bna_rxmode rxmode_active;
|
||||
|
||||
u8 vlan_pending_bitmask;
|
||||
enum bna_status vlan_filter_status;
|
||||
u32 vlan_filter_table[(BFI_ENET_VLAN_ID_MAX) / 32];
|
||||
bool vlan_strip_pending;
|
||||
enum bna_status vlan_strip_status;
|
||||
|
||||
enum bna_rss_flags rss_pending;
|
||||
enum bna_status rss_status;
|
||||
struct bna_rss_config rss_cfg;
|
||||
u8 *rit;
|
||||
int rit_size;
|
||||
|
||||
struct bna_rx *rx;
|
||||
};
|
||||
|
||||
/* Rx object */
|
||||
struct bna_rx {
|
||||
/* This should be the first one */
|
||||
struct list_head qe;
|
||||
int rid;
|
||||
int hw_id;
|
||||
|
||||
bfa_fsm_t fsm;
|
||||
|
||||
enum bna_rx_type type;
|
||||
|
||||
int num_paths;
|
||||
struct list_head rxp_q;
|
||||
|
||||
struct bna_hds_config hds_cfg;
|
||||
|
||||
struct bna_rxf rxf;
|
||||
|
||||
enum bna_rx_flags rx_flags;
|
||||
|
||||
struct bfa_msgq_cmd_entry msgq_cmd;
|
||||
union {
|
||||
struct bfi_enet_rx_cfg_req cfg_req;
|
||||
struct bfi_enet_req req;
|
||||
struct bfi_enet_rx_cfg_rsp cfg_rsp;
|
||||
} bfi_enet_cmd;
|
||||
|
||||
/* Rx event handlers */
|
||||
void (*rcb_setup_cbfn)(struct bnad *, struct bna_rcb *);
|
||||
void (*rcb_destroy_cbfn)(struct bnad *, struct bna_rcb *);
|
||||
void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *);
|
||||
void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *);
|
||||
void (*rx_stall_cbfn)(struct bnad *, struct bna_rx *);
|
||||
void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *);
|
||||
void (*rx_post_cbfn)(struct bnad *, struct bna_rx *);
|
||||
|
||||
/* callback for bna_rx_disable(), bna_rx_stop() */
|
||||
void (*stop_cbfn)(void *arg, struct bna_rx *rx);
|
||||
void *stop_cbarg;
|
||||
|
||||
struct bna *bna;
|
||||
void *priv; /* bnad's cookie */
|
||||
};
|
||||
|
||||
struct bna_rx_event_cbfn {
|
||||
/* Optional */
|
||||
void (*rcb_setup_cbfn)(struct bnad *, struct bna_rcb *);
|
||||
void (*rcb_destroy_cbfn)(struct bnad *, struct bna_rcb *);
|
||||
void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *);
|
||||
void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *);
|
||||
void (*rx_stall_cbfn)(struct bnad *, struct bna_rx *);
|
||||
/* Mandatory */
|
||||
void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *);
|
||||
void (*rx_post_cbfn)(struct bnad *, struct bna_rx *);
|
||||
};
|
||||
|
||||
/* Rx module - keeps track of free, active rx objects */
|
||||
struct bna_rx_mod {
|
||||
struct bna *bna; /* back pointer to parent */
|
||||
struct bna_rx *rx; /* BFI_MAX_RXQ entries */
|
||||
struct bna_rxp *rxp; /* BFI_MAX_RXQ entries */
|
||||
struct bna_rxq *rxq; /* BFI_MAX_RXQ entries */
|
||||
|
||||
struct list_head rx_free_q;
|
||||
struct list_head rx_active_q;
|
||||
int rx_free_count;
|
||||
|
||||
struct list_head rxp_free_q;
|
||||
int rxp_free_count;
|
||||
|
||||
struct list_head rxq_free_q;
|
||||
int rxq_free_count;
|
||||
|
||||
enum bna_rx_mod_flags flags;
|
||||
|
||||
/* callback for bna_rx_mod_stop() */
|
||||
void (*stop_cbfn)(struct bna_enet *enet);
|
||||
|
||||
struct bfa_wc rx_stop_wc;
|
||||
u32 dim_vector[BNA_LOAD_T_MAX][BNA_BIAS_T_MAX];
|
||||
u32 rid_mask;
|
||||
};
|
||||
|
||||
/* CAM */
|
||||
|
||||
struct bna_ucam_mod {
|
||||
struct bna_mac *ucmac; /* num_ucmac * 2 entries */
|
||||
struct list_head free_q;
|
||||
struct list_head del_q;
|
||||
|
||||
struct bna *bna;
|
||||
};
|
||||
|
||||
struct bna_mcam_handle {
|
||||
/* This should be the first one */
|
||||
struct list_head qe;
|
||||
int handle;
|
||||
int refcnt;
|
||||
};
|
||||
|
||||
struct bna_mcam_mod {
|
||||
struct bna_mac *mcmac; /* num_mcmac * 2 entries */
|
||||
struct bna_mcam_handle *mchandle; /* num_mcmac entries */
|
||||
struct list_head free_q;
|
||||
struct list_head del_q;
|
||||
struct list_head free_handle_q;
|
||||
|
||||
struct bna *bna;
|
||||
};
|
||||
|
||||
/* Statistics */
|
||||
|
||||
struct bna_stats {
|
||||
struct bna_dma_addr hw_stats_dma;
|
||||
struct bfi_enet_stats *hw_stats_kva;
|
||||
struct bfi_enet_stats hw_stats;
|
||||
};
|
||||
|
||||
struct bna_stats_mod {
|
||||
bool ioc_ready;
|
||||
bool stats_get_busy;
|
||||
bool stats_clr_busy;
|
||||
struct bfa_msgq_cmd_entry stats_get_cmd;
|
||||
struct bfa_msgq_cmd_entry stats_clr_cmd;
|
||||
struct bfi_enet_stats_req stats_get;
|
||||
struct bfi_enet_stats_req stats_clr;
|
||||
};
|
||||
|
||||
/* BNA */
|
||||
|
||||
struct bna {
|
||||
struct bna_ident ident;
|
||||
struct bfa_pcidev pcidev;
|
||||
|
||||
struct bna_reg regs;
|
||||
struct bna_bit_defn bits;
|
||||
|
||||
struct bna_stats stats;
|
||||
|
||||
struct bna_ioceth ioceth;
|
||||
struct bfa_cee cee;
|
||||
struct bfa_flash flash;
|
||||
struct bfa_msgq msgq;
|
||||
|
||||
struct bna_ethport ethport;
|
||||
struct bna_enet enet;
|
||||
struct bna_stats_mod stats_mod;
|
||||
|
||||
struct bna_tx_mod tx_mod;
|
||||
struct bna_rx_mod rx_mod;
|
||||
struct bna_ucam_mod ucam_mod;
|
||||
struct bna_mcam_mod mcam_mod;
|
||||
|
||||
enum bna_mod_flags mod_flags;
|
||||
|
||||
int default_mode_rid;
|
||||
int promisc_rid;
|
||||
|
||||
struct bnad *bnad;
|
||||
};
|
||||
#endif /* __BNA_TYPES_H__ */
|
3900
drivers/net/ethernet/brocade/bna/bnad.c
Normal file
3900
drivers/net/ethernet/brocade/bna/bnad.c
Normal file
File diff suppressed because it is too large
Load diff
431
drivers/net/ethernet/brocade/bna/bnad.h
Normal file
431
drivers/net/ethernet/brocade/bna/bnad.h
Normal file
|
@ -0,0 +1,431 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
#ifndef __BNAD_H__
|
||||
#define __BNAD_H__
|
||||
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/if_vlan.h>
|
||||
|
||||
/* Fix for IA64 */
|
||||
#include <asm/checksum.h>
|
||||
#include <net/ip6_checksum.h>
|
||||
|
||||
#include <net/ip.h>
|
||||
#include <net/tcp.h>
|
||||
|
||||
#include "bna.h"
|
||||
|
||||
#define BNAD_TXQ_DEPTH 2048
|
||||
#define BNAD_RXQ_DEPTH 2048
|
||||
|
||||
#define BNAD_MAX_TX 1
|
||||
#define BNAD_MAX_TXQ_PER_TX 8 /* 8 priority queues */
|
||||
#define BNAD_TXQ_NUM 1
|
||||
|
||||
#define BNAD_MAX_RX 1
|
||||
#define BNAD_MAX_RXP_PER_RX 16
|
||||
#define BNAD_MAX_RXQ_PER_RXP 2
|
||||
|
||||
/*
|
||||
* Control structure pointed to ccb->ctrl, which
|
||||
* determines the NAPI / LRO behavior CCB
|
||||
* There is 1:1 corres. between ccb & ctrl
|
||||
*/
|
||||
struct bnad_rx_ctrl {
|
||||
struct bna_ccb *ccb;
|
||||
struct bnad *bnad;
|
||||
unsigned long flags;
|
||||
struct napi_struct napi;
|
||||
u64 rx_intr_ctr;
|
||||
u64 rx_poll_ctr;
|
||||
u64 rx_schedule;
|
||||
u64 rx_keep_poll;
|
||||
u64 rx_complete;
|
||||
};
|
||||
|
||||
#define BNAD_RXMODE_PROMISC_DEFAULT BNA_RXMODE_PROMISC
|
||||
|
||||
/*
|
||||
* GLOBAL #defines (CONSTANTS)
|
||||
*/
|
||||
#define BNAD_NAME "bna"
|
||||
#define BNAD_NAME_LEN 64
|
||||
|
||||
#define BNAD_VERSION "3.2.23.0"
|
||||
|
||||
#define BNAD_MAILBOX_MSIX_INDEX 0
|
||||
#define BNAD_MAILBOX_MSIX_VECTORS 1
|
||||
#define BNAD_INTX_TX_IB_BITMASK 0x1
|
||||
#define BNAD_INTX_RX_IB_BITMASK 0x2
|
||||
|
||||
#define BNAD_STATS_TIMER_FREQ 1000 /* in msecs */
|
||||
#define BNAD_DIM_TIMER_FREQ 1000 /* in msecs */
|
||||
|
||||
#define BNAD_IOCETH_TIMEOUT 10000
|
||||
|
||||
#define BNAD_MIN_Q_DEPTH 512
|
||||
#define BNAD_MAX_RXQ_DEPTH 16384
|
||||
#define BNAD_MAX_TXQ_DEPTH 2048
|
||||
|
||||
#define BNAD_JUMBO_MTU 9000
|
||||
|
||||
#define BNAD_NETIF_WAKE_THRESHOLD 8
|
||||
|
||||
#define BNAD_RXQ_REFILL_THRESHOLD_SHIFT 3
|
||||
|
||||
/* Bit positions for tcb->flags */
|
||||
#define BNAD_TXQ_FREE_SENT 0
|
||||
#define BNAD_TXQ_TX_STARTED 1
|
||||
|
||||
/* Bit positions for rcb->flags */
|
||||
#define BNAD_RXQ_STARTED 0
|
||||
#define BNAD_RXQ_POST_OK 1
|
||||
|
||||
/* Resource limits */
|
||||
#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_FRAME_SIZE(_mtu) \
|
||||
(ETH_HLEN + VLAN_HLEN + (_mtu) + ETH_FCS_LEN)
|
||||
|
||||
/*
|
||||
* DATA STRUCTURES
|
||||
*/
|
||||
|
||||
/* enums */
|
||||
enum bnad_intr_source {
|
||||
BNAD_INTR_TX = 1,
|
||||
BNAD_INTR_RX = 2
|
||||
};
|
||||
|
||||
enum bnad_link_state {
|
||||
BNAD_LS_DOWN = 0,
|
||||
BNAD_LS_UP = 1
|
||||
};
|
||||
|
||||
struct bnad_iocmd_comp {
|
||||
struct bnad *bnad;
|
||||
struct completion comp;
|
||||
int comp_status;
|
||||
};
|
||||
|
||||
struct bnad_completion {
|
||||
struct completion ioc_comp;
|
||||
struct completion ucast_comp;
|
||||
struct completion mcast_comp;
|
||||
struct completion tx_comp;
|
||||
struct completion rx_comp;
|
||||
struct completion stats_comp;
|
||||
struct completion enet_comp;
|
||||
struct completion mtu_comp;
|
||||
|
||||
u8 ioc_comp_status;
|
||||
u8 ucast_comp_status;
|
||||
u8 mcast_comp_status;
|
||||
u8 tx_comp_status;
|
||||
u8 rx_comp_status;
|
||||
u8 stats_comp_status;
|
||||
u8 port_comp_status;
|
||||
u8 mtu_comp_status;
|
||||
};
|
||||
|
||||
/* Tx Rx Control Stats */
|
||||
struct bnad_drv_stats {
|
||||
u64 netif_queue_stop;
|
||||
u64 netif_queue_wakeup;
|
||||
u64 netif_queue_stopped;
|
||||
u64 tso4;
|
||||
u64 tso6;
|
||||
u64 tso_err;
|
||||
u64 tcpcsum_offload;
|
||||
u64 udpcsum_offload;
|
||||
u64 csum_help;
|
||||
u64 tx_skb_too_short;
|
||||
u64 tx_skb_stopping;
|
||||
u64 tx_skb_max_vectors;
|
||||
u64 tx_skb_mss_too_long;
|
||||
u64 tx_skb_tso_too_short;
|
||||
u64 tx_skb_tso_prepare;
|
||||
u64 tx_skb_non_tso_too_long;
|
||||
u64 tx_skb_tcp_hdr;
|
||||
u64 tx_skb_udp_hdr;
|
||||
u64 tx_skb_csum_err;
|
||||
u64 tx_skb_headlen_too_long;
|
||||
u64 tx_skb_headlen_zero;
|
||||
u64 tx_skb_frag_zero;
|
||||
u64 tx_skb_len_mismatch;
|
||||
|
||||
u64 hw_stats_updates;
|
||||
u64 netif_rx_dropped;
|
||||
|
||||
u64 link_toggle;
|
||||
u64 cee_toggle;
|
||||
|
||||
u64 rxp_info_alloc_failed;
|
||||
u64 mbox_intr_disabled;
|
||||
u64 mbox_intr_enabled;
|
||||
u64 tx_unmap_q_alloc_failed;
|
||||
u64 rx_unmap_q_alloc_failed;
|
||||
|
||||
u64 rxbuf_alloc_failed;
|
||||
};
|
||||
|
||||
/* Complete driver stats */
|
||||
struct bnad_stats {
|
||||
struct bnad_drv_stats drv_stats;
|
||||
struct bna_stats *bna_stats;
|
||||
};
|
||||
|
||||
/* Tx / Rx Resources */
|
||||
struct bnad_tx_res_info {
|
||||
struct bna_res_info res_info[BNA_TX_RES_T_MAX];
|
||||
};
|
||||
|
||||
struct bnad_rx_res_info {
|
||||
struct bna_res_info res_info[BNA_RX_RES_T_MAX];
|
||||
};
|
||||
|
||||
struct bnad_tx_info {
|
||||
struct bna_tx *tx; /* 1:1 between tx_info & tx */
|
||||
struct bna_tcb *tcb[BNAD_MAX_TXQ_PER_TX];
|
||||
u32 tx_id;
|
||||
struct delayed_work tx_cleanup_work;
|
||||
} ____cacheline_aligned;
|
||||
|
||||
struct bnad_rx_info {
|
||||
struct bna_rx *rx; /* 1:1 between rx_info & rx */
|
||||
|
||||
struct bnad_rx_ctrl rx_ctrl[BNAD_MAX_RXP_PER_RX];
|
||||
u32 rx_id;
|
||||
struct work_struct rx_cleanup_work;
|
||||
} ____cacheline_aligned;
|
||||
|
||||
struct bnad_tx_vector {
|
||||
DEFINE_DMA_UNMAP_ADDR(dma_addr);
|
||||
DEFINE_DMA_UNMAP_LEN(dma_len);
|
||||
};
|
||||
|
||||
struct bnad_tx_unmap {
|
||||
struct sk_buff *skb;
|
||||
u32 nvecs;
|
||||
struct bnad_tx_vector vectors[BFI_TX_MAX_VECTORS_PER_WI];
|
||||
};
|
||||
|
||||
struct bnad_rx_vector {
|
||||
DEFINE_DMA_UNMAP_ADDR(dma_addr);
|
||||
u32 len;
|
||||
};
|
||||
|
||||
struct bnad_rx_unmap {
|
||||
struct page *page;
|
||||
struct sk_buff *skb;
|
||||
struct bnad_rx_vector vector;
|
||||
u32 page_offset;
|
||||
};
|
||||
|
||||
enum bnad_rxbuf_type {
|
||||
BNAD_RXBUF_NONE = 0,
|
||||
BNAD_RXBUF_SK_BUFF = 1,
|
||||
BNAD_RXBUF_PAGE = 2,
|
||||
BNAD_RXBUF_MULTI_BUFF = 3
|
||||
};
|
||||
|
||||
#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 {
|
||||
int reuse_pi;
|
||||
int alloc_order;
|
||||
u32 map_size;
|
||||
enum bnad_rxbuf_type type;
|
||||
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 */
|
||||
#define BNAD_CF_DIM_ENABLED 0x01 /* DIM */
|
||||
#define BNAD_CF_PROMISC 0x02
|
||||
#define BNAD_CF_ALLMULTI 0x04
|
||||
#define BNAD_CF_DEFAULT 0x08
|
||||
#define BNAD_CF_MSIX 0x10 /* If in MSIx mode */
|
||||
|
||||
/* Defines for run_flags bit-mask */
|
||||
/* Set, tested & cleared using xxx_bit() functions */
|
||||
/* Values indicated bit positions */
|
||||
#define BNAD_RF_CEE_RUNNING 0
|
||||
#define BNAD_RF_MTU_SET 1
|
||||
#define BNAD_RF_MBOX_IRQ_DISABLED 2
|
||||
#define BNAD_RF_NETDEV_REGISTERED 3
|
||||
#define BNAD_RF_DIM_TIMER_RUNNING 4
|
||||
#define BNAD_RF_STATS_TIMER_RUNNING 5
|
||||
#define BNAD_RF_TX_PRIO_SET 6
|
||||
|
||||
struct bnad {
|
||||
struct net_device *netdev;
|
||||
u32 id;
|
||||
struct list_head list_entry;
|
||||
|
||||
/* Data path */
|
||||
struct bnad_tx_info tx_info[BNAD_MAX_TX];
|
||||
struct bnad_rx_info rx_info[BNAD_MAX_RX];
|
||||
|
||||
unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
|
||||
/*
|
||||
* These q numbers are global only because
|
||||
* they are used to calculate MSIx vectors.
|
||||
* Actually the exact # of queues are per Tx/Rx
|
||||
* object.
|
||||
*/
|
||||
u32 num_tx;
|
||||
u32 num_rx;
|
||||
u32 num_txq_per_tx;
|
||||
u32 num_rxp_per_rx;
|
||||
|
||||
u32 txq_depth;
|
||||
u32 rxq_depth;
|
||||
|
||||
u8 tx_coalescing_timeo;
|
||||
u8 rx_coalescing_timeo;
|
||||
|
||||
struct bna_rx_config rx_config[BNAD_MAX_RX] ____cacheline_aligned;
|
||||
struct bna_tx_config tx_config[BNAD_MAX_TX] ____cacheline_aligned;
|
||||
|
||||
void __iomem *bar0; /* BAR0 address */
|
||||
|
||||
struct bna bna;
|
||||
|
||||
u32 cfg_flags;
|
||||
unsigned long run_flags;
|
||||
|
||||
struct pci_dev *pcidev;
|
||||
u64 mmio_start;
|
||||
u64 mmio_len;
|
||||
|
||||
u32 msix_num;
|
||||
struct msix_entry *msix_table;
|
||||
|
||||
struct mutex conf_mutex;
|
||||
spinlock_t bna_lock ____cacheline_aligned;
|
||||
|
||||
/* Timers */
|
||||
struct timer_list ioc_timer;
|
||||
struct timer_list dim_timer;
|
||||
struct timer_list stats_timer;
|
||||
|
||||
/* Control path resources, memory & irq */
|
||||
struct bna_res_info res_info[BNA_RES_T_MAX];
|
||||
struct bna_res_info mod_res_info[BNA_MOD_RES_T_MAX];
|
||||
struct bnad_tx_res_info tx_res_info[BNAD_MAX_TX];
|
||||
struct bnad_rx_res_info rx_res_info[BNAD_MAX_RX];
|
||||
|
||||
struct bnad_completion bnad_completions;
|
||||
|
||||
/* Burnt in MAC address */
|
||||
mac_t perm_addr;
|
||||
|
||||
struct workqueue_struct *work_q;
|
||||
|
||||
/* Statistics */
|
||||
struct bnad_stats stats;
|
||||
|
||||
struct bnad_diag *diag;
|
||||
|
||||
char adapter_name[BNAD_NAME_LEN];
|
||||
char port_name[BNAD_NAME_LEN];
|
||||
char mbox_irq_name[BNAD_NAME_LEN];
|
||||
char wq_name[BNAD_NAME_LEN];
|
||||
|
||||
/* debugfs specific data */
|
||||
char *regdata;
|
||||
u32 reglen;
|
||||
struct dentry *bnad_dentry_files[5];
|
||||
struct dentry *port_debugfs_root;
|
||||
};
|
||||
|
||||
struct bnad_drvinfo {
|
||||
struct bfa_ioc_attr ioc_attr;
|
||||
struct bfa_cee_attr cee_attr;
|
||||
struct bfa_flash_attr flash_attr;
|
||||
u32 cee_status;
|
||||
u32 flash_status;
|
||||
};
|
||||
|
||||
/*
|
||||
* EXTERN VARIABLES
|
||||
*/
|
||||
extern const struct firmware *bfi_fw;
|
||||
|
||||
/*
|
||||
* EXTERN PROTOTYPES
|
||||
*/
|
||||
u32 *cna_get_firmware_buf(struct pci_dev *pdev);
|
||||
/* Netdev entry point prototypes */
|
||||
void bnad_set_rx_mode(struct net_device *netdev);
|
||||
struct net_device_stats *bnad_get_netdev_stats(struct net_device *netdev);
|
||||
int bnad_mac_addr_set_locked(struct bnad *bnad, u8 *mac_addr);
|
||||
int bnad_enable_default_bcast(struct bnad *bnad);
|
||||
void bnad_restore_vlans(struct bnad *bnad, u32 rx_id);
|
||||
void bnad_set_ethtool_ops(struct net_device *netdev);
|
||||
void bnad_cb_completion(void *arg, enum bfa_status status);
|
||||
|
||||
/* Configuration & setup */
|
||||
void bnad_tx_coalescing_timeo_set(struct bnad *bnad);
|
||||
void bnad_rx_coalescing_timeo_set(struct bnad *bnad);
|
||||
|
||||
int bnad_setup_rx(struct bnad *bnad, u32 rx_id);
|
||||
int bnad_setup_tx(struct bnad *bnad, u32 tx_id);
|
||||
void bnad_destroy_tx(struct bnad *bnad, u32 tx_id);
|
||||
void bnad_destroy_rx(struct bnad *bnad, u32 rx_id);
|
||||
|
||||
/* Timer start/stop protos */
|
||||
void bnad_dim_timer_start(struct bnad *bnad);
|
||||
|
||||
/* Statistics */
|
||||
void bnad_netdev_qstats_fill(struct bnad *bnad,
|
||||
struct rtnl_link_stats64 *stats);
|
||||
void bnad_netdev_hwstats_fill(struct bnad *bnad,
|
||||
struct rtnl_link_stats64 *stats);
|
||||
|
||||
/* Debugfs */
|
||||
void bnad_debugfs_init(struct bnad *bnad);
|
||||
void bnad_debugfs_uninit(struct bnad *bnad);
|
||||
|
||||
/* MACROS */
|
||||
/* To set & get the stats counters */
|
||||
#define BNAD_UPDATE_CTR(_bnad, _ctr) \
|
||||
(((_bnad)->stats.drv_stats._ctr)++)
|
||||
|
||||
#define BNAD_GET_CTR(_bnad, _ctr) ((_bnad)->stats.drv_stats._ctr)
|
||||
|
||||
#define bnad_enable_rx_irq_unsafe(_ccb) \
|
||||
{ \
|
||||
if (likely(test_bit(BNAD_RXQ_STARTED, &(_ccb)->rcb[0]->flags))) {\
|
||||
bna_ib_coalescing_timer_set((_ccb)->i_dbell, \
|
||||
(_ccb)->rx_coalescing_timeo); \
|
||||
bna_ib_ack((_ccb)->i_dbell, 0); \
|
||||
} \
|
||||
}
|
||||
|
||||
#endif /* __BNAD_H__ */
|
588
drivers/net/ethernet/brocade/bna/bnad_debugfs.c
Normal file
588
drivers/net/ethernet/brocade/bna/bnad_debugfs.c
Normal file
|
@ -0,0 +1,588 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/module.h>
|
||||
#include "bnad.h"
|
||||
|
||||
/*
|
||||
* BNA debufs interface
|
||||
*
|
||||
* To access the interface, debugfs file system should be mounted
|
||||
* if not already mounted using:
|
||||
* mount -t debugfs none /sys/kernel/debug
|
||||
*
|
||||
* BNA Hierarchy:
|
||||
* - bna/pci_dev:<pci_name>
|
||||
* where the pci_name corresponds to the one under /sys/bus/pci/drivers/bna
|
||||
*
|
||||
* Debugging service available per pci_dev:
|
||||
* fwtrc: To collect current firmware trace.
|
||||
* fwsave: To collect last saved fw trace as a result of firmware crash.
|
||||
* regwr: To write one word to chip register
|
||||
* regrd: To read one or more words from chip register.
|
||||
*/
|
||||
|
||||
struct bnad_debug_info {
|
||||
char *debug_buffer;
|
||||
void *i_private;
|
||||
int buffer_len;
|
||||
};
|
||||
|
||||
static int
|
||||
bnad_debugfs_open_fwtrc(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct bnad *bnad = inode->i_private;
|
||||
struct bnad_debug_info *fw_debug;
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
fw_debug = kzalloc(sizeof(struct bnad_debug_info), GFP_KERNEL);
|
||||
if (!fw_debug)
|
||||
return -ENOMEM;
|
||||
|
||||
fw_debug->buffer_len = BNA_DBG_FWTRC_LEN;
|
||||
|
||||
fw_debug->debug_buffer = kzalloc(fw_debug->buffer_len, GFP_KERNEL);
|
||||
if (!fw_debug->debug_buffer) {
|
||||
kfree(fw_debug);
|
||||
fw_debug = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&bnad->bna_lock, flags);
|
||||
rc = bfa_nw_ioc_debug_fwtrc(&bnad->bna.ioceth.ioc,
|
||||
fw_debug->debug_buffer,
|
||||
&fw_debug->buffer_len);
|
||||
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
||||
if (rc != BFA_STATUS_OK) {
|
||||
kfree(fw_debug->debug_buffer);
|
||||
fw_debug->debug_buffer = NULL;
|
||||
kfree(fw_debug);
|
||||
fw_debug = NULL;
|
||||
pr_warn("bnad %s: Failed to collect fwtrc\n",
|
||||
pci_name(bnad->pcidev));
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
file->private_data = fw_debug;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bnad_debugfs_open_fwsave(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct bnad *bnad = inode->i_private;
|
||||
struct bnad_debug_info *fw_debug;
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
fw_debug = kzalloc(sizeof(struct bnad_debug_info), GFP_KERNEL);
|
||||
if (!fw_debug)
|
||||
return -ENOMEM;
|
||||
|
||||
fw_debug->buffer_len = BNA_DBG_FWTRC_LEN;
|
||||
|
||||
fw_debug->debug_buffer = kzalloc(fw_debug->buffer_len, GFP_KERNEL);
|
||||
if (!fw_debug->debug_buffer) {
|
||||
kfree(fw_debug);
|
||||
fw_debug = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&bnad->bna_lock, flags);
|
||||
rc = bfa_nw_ioc_debug_fwsave(&bnad->bna.ioceth.ioc,
|
||||
fw_debug->debug_buffer,
|
||||
&fw_debug->buffer_len);
|
||||
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
||||
if (rc != BFA_STATUS_OK && rc != BFA_STATUS_ENOFSAVE) {
|
||||
kfree(fw_debug->debug_buffer);
|
||||
fw_debug->debug_buffer = NULL;
|
||||
kfree(fw_debug);
|
||||
fw_debug = NULL;
|
||||
pr_warn("bna %s: Failed to collect fwsave\n",
|
||||
pci_name(bnad->pcidev));
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
file->private_data = fw_debug;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bnad_debugfs_open_reg(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct bnad_debug_info *reg_debug;
|
||||
|
||||
reg_debug = kzalloc(sizeof(struct bnad_debug_info), GFP_KERNEL);
|
||||
if (!reg_debug)
|
||||
return -ENOMEM;
|
||||
|
||||
reg_debug->i_private = inode->i_private;
|
||||
|
||||
file->private_data = reg_debug;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bnad_get_debug_drvinfo(struct bnad *bnad, void *buffer, u32 len)
|
||||
{
|
||||
struct bnad_drvinfo *drvinfo = (struct bnad_drvinfo *) buffer;
|
||||
struct bnad_iocmd_comp fcomp;
|
||||
unsigned long flags = 0;
|
||||
int ret = BFA_STATUS_FAILED;
|
||||
|
||||
/* Get IOC info */
|
||||
spin_lock_irqsave(&bnad->bna_lock, flags);
|
||||
bfa_nw_ioc_get_attr(&bnad->bna.ioceth.ioc, &drvinfo->ioc_attr);
|
||||
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
||||
|
||||
/* Retrieve CEE related info */
|
||||
fcomp.bnad = bnad;
|
||||
fcomp.comp_status = 0;
|
||||
init_completion(&fcomp.comp);
|
||||
spin_lock_irqsave(&bnad->bna_lock, flags);
|
||||
ret = bfa_nw_cee_get_attr(&bnad->bna.cee, &drvinfo->cee_attr,
|
||||
bnad_cb_completion, &fcomp);
|
||||
if (ret != BFA_STATUS_OK) {
|
||||
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
||||
goto out;
|
||||
}
|
||||
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
||||
wait_for_completion(&fcomp.comp);
|
||||
drvinfo->cee_status = fcomp.comp_status;
|
||||
|
||||
/* Retrieve flash partition info */
|
||||
fcomp.comp_status = 0;
|
||||
init_completion(&fcomp.comp);
|
||||
spin_lock_irqsave(&bnad->bna_lock, flags);
|
||||
ret = bfa_nw_flash_get_attr(&bnad->bna.flash, &drvinfo->flash_attr,
|
||||
bnad_cb_completion, &fcomp);
|
||||
if (ret != BFA_STATUS_OK) {
|
||||
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
||||
goto out;
|
||||
}
|
||||
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
||||
wait_for_completion(&fcomp.comp);
|
||||
drvinfo->flash_status = fcomp.comp_status;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
bnad_debugfs_open_drvinfo(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct bnad *bnad = inode->i_private;
|
||||
struct bnad_debug_info *drv_info;
|
||||
int rc;
|
||||
|
||||
drv_info = kzalloc(sizeof(struct bnad_debug_info), GFP_KERNEL);
|
||||
if (!drv_info)
|
||||
return -ENOMEM;
|
||||
|
||||
drv_info->buffer_len = sizeof(struct bnad_drvinfo);
|
||||
|
||||
drv_info->debug_buffer = kzalloc(drv_info->buffer_len, GFP_KERNEL);
|
||||
if (!drv_info->debug_buffer) {
|
||||
kfree(drv_info);
|
||||
drv_info = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mutex_lock(&bnad->conf_mutex);
|
||||
rc = bnad_get_debug_drvinfo(bnad, drv_info->debug_buffer,
|
||||
drv_info->buffer_len);
|
||||
mutex_unlock(&bnad->conf_mutex);
|
||||
if (rc != BFA_STATUS_OK) {
|
||||
kfree(drv_info->debug_buffer);
|
||||
drv_info->debug_buffer = NULL;
|
||||
kfree(drv_info);
|
||||
drv_info = NULL;
|
||||
pr_warn("bna %s: Failed to collect drvinfo\n",
|
||||
pci_name(bnad->pcidev));
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
file->private_data = drv_info;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Changes the current file position */
|
||||
static loff_t
|
||||
bnad_debugfs_lseek(struct file *file, loff_t offset, int orig)
|
||||
{
|
||||
struct bnad_debug_info *debug = file->private_data;
|
||||
|
||||
if (!debug)
|
||||
return -EINVAL;
|
||||
|
||||
return fixed_size_llseek(file, offset, orig, debug->buffer_len);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
bnad_debugfs_read(struct file *file, char __user *buf,
|
||||
size_t nbytes, loff_t *pos)
|
||||
{
|
||||
struct bnad_debug_info *debug = file->private_data;
|
||||
|
||||
if (!debug || !debug->debug_buffer)
|
||||
return 0;
|
||||
|
||||
return simple_read_from_buffer(buf, nbytes, pos,
|
||||
debug->debug_buffer, debug->buffer_len);
|
||||
}
|
||||
|
||||
#define BFA_REG_CT_ADDRSZ (0x40000)
|
||||
#define BFA_REG_CB_ADDRSZ (0x20000)
|
||||
#define BFA_REG_ADDRSZ(__ioc) \
|
||||
((u32)(bfa_asic_id_ctc(bfa_ioc_devid(__ioc)) ? \
|
||||
BFA_REG_CT_ADDRSZ : BFA_REG_CB_ADDRSZ))
|
||||
#define BFA_REG_ADDRMSK(__ioc) (BFA_REG_ADDRSZ(__ioc) - 1)
|
||||
|
||||
/*
|
||||
* Function to check if the register offset passed is valid.
|
||||
*/
|
||||
static int
|
||||
bna_reg_offset_check(struct bfa_ioc *ioc, u32 offset, u32 len)
|
||||
{
|
||||
u8 area;
|
||||
|
||||
/* check [16:15] */
|
||||
area = (offset >> 15) & 0x7;
|
||||
if (area == 0) {
|
||||
/* PCIe core register */
|
||||
if ((offset + (len<<2)) > 0x8000) /* 8k dwords or 32KB */
|
||||
return BFA_STATUS_EINVAL;
|
||||
} else if (area == 0x1) {
|
||||
/* CB 32 KB memory page */
|
||||
if ((offset + (len<<2)) > 0x10000) /* 8k dwords or 32KB */
|
||||
return BFA_STATUS_EINVAL;
|
||||
} else {
|
||||
/* CB register space 64KB */
|
||||
if ((offset + (len<<2)) > BFA_REG_ADDRMSK(ioc))
|
||||
return BFA_STATUS_EINVAL;
|
||||
}
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
bnad_debugfs_read_regrd(struct file *file, char __user *buf,
|
||||
size_t nbytes, loff_t *pos)
|
||||
{
|
||||
struct bnad_debug_info *regrd_debug = file->private_data;
|
||||
struct bnad *bnad = (struct bnad *)regrd_debug->i_private;
|
||||
ssize_t rc;
|
||||
|
||||
if (!bnad->regdata)
|
||||
return 0;
|
||||
|
||||
rc = simple_read_from_buffer(buf, nbytes, pos,
|
||||
bnad->regdata, bnad->reglen);
|
||||
|
||||
if ((*pos + nbytes) >= bnad->reglen) {
|
||||
kfree(bnad->regdata);
|
||||
bnad->regdata = NULL;
|
||||
bnad->reglen = 0;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
bnad_debugfs_write_regrd(struct file *file, const char __user *buf,
|
||||
size_t nbytes, loff_t *ppos)
|
||||
{
|
||||
struct bnad_debug_info *regrd_debug = file->private_data;
|
||||
struct bnad *bnad = (struct bnad *)regrd_debug->i_private;
|
||||
struct bfa_ioc *ioc = &bnad->bna.ioceth.ioc;
|
||||
int addr, len, rc, i;
|
||||
u32 *regbuf;
|
||||
void __iomem *rb, *reg_addr;
|
||||
unsigned long flags;
|
||||
void *kern_buf;
|
||||
|
||||
/* Allocate memory to store the user space buf */
|
||||
kern_buf = kzalloc(nbytes, GFP_KERNEL);
|
||||
if (!kern_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
if (copy_from_user(kern_buf, (void __user *)buf, nbytes)) {
|
||||
kfree(kern_buf);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
rc = sscanf(kern_buf, "%x:%x", &addr, &len);
|
||||
if (rc < 2) {
|
||||
pr_warn("bna %s: Failed to read user buffer\n",
|
||||
pci_name(bnad->pcidev));
|
||||
kfree(kern_buf);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
kfree(kern_buf);
|
||||
kfree(bnad->regdata);
|
||||
bnad->regdata = NULL;
|
||||
bnad->reglen = 0;
|
||||
|
||||
bnad->regdata = kzalloc(len << 2, GFP_KERNEL);
|
||||
if (!bnad->regdata)
|
||||
return -ENOMEM;
|
||||
|
||||
bnad->reglen = len << 2;
|
||||
rb = bfa_ioc_bar0(ioc);
|
||||
addr &= BFA_REG_ADDRMSK(ioc);
|
||||
|
||||
/* offset and len sanity check */
|
||||
rc = bna_reg_offset_check(ioc, addr, len);
|
||||
if (rc) {
|
||||
pr_warn("bna %s: Failed reg offset check\n",
|
||||
pci_name(bnad->pcidev));
|
||||
kfree(bnad->regdata);
|
||||
bnad->regdata = NULL;
|
||||
bnad->reglen = 0;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
reg_addr = rb + addr;
|
||||
regbuf = (u32 *)bnad->regdata;
|
||||
spin_lock_irqsave(&bnad->bna_lock, flags);
|
||||
for (i = 0; i < len; i++) {
|
||||
*regbuf = readl(reg_addr);
|
||||
regbuf++;
|
||||
reg_addr += sizeof(u32);
|
||||
}
|
||||
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
||||
|
||||
return nbytes;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
bnad_debugfs_write_regwr(struct file *file, const char __user *buf,
|
||||
size_t nbytes, loff_t *ppos)
|
||||
{
|
||||
struct bnad_debug_info *debug = file->private_data;
|
||||
struct bnad *bnad = (struct bnad *)debug->i_private;
|
||||
struct bfa_ioc *ioc = &bnad->bna.ioceth.ioc;
|
||||
int addr, val, rc;
|
||||
void __iomem *reg_addr;
|
||||
unsigned long flags;
|
||||
void *kern_buf;
|
||||
|
||||
/* Allocate memory to store the user space buf */
|
||||
kern_buf = kzalloc(nbytes, GFP_KERNEL);
|
||||
if (!kern_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
if (copy_from_user(kern_buf, (void __user *)buf, nbytes)) {
|
||||
kfree(kern_buf);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
rc = sscanf(kern_buf, "%x:%x", &addr, &val);
|
||||
if (rc < 2) {
|
||||
pr_warn("bna %s: Failed to read user buffer\n",
|
||||
pci_name(bnad->pcidev));
|
||||
kfree(kern_buf);
|
||||
return -EINVAL;
|
||||
}
|
||||
kfree(kern_buf);
|
||||
|
||||
addr &= BFA_REG_ADDRMSK(ioc); /* offset only 17 bit and word align */
|
||||
|
||||
/* offset and len sanity check */
|
||||
rc = bna_reg_offset_check(ioc, addr, 1);
|
||||
if (rc) {
|
||||
pr_warn("bna %s: Failed reg offset check\n",
|
||||
pci_name(bnad->pcidev));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
reg_addr = (bfa_ioc_bar0(ioc)) + addr;
|
||||
spin_lock_irqsave(&bnad->bna_lock, flags);
|
||||
writel(val, reg_addr);
|
||||
spin_unlock_irqrestore(&bnad->bna_lock, flags);
|
||||
|
||||
return nbytes;
|
||||
}
|
||||
|
||||
static int
|
||||
bnad_debugfs_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct bnad_debug_info *debug = file->private_data;
|
||||
|
||||
if (!debug)
|
||||
return 0;
|
||||
|
||||
file->private_data = NULL;
|
||||
kfree(debug);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bnad_debugfs_buffer_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct bnad_debug_info *debug = file->private_data;
|
||||
|
||||
if (!debug)
|
||||
return 0;
|
||||
|
||||
kfree(debug->debug_buffer);
|
||||
|
||||
file->private_data = NULL;
|
||||
kfree(debug);
|
||||
debug = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct file_operations bnad_debugfs_op_fwtrc = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = bnad_debugfs_open_fwtrc,
|
||||
.llseek = bnad_debugfs_lseek,
|
||||
.read = bnad_debugfs_read,
|
||||
.release = bnad_debugfs_buffer_release,
|
||||
};
|
||||
|
||||
static const struct file_operations bnad_debugfs_op_fwsave = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = bnad_debugfs_open_fwsave,
|
||||
.llseek = bnad_debugfs_lseek,
|
||||
.read = bnad_debugfs_read,
|
||||
.release = bnad_debugfs_buffer_release,
|
||||
};
|
||||
|
||||
static const struct file_operations bnad_debugfs_op_regrd = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = bnad_debugfs_open_reg,
|
||||
.llseek = bnad_debugfs_lseek,
|
||||
.read = bnad_debugfs_read_regrd,
|
||||
.write = bnad_debugfs_write_regrd,
|
||||
.release = bnad_debugfs_release,
|
||||
};
|
||||
|
||||
static const struct file_operations bnad_debugfs_op_regwr = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = bnad_debugfs_open_reg,
|
||||
.llseek = bnad_debugfs_lseek,
|
||||
.write = bnad_debugfs_write_regwr,
|
||||
.release = bnad_debugfs_release,
|
||||
};
|
||||
|
||||
static const struct file_operations bnad_debugfs_op_drvinfo = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = bnad_debugfs_open_drvinfo,
|
||||
.llseek = bnad_debugfs_lseek,
|
||||
.read = bnad_debugfs_read,
|
||||
.release = bnad_debugfs_buffer_release,
|
||||
};
|
||||
|
||||
struct bnad_debugfs_entry {
|
||||
const char *name;
|
||||
umode_t mode;
|
||||
const struct file_operations *fops;
|
||||
};
|
||||
|
||||
static const struct bnad_debugfs_entry bnad_debugfs_files[] = {
|
||||
{ "fwtrc", S_IFREG|S_IRUGO, &bnad_debugfs_op_fwtrc, },
|
||||
{ "fwsave", S_IFREG|S_IRUGO, &bnad_debugfs_op_fwsave, },
|
||||
{ "regrd", S_IFREG|S_IRUGO|S_IWUSR, &bnad_debugfs_op_regrd, },
|
||||
{ "regwr", S_IFREG|S_IWUSR, &bnad_debugfs_op_regwr, },
|
||||
{ "drvinfo", S_IFREG|S_IRUGO, &bnad_debugfs_op_drvinfo, },
|
||||
};
|
||||
|
||||
static struct dentry *bna_debugfs_root;
|
||||
static atomic_t bna_debugfs_port_count;
|
||||
|
||||
/* Initialize debugfs interface for BNA */
|
||||
void
|
||||
bnad_debugfs_init(struct bnad *bnad)
|
||||
{
|
||||
const struct bnad_debugfs_entry *file;
|
||||
char name[64];
|
||||
int i;
|
||||
|
||||
/* Setup the BNA debugfs root directory*/
|
||||
if (!bna_debugfs_root) {
|
||||
bna_debugfs_root = debugfs_create_dir("bna", NULL);
|
||||
atomic_set(&bna_debugfs_port_count, 0);
|
||||
if (!bna_debugfs_root) {
|
||||
pr_warn("BNA: debugfs root dir creation failed\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Setup the pci_dev debugfs directory for the port */
|
||||
snprintf(name, sizeof(name), "pci_dev:%s", pci_name(bnad->pcidev));
|
||||
if (!bnad->port_debugfs_root) {
|
||||
bnad->port_debugfs_root =
|
||||
debugfs_create_dir(name, bna_debugfs_root);
|
||||
if (!bnad->port_debugfs_root) {
|
||||
pr_warn("bna pci_dev %s: root dir creation failed\n",
|
||||
pci_name(bnad->pcidev));
|
||||
return;
|
||||
}
|
||||
|
||||
atomic_inc(&bna_debugfs_port_count);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bnad_debugfs_files); i++) {
|
||||
file = &bnad_debugfs_files[i];
|
||||
bnad->bnad_dentry_files[i] =
|
||||
debugfs_create_file(file->name,
|
||||
file->mode,
|
||||
bnad->port_debugfs_root,
|
||||
bnad,
|
||||
file->fops);
|
||||
if (!bnad->bnad_dentry_files[i]) {
|
||||
pr_warn(
|
||||
"BNA pci_dev:%s: create %s entry failed\n",
|
||||
pci_name(bnad->pcidev), file->name);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Uninitialize debugfs interface for BNA */
|
||||
void
|
||||
bnad_debugfs_uninit(struct bnad *bnad)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bnad_debugfs_files); i++) {
|
||||
if (bnad->bnad_dentry_files[i]) {
|
||||
debugfs_remove(bnad->bnad_dentry_files[i]);
|
||||
bnad->bnad_dentry_files[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove the pci_dev debugfs directory for the port */
|
||||
if (bnad->port_debugfs_root) {
|
||||
debugfs_remove(bnad->port_debugfs_root);
|
||||
bnad->port_debugfs_root = NULL;
|
||||
atomic_dec(&bna_debugfs_port_count);
|
||||
}
|
||||
|
||||
/* Remove the BNA debugfs root directory */
|
||||
if (atomic_read(&bna_debugfs_port_count) == 0) {
|
||||
debugfs_remove(bna_debugfs_root);
|
||||
bna_debugfs_root = NULL;
|
||||
}
|
||||
}
|
1139
drivers/net/ethernet/brocade/bna/bnad_ethtool.c
Normal file
1139
drivers/net/ethernet/brocade/bna/bnad_ethtool.c
Normal file
File diff suppressed because it is too large
Load diff
106
drivers/net/ethernet/brocade/bna/cna.h
Normal file
106
drivers/net/ethernet/brocade/bna/cna.h
Normal file
|
@ -0,0 +1,106 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2006-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
|
||||
#ifndef __CNA_H__
|
||||
#define __CNA_H__
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/if_ether.h>
|
||||
|
||||
#define bfa_sm_fault(__event) do { \
|
||||
pr_err("SM Assertion failure: %s: %d: event = %d\n", \
|
||||
__FILE__, __LINE__, __event); \
|
||||
} while (0)
|
||||
|
||||
extern char bfa_version[];
|
||||
|
||||
#define CNA_FW_FILE_CT "ctfw-3.2.3.0.bin"
|
||||
#define CNA_FW_FILE_CT2 "ct2fw-3.2.3.0.bin"
|
||||
#define FC_SYMNAME_MAX 256 /*!< max name server symbolic name size */
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
typedef struct mac { u8 mac[ETH_ALEN]; } mac_t;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#define bfa_q_first(_q) ((void *)(((struct list_head *) (_q))->next))
|
||||
#define bfa_q_next(_qe) (((struct list_head *) (_qe))->next)
|
||||
#define bfa_q_prev(_qe) (((struct list_head *) (_qe))->prev)
|
||||
|
||||
/*
|
||||
* bfa_q_qe_init - to initialize a queue element
|
||||
*/
|
||||
#define bfa_q_qe_init(_qe) { \
|
||||
bfa_q_next(_qe) = (struct list_head *) NULL; \
|
||||
bfa_q_prev(_qe) = (struct list_head *) NULL; \
|
||||
}
|
||||
|
||||
/*
|
||||
* bfa_q_deq - dequeue an element from head of the queue
|
||||
*/
|
||||
#define bfa_q_deq(_q, _qe) { \
|
||||
if (!list_empty(_q)) { \
|
||||
(*((struct list_head **) (_qe))) = bfa_q_next(_q); \
|
||||
bfa_q_prev(bfa_q_next(*((struct list_head **) _qe))) = \
|
||||
(struct list_head *) (_q); \
|
||||
bfa_q_next(_q) = bfa_q_next(*((struct list_head **) _qe)); \
|
||||
bfa_q_qe_init(*((struct list_head **) _qe)); \
|
||||
} else { \
|
||||
*((struct list_head **)(_qe)) = NULL; \
|
||||
} \
|
||||
}
|
||||
|
||||
/*
|
||||
* bfa_q_deq_tail - dequeue an element from tail of the queue
|
||||
*/
|
||||
#define bfa_q_deq_tail(_q, _qe) { \
|
||||
if (!list_empty(_q)) { \
|
||||
*((struct list_head **) (_qe)) = bfa_q_prev(_q); \
|
||||
bfa_q_next(bfa_q_prev(*((struct list_head **) _qe))) = \
|
||||
(struct list_head *) (_q); \
|
||||
bfa_q_prev(_q) = bfa_q_prev(*(struct list_head **) _qe);\
|
||||
bfa_q_qe_init(*((struct list_head **) _qe)); \
|
||||
} else { \
|
||||
*((struct list_head **) (_qe)) = (struct list_head *) NULL; \
|
||||
} \
|
||||
}
|
||||
|
||||
/*
|
||||
* bfa_add_tail_head - enqueue an element at the head of queue
|
||||
*/
|
||||
#define bfa_q_enq_head(_q, _qe) { \
|
||||
if (!(bfa_q_next(_qe) == NULL) && (bfa_q_prev(_qe) == NULL)) \
|
||||
pr_err("Assertion failure: %s:%d: %d", \
|
||||
__FILE__, __LINE__, \
|
||||
(bfa_q_next(_qe) == NULL) && (bfa_q_prev(_qe) == NULL));\
|
||||
bfa_q_next(_qe) = bfa_q_next(_q); \
|
||||
bfa_q_prev(_qe) = (struct list_head *) (_q); \
|
||||
bfa_q_prev(bfa_q_next(_q)) = (struct list_head *) (_qe); \
|
||||
bfa_q_next(_q) = (struct list_head *) (_qe); \
|
||||
}
|
||||
|
||||
#endif /* __CNA_H__ */
|
89
drivers/net/ethernet/brocade/bna/cna_fwimg.c
Normal file
89
drivers/net/ethernet/brocade/bna/cna_fwimg.c
Normal file
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
* Linux network driver for Brocade Converged Network Adapter.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License (GPL) Version 2 as
|
||||
* published by the Free Software Foundation
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
||||
* All rights reserved
|
||||
* www.brocade.com
|
||||
*/
|
||||
#include <linux/firmware.h>
|
||||
#include "bnad.h"
|
||||
#include "bfi.h"
|
||||
#include "cna.h"
|
||||
|
||||
const struct firmware *bfi_fw;
|
||||
static u32 *bfi_image_ct_cna, *bfi_image_ct2_cna;
|
||||
static u32 bfi_image_ct_cna_size, bfi_image_ct2_cna_size;
|
||||
|
||||
static u32 *
|
||||
cna_read_firmware(struct pci_dev *pdev, u32 **bfi_image,
|
||||
u32 *bfi_image_size, char *fw_name)
|
||||
{
|
||||
const struct firmware *fw;
|
||||
|
||||
if (request_firmware(&fw, fw_name, &pdev->dev)) {
|
||||
pr_alert("Can't locate firmware %s\n", fw_name);
|
||||
goto error;
|
||||
}
|
||||
|
||||
*bfi_image = (u32 *)fw->data;
|
||||
*bfi_image_size = fw->size/sizeof(u32);
|
||||
bfi_fw = fw;
|
||||
|
||||
return *bfi_image;
|
||||
error:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
u32 *
|
||||
cna_get_firmware_buf(struct pci_dev *pdev)
|
||||
{
|
||||
if (pdev->device == BFA_PCI_DEVICE_ID_CT2) {
|
||||
if (bfi_image_ct2_cna_size == 0)
|
||||
cna_read_firmware(pdev, &bfi_image_ct2_cna,
|
||||
&bfi_image_ct2_cna_size, CNA_FW_FILE_CT2);
|
||||
return bfi_image_ct2_cna;
|
||||
} else if (bfa_asic_id_ct(pdev->device)) {
|
||||
if (bfi_image_ct_cna_size == 0)
|
||||
cna_read_firmware(pdev, &bfi_image_ct_cna,
|
||||
&bfi_image_ct_cna_size, CNA_FW_FILE_CT);
|
||||
return bfi_image_ct_cna;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
u32 *
|
||||
bfa_cb_image_get_chunk(enum bfi_asic_gen asic_gen, u32 off)
|
||||
{
|
||||
switch (asic_gen) {
|
||||
case BFI_ASIC_GEN_CT:
|
||||
return (bfi_image_ct_cna + off);
|
||||
case BFI_ASIC_GEN_CT2:
|
||||
return (bfi_image_ct2_cna + off);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
u32
|
||||
bfa_cb_image_get_size(enum bfi_asic_gen asic_gen)
|
||||
{
|
||||
switch (asic_gen) {
|
||||
case BFI_ASIC_GEN_CT:
|
||||
return bfi_image_ct_cna_size;
|
||||
case BFI_ASIC_GEN_CT2:
|
||||
return bfi_image_ct2_cna_size;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue