aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2016-04-07 14:39:38 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-08 15:26:04 -0400
commit73725d9dfd99c5bb1da4d25bbe980231aa48d251 (patch)
tree8cf252700bb4ce02d966b6c9b106265fb76273e9
parentd79737c25e4a170e7cd75866e45042de746934d8 (diff)
nfp: allocate ring SW structs dynamically
To be able to switch rings more easily on config changes allocate them dynamically, separately from nfp_net structure. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net.h6
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_common.c28
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c20
3 files changed, 37 insertions, 17 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net.h b/drivers/net/ethernet/netronome/nfp/nfp_net.h
index 75683fb26734..fc005c982b7d 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net.h
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net.h
@@ -472,6 +472,9 @@ struct nfp_net {
472 472
473 u32 rx_offset; 473 u32 rx_offset;
474 474
475 struct nfp_net_tx_ring *tx_rings;
476 struct nfp_net_rx_ring *rx_rings;
477
475#ifdef CONFIG_PCI_IOV 478#ifdef CONFIG_PCI_IOV
476 unsigned int num_vfs; 479 unsigned int num_vfs;
477 struct vf_data_storage *vfinfo; 480 struct vf_data_storage *vfinfo;
@@ -504,9 +507,6 @@ struct nfp_net {
504 int txd_cnt; 507 int txd_cnt;
505 int rxd_cnt; 508 int rxd_cnt;
506 509
507 struct nfp_net_tx_ring tx_rings[NFP_NET_MAX_TX_RINGS];
508 struct nfp_net_rx_ring rx_rings[NFP_NET_MAX_RX_RINGS];
509
510 u8 num_irqs; 510 u8 num_irqs;
511 u8 num_r_vecs; 511 u8 num_r_vecs;
512 struct nfp_net_r_vector r_vecs[NFP_NET_MAX_TX_RINGS]; 512 struct nfp_net_r_vector r_vecs[NFP_NET_MAX_TX_RINGS];
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index 7cd20fcd631a..66fab7162b7c 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -413,12 +413,6 @@ static void nfp_net_irqs_assign(struct net_device *netdev)
413 r_vec->irq_idx = NFP_NET_NON_Q_VECTORS + r; 413 r_vec->irq_idx = NFP_NET_NON_Q_VECTORS + r;
414 414
415 cpumask_set_cpu(r, &r_vec->affinity_mask); 415 cpumask_set_cpu(r, &r_vec->affinity_mask);
416
417 r_vec->tx_ring = &nn->tx_rings[r];
418 nfp_net_tx_ring_init(r_vec->tx_ring, r_vec, r);
419
420 r_vec->rx_ring = &nn->rx_rings[r];
421 nfp_net_rx_ring_init(r_vec->rx_ring, r_vec, r);
422 } 416 }
423} 417}
424 418
@@ -1503,6 +1497,12 @@ nfp_net_prepare_vector(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,
1503 struct msix_entry *entry = &nn->irq_entries[r_vec->irq_idx]; 1497 struct msix_entry *entry = &nn->irq_entries[r_vec->irq_idx];
1504 int err; 1498 int err;
1505 1499
1500 r_vec->tx_ring = &nn->tx_rings[idx];
1501 nfp_net_tx_ring_init(r_vec->tx_ring, r_vec, idx);
1502
1503 r_vec->rx_ring = &nn->rx_rings[idx];
1504 nfp_net_rx_ring_init(r_vec->rx_ring, r_vec, idx);
1505
1506 snprintf(r_vec->name, sizeof(r_vec->name), 1506 snprintf(r_vec->name, sizeof(r_vec->name),
1507 "%s-rxtx-%d", nn->netdev->name, idx); 1507 "%s-rxtx-%d", nn->netdev->name, idx);
1508 err = request_irq(entry->vector, r_vec->handler, 0, r_vec->name, r_vec); 1508 err = request_irq(entry->vector, r_vec->handler, 0, r_vec->name, r_vec);
@@ -1693,6 +1693,15 @@ static int nfp_net_netdev_open(struct net_device *netdev)
1693 goto err_free_exn; 1693 goto err_free_exn;
1694 disable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector); 1694 disable_irq(nn->irq_entries[NFP_NET_CFG_LSC].vector);
1695 1695
1696 nn->rx_rings = kcalloc(nn->num_rx_rings, sizeof(*nn->rx_rings),
1697 GFP_KERNEL);
1698 if (!nn->rx_rings)
1699 goto err_free_lsc;
1700 nn->tx_rings = kcalloc(nn->num_tx_rings, sizeof(*nn->tx_rings),
1701 GFP_KERNEL);
1702 if (!nn->tx_rings)
1703 goto err_free_rx_rings;
1704
1696 for (r = 0; r < nn->num_r_vecs; r++) { 1705 for (r = 0; r < nn->num_r_vecs; r++) {
1697 err = nfp_net_prepare_vector(nn, &nn->r_vecs[r], r); 1706 err = nfp_net_prepare_vector(nn, &nn->r_vecs[r], r);
1698 if (err) 1707 if (err)
@@ -1807,6 +1816,10 @@ err_free_tx_ring_p:
1807err_cleanup_vec_p: 1816err_cleanup_vec_p:
1808 nfp_net_cleanup_vector(nn, &nn->r_vecs[r]); 1817 nfp_net_cleanup_vector(nn, &nn->r_vecs[r]);
1809 } 1818 }
1819 kfree(nn->tx_rings);
1820err_free_rx_rings:
1821 kfree(nn->rx_rings);
1822err_free_lsc:
1810 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX); 1823 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX);
1811err_free_exn: 1824err_free_exn:
1812 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX); 1825 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX);
@@ -1852,6 +1865,9 @@ static int nfp_net_netdev_close(struct net_device *netdev)
1852 nfp_net_cleanup_vector(nn, &nn->r_vecs[r]); 1865 nfp_net_cleanup_vector(nn, &nn->r_vecs[r]);
1853 } 1866 }
1854 1867
1868 kfree(nn->rx_rings);
1869 kfree(nn->tx_rings);
1870
1855 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX); 1871 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX);
1856 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX); 1872 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX);
1857 1873
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c
index 4c97c713121c..f86a1f13d27b 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugfs.c
@@ -40,8 +40,9 @@ static struct dentry *nfp_dir;
40 40
41static int nfp_net_debugfs_rx_q_read(struct seq_file *file, void *data) 41static int nfp_net_debugfs_rx_q_read(struct seq_file *file, void *data)
42{ 42{
43 struct nfp_net_rx_ring *rx_ring = file->private;
44 int fl_rd_p, fl_wr_p, rx_rd_p, rx_wr_p, rxd_cnt; 43 int fl_rd_p, fl_wr_p, rx_rd_p, rx_wr_p, rxd_cnt;
44 struct nfp_net_r_vector *r_vec = file->private;
45 struct nfp_net_rx_ring *rx_ring;
45 struct nfp_net_rx_desc *rxd; 46 struct nfp_net_rx_desc *rxd;
46 struct sk_buff *skb; 47 struct sk_buff *skb;
47 struct nfp_net *nn; 48 struct nfp_net *nn;
@@ -49,9 +50,10 @@ static int nfp_net_debugfs_rx_q_read(struct seq_file *file, void *data)
49 50
50 rtnl_lock(); 51 rtnl_lock();
51 52
52 if (!rx_ring->r_vec || !rx_ring->r_vec->nfp_net) 53 if (!r_vec->nfp_net || !r_vec->rx_ring)
53 goto out; 54 goto out;
54 nn = rx_ring->r_vec->nfp_net; 55 nn = r_vec->nfp_net;
56 rx_ring = r_vec->rx_ring;
55 if (!netif_running(nn->netdev)) 57 if (!netif_running(nn->netdev))
56 goto out; 58 goto out;
57 59
@@ -115,7 +117,8 @@ static const struct file_operations nfp_rx_q_fops = {
115 117
116static int nfp_net_debugfs_tx_q_read(struct seq_file *file, void *data) 118static int nfp_net_debugfs_tx_q_read(struct seq_file *file, void *data)
117{ 119{
118 struct nfp_net_tx_ring *tx_ring = file->private; 120 struct nfp_net_r_vector *r_vec = file->private;
121 struct nfp_net_tx_ring *tx_ring;
119 struct nfp_net_tx_desc *txd; 122 struct nfp_net_tx_desc *txd;
120 int d_rd_p, d_wr_p, txd_cnt; 123 int d_rd_p, d_wr_p, txd_cnt;
121 struct sk_buff *skb; 124 struct sk_buff *skb;
@@ -124,9 +127,10 @@ static int nfp_net_debugfs_tx_q_read(struct seq_file *file, void *data)
124 127
125 rtnl_lock(); 128 rtnl_lock();
126 129
127 if (!tx_ring->r_vec || !tx_ring->r_vec->nfp_net) 130 if (!r_vec->nfp_net || !r_vec->tx_ring)
128 goto out; 131 goto out;
129 nn = tx_ring->r_vec->nfp_net; 132 nn = r_vec->nfp_net;
133 tx_ring = r_vec->tx_ring;
130 if (!netif_running(nn->netdev)) 134 if (!netif_running(nn->netdev))
131 goto out; 135 goto out;
132 136
@@ -207,13 +211,13 @@ void nfp_net_debugfs_adapter_add(struct nfp_net *nn)
207 for (i = 0; i < nn->num_rx_rings; i++) { 211 for (i = 0; i < nn->num_rx_rings; i++) {
208 sprintf(int_name, "%d", i); 212 sprintf(int_name, "%d", i);
209 debugfs_create_file(int_name, S_IRUSR, rx, 213 debugfs_create_file(int_name, S_IRUSR, rx,
210 &nn->rx_rings[i], &nfp_rx_q_fops); 214 &nn->r_vecs[i], &nfp_rx_q_fops);
211 } 215 }
212 216
213 for (i = 0; i < nn->num_tx_rings; i++) { 217 for (i = 0; i < nn->num_tx_rings; i++) {
214 sprintf(int_name, "%d", i); 218 sprintf(int_name, "%d", i);
215 debugfs_create_file(int_name, S_IRUSR, tx, 219 debugfs_create_file(int_name, S_IRUSR, tx,
216 &nn->tx_rings[i], &nfp_tx_q_fops); 220 &nn->r_vecs[i], &nfp_tx_q_fops);
217 } 221 }
218} 222}
219 223