aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_main.c
diff options
context:
space:
mode:
authorDhananjay Phadke <dhananjay@netxen.com>2009-04-07 18:50:43 -0400
committerDavid S. Miller <davem@davemloft.net>2009-04-08 18:58:28 -0400
commit71dcddbdd35487eb931aa8aab28a2df474008754 (patch)
tree64b1b1aca84e118edea9865a350aed93e0a8b813 /drivers/net/netxen/netxen_nic_main.c
parent3bf26ce3f4cc3c9e0d0478b4016c6113a16faaf1 (diff)
netxen: allocate status rings dynamically
This reduces netxen_adapter footprint when rss (msi-x) is disabled. Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r--drivers/net/netxen/netxen_nic_main.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index bd93296be4dd..cbd47ae694ba 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -153,7 +153,24 @@ static inline void netxen_nic_enable_int(struct nx_host_sds_ring *sds_ring)
153 adapter->legacy_intr.tgt_mask_reg, 0xfbff); 153 adapter->legacy_intr.tgt_mask_reg, 0xfbff);
154} 154}
155 155
156static int
157netxen_alloc_sds_rings(struct netxen_recv_context *recv_ctx, int count)
158{
159 int size = sizeof(struct nx_host_sds_ring) * count;
160
161 recv_ctx->sds_rings = kzalloc(size, GFP_KERNEL);
162
163 return (recv_ctx->sds_rings == NULL);
164}
165
156static void 166static void
167netxen_free_sds_rings(struct netxen_recv_context *recv_ctx)
168{
169 if (recv_ctx->sds_rings != NULL)
170 kfree(recv_ctx->sds_rings);
171}
172
173static int
157netxen_napi_add(struct netxen_adapter *adapter, struct net_device *netdev) 174netxen_napi_add(struct netxen_adapter *adapter, struct net_device *netdev)
158{ 175{
159 int ring; 176 int ring;
@@ -165,11 +182,16 @@ netxen_napi_add(struct netxen_adapter *adapter, struct net_device *netdev)
165 else 182 else
166 adapter->max_sds_rings = 1; 183 adapter->max_sds_rings = 1;
167 184
185 if (netxen_alloc_sds_rings(recv_ctx, adapter->max_sds_rings))
186 return 1;
187
168 for (ring = 0; ring < adapter->max_sds_rings; ring++) { 188 for (ring = 0; ring < adapter->max_sds_rings; ring++) {
169 sds_ring = &recv_ctx->sds_rings[ring]; 189 sds_ring = &recv_ctx->sds_rings[ring];
170 netif_napi_add(netdev, &sds_ring->napi, 190 netif_napi_add(netdev, &sds_ring->napi,
171 netxen_nic_poll, NETXEN_NETDEV_WEIGHT); 191 netxen_nic_poll, NETXEN_NETDEV_WEIGHT);
172 } 192 }
193
194 return 0;
173} 195}
174 196
175static void 197static void
@@ -1028,7 +1050,8 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1028 1050
1029 netdev->irq = adapter->msix_entries[0].vector; 1051 netdev->irq = adapter->msix_entries[0].vector;
1030 1052
1031 netxen_napi_add(adapter, netdev); 1053 if (netxen_napi_add(adapter, netdev))
1054 goto err_out_disable_msi;
1032 1055
1033 init_timer(&adapter->watchdog_timer); 1056 init_timer(&adapter->watchdog_timer);
1034 adapter->watchdog_timer.function = &netxen_watchdog; 1057 adapter->watchdog_timer.function = &netxen_watchdog;
@@ -1110,6 +1133,7 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
1110 netxen_free_adapter_offload(adapter); 1133 netxen_free_adapter_offload(adapter);
1111 1134
1112 netxen_teardown_intr(adapter); 1135 netxen_teardown_intr(adapter);
1136 netxen_free_sds_rings(&adapter->recv_ctx);
1113 1137
1114 netxen_cleanup_pci_map(adapter); 1138 netxen_cleanup_pci_map(adapter);
1115 1139