Skip to content

Commit

Permalink
netxen: refactor transmit code
Browse files Browse the repository at this point in the history
o move tx stuff into nx_host_tx_ring structure, this will
  help managing multiple tx rings in future.
o sanitize some variable names

Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Dhananjay Phadke authored and David S. Miller committed Apr 8, 2009
1 parent 1b1f789 commit d877f1e
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 120 deletions.
42 changes: 20 additions & 22 deletions drivers/net/netxen/netxen_nic.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,10 @@
(sizeof(struct netxen_rx_buffer) * rds_ring->num_desc)
#define STATUS_DESC_RINGSIZE(sds_ring) \
(sizeof(struct status_desc) * (sds_ring)->num_desc)
#define TX_BUFF_RINGSIZE(adapter) \
(sizeof(struct netxen_cmd_buffer) * adapter->num_txd)
#define TX_DESC_RINGSIZE(adapter) \
(sizeof(struct cmd_desc_type0) * adapter->num_txd)
#define TX_BUFF_RINGSIZE(tx_ring) \
(sizeof(struct netxen_cmd_buffer) * tx_ring->num_desc)
#define TX_DESC_RINGSIZE(tx_ring) \
(sizeof(struct cmd_desc_type0) * tx_ring->num_desc)

#define find_diff_among(a,b,range) ((a)<(b)?((b)-(a)):((b)+(range)-(a)))

Expand Down Expand Up @@ -639,7 +639,7 @@ extern char netxen_nic_driver_name[];
*/
struct netxen_skb_frag {
u64 dma;
ulong length;
u64 length;
};

#define _netxen_set_bits(config_word, start, bits, val) {\
Expand Down Expand Up @@ -704,9 +704,6 @@ struct netxen_hardware_context {
u8 linkup;
u16 port_type;
u16 board_type;
/* Address of cmd ring in Phantom */
struct cmd_desc_type0 *cmd_desc_head;
dma_addr_t cmd_desc_phys_addr;
};

#define MINIMUM_ETHERNET_FRAME_SIZE 64 /* With FCS */
Expand Down Expand Up @@ -752,14 +749,25 @@ struct nx_host_sds_ring {
struct napi_struct napi;
struct list_head free_list[NUM_RCV_DESC_RINGS];

u16 clean_tx;
u16 post_rxd;
int irq;

dma_addr_t phys_addr;
char name[IFNAMSIZ+4];
};

struct nx_host_tx_ring {
u32 producer;
__le32 *hw_consumer;
u32 sw_consumer;
u32 crb_cmd_producer;
u32 crb_cmd_consumer;
u32 num_desc;

struct netxen_cmd_buffer *cmd_buf_arr;
struct cmd_desc_type0 *desc_head;
dma_addr_t phys_addr;
};

/*
* Receive context. There is one such structure per instance of the
* receive processing. Any state information that is relevant to
Expand Down Expand Up @@ -1152,11 +1160,6 @@ struct netxen_adapter {
rwlock_t adapter_lock;

spinlock_t tx_clean_lock;
u32 cmd_producer;
u32 last_cmd_consumer;
u32 crb_addr_cmd_producer;
u32 crb_addr_cmd_consumer;
__le32 *cmd_consumer;

u32 num_txd;
u32 num_rxd;
Expand Down Expand Up @@ -1191,13 +1194,8 @@ struct netxen_adapter {

struct netxen_adapter_stats stats;

struct netxen_cmd_buffer *cmd_buf_arr; /* Command buffers for xmit */

/*
* Receive instances. These can be either one per port,
* or one per peg, etc.
*/
struct netxen_recv_context recv_ctx;
struct nx_host_tx_ring tx_ring;

/* Context interface shared between card and host */
struct netxen_ring_ctx *ctx_desc;
Expand Down Expand Up @@ -1409,7 +1407,7 @@ int netxen_nic_set_mac(struct net_device *netdev, void *p);
struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev);

void netxen_nic_update_cmd_producer(struct netxen_adapter *adapter,
uint32_t crb_producer);
struct nx_host_tx_ring *tx_ring, uint32_t crb_producer);

