netxen: add netxen_nic_ctx.c
Contains rx and tx ring context management and certain firmware commands for netxen firmware v4.0.0+. This patch gathers all HW context management code into netxen_nic_ctx.c. Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
committed by
Jeff Garzik
parent
a97342f979
commit
48bfd1e0fc
@@ -280,80 +280,6 @@ static unsigned crb_hub_agt[64] =
|
||||
0,
|
||||
};
|
||||
|
||||
struct netxen_recv_crb recv_crb_registers[] = {
|
||||
/*
|
||||
* Instance 0.
|
||||
*/
|
||||
{
|
||||
/* crb_rcv_producer: */
|
||||
{
|
||||
NETXEN_NIC_REG(0x100),
|
||||
/* Jumbo frames */
|
||||
NETXEN_NIC_REG(0x110),
|
||||
/* LRO */
|
||||
NETXEN_NIC_REG(0x120)
|
||||
},
|
||||
/* crb_sts_consumer: */
|
||||
NETXEN_NIC_REG(0x138),
|
||||
},
|
||||
/*
|
||||
* Instance 1,
|
||||
*/
|
||||
{
|
||||
/* crb_rcv_producer: */
|
||||
{
|
||||
NETXEN_NIC_REG(0x144),
|
||||
/* Jumbo frames */
|
||||
NETXEN_NIC_REG(0x154),
|
||||
/* LRO */
|
||||
NETXEN_NIC_REG(0x164)
|
||||
},
|
||||
/* crb_sts_consumer: */
|
||||
NETXEN_NIC_REG(0x17c),
|
||||
},
|
||||
/*
|
||||
* Instance 2,
|
||||
*/
|
||||
{
|
||||
/* crb_rcv_producer: */
|
||||
{
|
||||
NETXEN_NIC_REG(0x1d8),
|
||||
/* Jumbo frames */
|
||||
NETXEN_NIC_REG(0x1f8),
|
||||
/* LRO */
|
||||
NETXEN_NIC_REG(0x208)
|
||||
},
|
||||
/* crb_sts_consumer: */
|
||||
NETXEN_NIC_REG(0x220),
|
||||
},
|
||||
/*
|
||||
* Instance 3,
|
||||
*/
|
||||
{
|
||||
/* crb_rcv_producer: */
|
||||
{
|
||||
NETXEN_NIC_REG(0x22c),
|
||||
/* Jumbo frames */
|
||||
NETXEN_NIC_REG(0x23c),
|
||||
/* LRO */
|
||||
NETXEN_NIC_REG(0x24c)
|
||||
},
|
||||
/* crb_sts_consumer: */
|
||||
NETXEN_NIC_REG(0x264),
|
||||
},
|
||||
};
|
||||
|
||||
static u64 ctx_addr_sig_regs[][3] = {
|
||||
{NETXEN_NIC_REG(0x188), NETXEN_NIC_REG(0x18c), NETXEN_NIC_REG(0x1c0)},
|
||||
{NETXEN_NIC_REG(0x190), NETXEN_NIC_REG(0x194), NETXEN_NIC_REG(0x1c4)},
|
||||
{NETXEN_NIC_REG(0x198), NETXEN_NIC_REG(0x19c), NETXEN_NIC_REG(0x1c8)},
|
||||
{NETXEN_NIC_REG(0x1a0), NETXEN_NIC_REG(0x1a4), NETXEN_NIC_REG(0x1cc)}
|
||||
};
|
||||
#define CRB_CTX_ADDR_REG_LO(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][0])
|
||||
#define CRB_CTX_ADDR_REG_HI(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][2])
|
||||
#define CRB_CTX_SIGNATURE_REG(FUNC_ID) (ctx_addr_sig_regs[FUNC_ID][1])
|
||||
|
||||
|
||||
/* PCI Windowing for DDR regions. */
|
||||
|
||||
#define ADDR_IN_RANGE(addr, low, high) \
|
||||
@@ -368,10 +294,6 @@ static u64 ctx_addr_sig_regs[][3] = {
|
||||
#define NETXEN_NIU_HDRSIZE (0x1 << 6)
|
||||
#define NETXEN_NIU_TLRSIZE (0x1 << 5)
|
||||
|
||||
#define lower32(x) ((u32)((x) & 0xffffffff))
|
||||
#define upper32(x) \
|
||||
((u32)(((unsigned long long)(x) >> 32) & 0xffffffff))
|
||||
|
||||
#define NETXEN_NIC_ZERO_PAUSE_ADDR 0ULL
|
||||
#define NETXEN_NIC_UNIT_PAUSE_ADDR 0x200ULL
|
||||
#define NETXEN_NIC_EPG_PAUSE_ADDR1 0x2200010000c28001ULL
|
||||
@@ -556,171 +478,6 @@ int netxen_nic_change_mtu(struct net_device *netdev, int mtu)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* check if the firmware has been downloaded and ready to run and
|
||||
* setup the address for the descriptors in the adapter
|
||||
*/
|
||||
int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
|
||||
{
|
||||
struct netxen_hardware_context *hw = &adapter->ahw;
|
||||
u32 state = 0;
|
||||
void *addr;
|
||||
int err = 0;
|
||||
int ctx, ring;
|
||||
struct netxen_recv_context *recv_ctx;
|
||||
struct netxen_rcv_desc_ctx *rcv_desc;
|
||||
int func_id = adapter->portnum;
|
||||
|
||||
err = netxen_receive_peg_ready(adapter);
|
||||
if (err) {
|
||||
printk(KERN_ERR "Rcv Peg initialization not complete:%x.\n",
|
||||
state);
|
||||
return err;
|
||||
}
|
||||
adapter->intr_scheme = adapter->pci_read_normalize(adapter,
|
||||
CRB_NIC_CAPABILITIES_FW);
|
||||
adapter->msi_mode = adapter->pci_read_normalize(adapter,
|
||||
CRB_NIC_MSI_MODE_FW);
|
||||
|
||||
addr = pci_alloc_consistent(adapter->pdev,
|
||||
sizeof(struct netxen_ring_ctx) + sizeof(uint32_t),
|
||||
&adapter->ctx_desc_phys_addr);
|
||||
|
||||
if (addr == NULL) {
|
||||
DPRINTK(ERR, "bad return from pci_alloc_consistent\n");
|
||||
err = -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
memset(addr, 0, sizeof(struct netxen_ring_ctx));
|
||||
adapter->ctx_desc = (struct netxen_ring_ctx *)addr;
|
||||
adapter->ctx_desc->ctx_id = cpu_to_le32(adapter->portnum);
|
||||
adapter->ctx_desc->cmd_consumer_offset =
|
||||
cpu_to_le64(adapter->ctx_desc_phys_addr +
|
||||
sizeof(struct netxen_ring_ctx));
|
||||
adapter->cmd_consumer = (__le32 *) (((char *)addr) +
|
||||
sizeof(struct netxen_ring_ctx));
|
||||
|
||||
addr = pci_alloc_consistent(adapter->pdev,
|
||||
sizeof(struct cmd_desc_type0) *
|
||||
adapter->max_tx_desc_count,
|
||||
&hw->cmd_desc_phys_addr);
|
||||
|
||||
if (addr == NULL) {
|
||||
DPRINTK(ERR, "bad return from pci_alloc_consistent\n");
|
||||
netxen_free_hw_resources(adapter);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
adapter->ctx_desc->cmd_ring_addr =
|
||||
cpu_to_le64(hw->cmd_desc_phys_addr);
|
||||
adapter->ctx_desc->cmd_ring_size =
|
||||
cpu_to_le32(adapter->max_tx_desc_count);
|
||||
|
||||
hw->cmd_desc_head = (struct cmd_desc_type0 *)addr;
|
||||
|
||||
for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
|
||||
recv_ctx = &adapter->recv_ctx[ctx];
|
||||
|
||||
for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
|
||||
rcv_desc = &recv_ctx->rcv_desc[ring];
|
||||
addr = pci_alloc_consistent(adapter->pdev,
|
||||
RCV_DESC_RINGSIZE,
|
||||
&rcv_desc->phys_addr);
|
||||
if (addr == NULL) {
|
||||
DPRINTK(ERR, "bad return from "
|
||||
"pci_alloc_consistent\n");
|
||||
netxen_free_hw_resources(adapter);
|
||||
err = -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
rcv_desc->desc_head = (struct rcv_desc *)addr;
|
||||
adapter->ctx_desc->rcv_ctx[ring].rcv_ring_addr =
|
||||
cpu_to_le64(rcv_desc->phys_addr);
|
||||
adapter->ctx_desc->rcv_ctx[ring].rcv_ring_size =
|
||||
cpu_to_le32(rcv_desc->max_rx_desc_count);
|
||||
rcv_desc->crb_rcv_producer =
|
||||
recv_crb_registers[adapter->portnum].
|
||||
crb_rcv_producer[ring];
|
||||
}
|
||||
|
||||
addr = pci_alloc_consistent(adapter->pdev, STATUS_DESC_RINGSIZE,
|
||||
&recv_ctx->rcv_status_desc_phys_addr);
|
||||
if (addr == NULL) {
|
||||
DPRINTK(ERR, "bad return from"
|
||||
" pci_alloc_consistent\n");
|
||||
netxen_free_hw_resources(adapter);
|
||||
err = -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
recv_ctx->rcv_status_desc_head = (struct status_desc *)addr;
|
||||
adapter->ctx_desc->sts_ring_addr =
|
||||
cpu_to_le64(recv_ctx->rcv_status_desc_phys_addr);
|
||||
adapter->ctx_desc->sts_ring_size =
|
||||
cpu_to_le32(adapter->max_rx_desc_count);
|
||||
recv_ctx->crb_sts_consumer =
|
||||
recv_crb_registers[adapter->portnum].crb_sts_consumer;
|
||||
|
||||
}
|
||||
/* Window = 1 */
|
||||
|
||||
adapter->pci_write_normalize(adapter, CRB_CTX_ADDR_REG_LO(func_id),
|
||||
lower32(adapter->ctx_desc_phys_addr));
|
||||
adapter->pci_write_normalize(adapter, CRB_CTX_ADDR_REG_HI(func_id),
|
||||
upper32(adapter->ctx_desc_phys_addr));
|
||||
adapter->pci_write_normalize(adapter, CRB_CTX_SIGNATURE_REG(func_id),
|
||||
NETXEN_CTX_SIGNATURE | func_id);
|
||||
return err;
|
||||
}
|
||||
|
||||
void netxen_free_hw_resources(struct netxen_adapter *adapter)
|
||||
{
|
||||
struct netxen_recv_context *recv_ctx;
|
||||
struct netxen_rcv_desc_ctx *rcv_desc;
|
||||
int ctx, ring;
|
||||
|
||||
if (adapter->ctx_desc != NULL) {
|
||||
pci_free_consistent(adapter->pdev,
|
||||
sizeof(struct netxen_ring_ctx) +
|
||||
sizeof(uint32_t),
|
||||
adapter->ctx_desc,
|
||||
adapter->ctx_desc_phys_addr);
|
||||
adapter->ctx_desc = NULL;
|
||||
}
|
||||
|
||||
if (adapter->ahw.cmd_desc_head != NULL) {
|
||||
pci_free_consistent(adapter->pdev,
|
||||
sizeof(struct cmd_desc_type0) *
|
||||
adapter->max_tx_desc_count,
|
||||
adapter->ahw.cmd_desc_head,
|
||||
adapter->ahw.cmd_desc_phys_addr);
|
||||
adapter->ahw.cmd_desc_head = NULL;
|
||||
}
|
||||
|
||||
for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
|
||||
recv_ctx = &adapter->recv_ctx[ctx];
|
||||
for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
|
||||
rcv_desc = &recv_ctx->rcv_desc[ring];
|
||||
|
||||
if (rcv_desc->desc_head != NULL) {
|
||||
pci_free_consistent(adapter->pdev,
|
||||
RCV_DESC_RINGSIZE,
|
||||
rcv_desc->desc_head,
|
||||
rcv_desc->phys_addr);
|
||||
rcv_desc->desc_head = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (recv_ctx->rcv_status_desc_head != NULL) {
|
||||
pci_free_consistent(adapter->pdev,
|
||||
STATUS_DESC_RINGSIZE,
|
||||
recv_ctx->rcv_status_desc_head,
|
||||
recv_ctx->
|
||||
rcv_status_desc_phys_addr);
|
||||
recv_ctx->rcv_status_desc_head = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void netxen_tso_check(struct netxen_adapter *adapter,
|
||||
struct cmd_desc_type0 *desc, struct sk_buff *skb)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user