/*
* NetXen Board information
Expand Down
49 changes: 19 additions & 30 deletions drivers/net/netxen/netxen_nic_ctx.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,7 @@ nx_fw_cmd_create_tx_ctx(struct netxen_adapter *adapter)
int err = 0;
u64 offset, phys_addr;
dma_addr_t rq_phys_addr, rsp_phys_addr;
struct nx_host_tx_ring *tx_ring = &adapter->tx_ring;

rq_size = SIZEOF_HOSTRQ_TX(nx_hostrq_tx_ctx_t);
rq_addr = pci_alloc_consistent(adapter->pdev,
Expand Down Expand Up @@ -367,10 +368,8 @@ nx_fw_cmd_create_tx_ctx(struct netxen_adapter *adapter)

prq_cds = &prq->cds_ring;

prq_cds->host_phys_addr =
cpu_to_le64(adapter->ahw.cmd_desc_phys_addr);

prq_cds->ring_size = cpu_to_le32(adapter->num_txd);
prq_cds->host_phys_addr = cpu_to_le64(tx_ring->phys_addr);
prq_cds->ring_size = cpu_to_le32(tx_ring->num_desc);

phys_addr = rq_phys_addr;
err = netxen_issue_cmd(adapter,
Expand All @@ -383,8 +382,7 @@ nx_fw_cmd_create_tx_ctx(struct netxen_adapter *adapter)

if (err == NX_RCODE_SUCCESS) {
temp = le32_to_cpu(prsp->cds_ring.host_producer_crb);
adapter->crb_addr_cmd_producer =
NETXEN_NIC_REG(temp - 0x200);
tx_ring->crb_cmd_producer = NETXEN_NIC_REG(temp - 0x200);
#if 0
adapter->tx_state =
le32_to_cpu(prsp->host_ctx_state);
Expand Down Expand Up @@ -497,13 +495,13 @@ netxen_init_old_ctx(struct netxen_adapter *adapter)
struct netxen_recv_context *recv_ctx;
struct nx_host_rds_ring *rds_ring;
struct nx_host_sds_ring *sds_ring;
struct nx_host_tx_ring *tx_ring;
int ring;
int func_id = adapter->portnum;

adapter->ctx_desc->cmd_ring_addr =
cpu_to_le64(adapter->ahw.cmd_desc_phys_addr);
adapter->ctx_desc->cmd_ring_size =
cpu_to_le32(adapter->num_txd);
tx_ring = &adapter->tx_ring;
adapter->ctx_desc->cmd_ring_addr = cpu_to_le64(tx_ring->phys_addr);
adapter->ctx_desc->cmd_ring_size = cpu_to_le32(tx_ring->num_desc);

recv_ctx = &adapter->recv_ctx;

Expand Down Expand Up @@ -535,25 +533,17 @@ static uint32_t sw_int_mask[4] = {

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 ring;
struct netxen_recv_context *recv_ctx;
struct nx_host_rds_ring *rds_ring;
struct nx_host_sds_ring *sds_ring;
struct nx_host_tx_ring *tx_ring = &adapter->tx_ring;

struct pci_dev *pdev = adapter->pdev;
struct net_device *netdev = adapter->netdev;

err = netxen_receive_peg_ready(adapter);
if (err) {
printk(KERN_ERR "Rcv Peg initialization not complete:%x.\n",
state);
return err;
}

addr = pci_alloc_consistent(pdev,
sizeof(struct netxen_ring_ctx) + sizeof(uint32_t),
&adapter->ctx_desc_phys_addr);
Expand All @@ -568,21 +558,20 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
adapter->ctx_desc->cmd_consumer_offset =
cpu_to_le64(adapter->ctx_desc_phys_addr +
sizeof(struct netxen_ring_ctx));
adapter->cmd_consumer =
tx_ring->hw_consumer =
(__le32 *)(((char *)addr) + sizeof(struct netxen_ring_ctx));

/* cmd desc ring */
addr = pci_alloc_consistent(pdev,
TX_DESC_RINGSIZE(adapter),
&hw->cmd_desc_phys_addr);
addr = pci_alloc_consistent(pdev, TX_DESC_RINGSIZE(tx_ring),
&tx_ring->phys_addr);

if (addr == NULL) {
dev_err(&pdev->dev, "%s: failed to allocate tx desc ring\n",
netdev->name);
return -ENOMEM;
}

hw->cmd_desc_head = (struct cmd_desc_type0 *)addr;
tx_ring->desc_head = (struct cmd_desc_type0 *)addr;

recv_ctx = &adapter->recv_ctx;

Expand Down Expand Up @@ -658,6 +647,7 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter)
struct netxen_recv_context *recv_ctx;
struct nx_host_rds_ring *rds_ring;
struct nx_host_sds_ring *sds_ring;
struct nx_host_tx_ring *tx_ring;
int ring;

if (adapter->fw_major >= 4) {
Expand All @@ -674,13 +664,12 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter)
adapter->ctx_desc = NULL;
}

if (adapter->ahw.cmd_desc_head != NULL) {
tx_ring = &adapter->tx_ring;
if (tx_ring->desc_head != NULL) {
pci_free_consistent(adapter->pdev,
sizeof(struct cmd_desc_type0) *
adapter->num_txd,
adapter->ahw.cmd_desc_head,
adapter->ahw.cmd_desc_phys_addr);
adapter->ahw.cmd_desc_head = NULL;
TX_DESC_RINGSIZE(tx_ring),
tx_ring->desc_head, tx_ring->phys_addr);
tx_ring->desc_head = NULL;
}

recv_ctx = &adapter->recv_ctx;
Expand Down
37 changes: 18 additions & 19 deletions drivers/net/netxen/netxen_nic_hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -501,45 +501,44 @@ static int nx_p3_nic_add_mac(struct netxen_adapter *adapter,

static int
netxen_send_cmd_descs(struct netxen_adapter *adapter,
struct cmd_desc_type0 *cmd_desc_arr, int nr_elements)
struct cmd_desc_type0 *cmd_desc_arr, int nr_desc)
{
uint32_t i, producer;
u32 i, producer, consumer;
struct netxen_cmd_buffer *pbuf;
struct cmd_desc_type0 *cmd_desc;

if (nr_elements > MAX_PENDING_DESC_BLOCK_SIZE || nr_elements == 0) {
printk(KERN_WARNING "%s: Too many command descriptors in a "
"request\n", __func__);
return -EINVAL;
}
struct nx_host_tx_ring *tx_ring;

i = 0;

tx_ring = &adapter->tx_ring;
netif_tx_lock_bh(adapter->netdev);

producer = adapter->cmd_producer;
producer = tx_ring->producer;
consumer = tx_ring->sw_consumer;

if (nr_desc > find_diff_among(producer, consumer, tx_ring->num_desc)) {
netif_tx_unlock_bh(adapter->netdev);
return -EBUSY;
}

do {
cmd_desc = &cmd_desc_arr[i];

pbuf = &adapter->cmd_buf_arr[producer];
pbuf = &tx_ring->cmd_buf_arr[producer];
pbuf->skb = NULL;
pbuf->frag_count = 0;

/* adapter->ahw.cmd_desc_head[producer] = *cmd_desc; */
memcpy(&adapter->ahw.cmd_desc_head[producer],
memcpy(&tx_ring->desc_head[producer],
&cmd_desc_arr[i], sizeof(struct cmd_desc_type0));

producer = get_next_index(producer,
adapter->num_txd);
producer = get_next_index(producer, tx_ring->num_desc);
i++;

} while (i != nr_elements);

adapter->cmd_producer = producer;
} while (i != nr_desc);

/* write producer index to start the xmit */
tx_ring->producer = producer;

netxen_nic_update_cmd_producer(adapter, adapter->cmd_producer);
netxen_nic_update_cmd_producer(adapter, tx_ring, producer);

netif_tx_unlock_bh(adapter->netdev);

Expand Down
Loading

0 comments on commit d877f1e

Please sign in to comment.