• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/net/netxen/
1/*
2 * Copyright (C) 2003 - 2009 NetXen, Inc.
3 * Copyright (C) 2009 - QLogic Corporation.
4 * All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
19 * MA  02111-1307, USA.
20 *
21 * The full GNU General Public License is included in this distribution
22 * in the file called "COPYING".
23 *
24 */
25
26#include <linux/slab.h>
27#include <linux/vmalloc.h>
28#include <linux/interrupt.h>
29#include "netxen_nic_hw.h"
30
31#include "netxen_nic.h"
32
33#include <linux/dma-mapping.h>
34#include <linux/if_vlan.h>
35#include <net/ip.h>
36#include <linux/ipv6.h>
37#include <linux/inetdevice.h>
38#include <linux/sysfs.h>
39#include <linux/aer.h>
40
41MODULE_DESCRIPTION("QLogic/NetXen (1/10) GbE Converged Ethernet Driver");
42MODULE_LICENSE("GPL");
43MODULE_VERSION(NETXEN_NIC_LINUX_VERSIONID);
44MODULE_FIRMWARE(NX_P2_MN_ROMIMAGE_NAME);
45MODULE_FIRMWARE(NX_P3_CT_ROMIMAGE_NAME);
46MODULE_FIRMWARE(NX_P3_MN_ROMIMAGE_NAME);
47MODULE_FIRMWARE(NX_UNIFIED_ROMIMAGE_NAME);
48
49char netxen_nic_driver_name[] = "netxen_nic";
50static char netxen_nic_driver_string[] = "QLogic/NetXen Network Driver v"
51    NETXEN_NIC_LINUX_VERSIONID;
52
53static int port_mode = NETXEN_PORT_MODE_AUTO_NEG;
54
55/* Default to restricted 1G auto-neg mode */
56static int wol_port_mode = 5;
57
58static int use_msi = 1;
59
60static int use_msi_x = 1;
61
62static int auto_fw_reset = AUTO_FW_RESET_ENABLED;
63module_param(auto_fw_reset, int, 0644);
64MODULE_PARM_DESC(auto_fw_reset,"Auto firmware reset (0=disabled, 1=enabled");
65
66static int __devinit netxen_nic_probe(struct pci_dev *pdev,
67		const struct pci_device_id *ent);
68static void __devexit netxen_nic_remove(struct pci_dev *pdev);
69static int netxen_nic_open(struct net_device *netdev);
70static int netxen_nic_close(struct net_device *netdev);
71static netdev_tx_t netxen_nic_xmit_frame(struct sk_buff *,
72					       struct net_device *);
73static void netxen_tx_timeout(struct net_device *netdev);
74static void netxen_tx_timeout_task(struct work_struct *work);
75static void netxen_fw_poll_work(struct work_struct *work);
76static void netxen_schedule_work(struct netxen_adapter *adapter,
77		work_func_t func, int delay);
78static void netxen_cancel_fw_work(struct netxen_adapter *adapter);
79static int netxen_nic_poll(struct napi_struct *napi, int budget);
80#ifdef CONFIG_NET_POLL_CONTROLLER
81static void netxen_nic_poll_controller(struct net_device *netdev);
82#endif
83
84static void netxen_create_sysfs_entries(struct netxen_adapter *adapter);
85static void netxen_remove_sysfs_entries(struct netxen_adapter *adapter);
86static void netxen_create_diag_entries(struct netxen_adapter *adapter);
87static void netxen_remove_diag_entries(struct netxen_adapter *adapter);
88
89static int nx_dev_request_aer(struct netxen_adapter *adapter);
90static int nx_decr_dev_ref_cnt(struct netxen_adapter *adapter);
91static int netxen_can_start_firmware(struct netxen_adapter *adapter);
92
93static irqreturn_t netxen_intr(int irq, void *data);
94static irqreturn_t netxen_msi_intr(int irq, void *data);
95static irqreturn_t netxen_msix_intr(int irq, void *data);
96
97static void netxen_config_indev_addr(struct net_device *dev, unsigned long);
98
99/*  PCI Device ID Table  */
100#define ENTRY(device) \
101	{PCI_DEVICE(PCI_VENDOR_ID_NETXEN, (device)), \
102	.class = PCI_CLASS_NETWORK_ETHERNET << 8, .class_mask = ~0}
103
104static DEFINE_PCI_DEVICE_TABLE(netxen_pci_tbl) = {
105	ENTRY(PCI_DEVICE_ID_NX2031_10GXSR),
106	ENTRY(PCI_DEVICE_ID_NX2031_10GCX4),
107	ENTRY(PCI_DEVICE_ID_NX2031_4GCU),
108	ENTRY(PCI_DEVICE_ID_NX2031_IMEZ),
109	ENTRY(PCI_DEVICE_ID_NX2031_HMEZ),
110	ENTRY(PCI_DEVICE_ID_NX2031_XG_MGMT),
111	ENTRY(PCI_DEVICE_ID_NX2031_XG_MGMT2),
112	ENTRY(PCI_DEVICE_ID_NX3031),
113	{0,}
114};
115
116MODULE_DEVICE_TABLE(pci, netxen_pci_tbl);
117
118static uint32_t crb_cmd_producer[4] = {
119	CRB_CMD_PRODUCER_OFFSET, CRB_CMD_PRODUCER_OFFSET_1,
120	CRB_CMD_PRODUCER_OFFSET_2, CRB_CMD_PRODUCER_OFFSET_3
121};
122
123void
124netxen_nic_update_cmd_producer(struct netxen_adapter *adapter,
125		struct nx_host_tx_ring *tx_ring)
126{
127	NXWRIO(adapter, tx_ring->crb_cmd_producer, tx_ring->producer);
128
129	if (netxen_tx_avail(tx_ring) <= TX_STOP_THRESH) {
130		netif_stop_queue(adapter->netdev);
131		smp_mb();
132	}
133}
134
135static uint32_t crb_cmd_consumer[4] = {
136	CRB_CMD_CONSUMER_OFFSET, CRB_CMD_CONSUMER_OFFSET_1,
137	CRB_CMD_CONSUMER_OFFSET_2, CRB_CMD_CONSUMER_OFFSET_3
138};
139
140static inline void
141netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter,
142		struct nx_host_tx_ring *tx_ring)
143{
144	NXWRIO(adapter, tx_ring->crb_cmd_consumer, tx_ring->sw_consumer);
145}
146
147static uint32_t msi_tgt_status[8] = {
148	ISR_INT_TARGET_STATUS, ISR_INT_TARGET_STATUS_F1,
149	ISR_INT_TARGET_STATUS_F2, ISR_INT_TARGET_STATUS_F3,
150	ISR_INT_TARGET_STATUS_F4, ISR_INT_TARGET_STATUS_F5,
151	ISR_INT_TARGET_STATUS_F6, ISR_INT_TARGET_STATUS_F7
152};
153
154static struct netxen_legacy_intr_set legacy_intr[] = NX_LEGACY_INTR_CONFIG;
155
156static inline void netxen_nic_disable_int(struct nx_host_sds_ring *sds_ring)
157{
158	struct netxen_adapter *adapter = sds_ring->adapter;
159
160	NXWRIO(adapter, sds_ring->crb_intr_mask, 0);
161}
162
163static inline void netxen_nic_enable_int(struct nx_host_sds_ring *sds_ring)
164{
165	struct netxen_adapter *adapter = sds_ring->adapter;
166
167	NXWRIO(adapter, sds_ring->crb_intr_mask, 0x1);
168
169	if (!NETXEN_IS_MSI_FAMILY(adapter))
170		NXWRIO(adapter, adapter->tgt_mask_reg, 0xfbff);
171}
172
173static int
174netxen_alloc_sds_rings(struct netxen_recv_context *recv_ctx, int count)
175{
176	int size = sizeof(struct nx_host_sds_ring) * count;
177
178	recv_ctx->sds_rings = kzalloc(size, GFP_KERNEL);
179
180	return (recv_ctx->sds_rings == NULL);
181}
182
183static void
184netxen_free_sds_rings(struct netxen_recv_context *recv_ctx)
185{
186	if (recv_ctx->sds_rings != NULL)
187		kfree(recv_ctx->sds_rings);
188
189	recv_ctx->sds_rings = NULL;
190}
191
192static int
193netxen_napi_add(struct netxen_adapter *adapter, struct net_device *netdev)
194{
195	int ring;
196	struct nx_host_sds_ring *sds_ring;
197	struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
198
199	if (netxen_alloc_sds_rings(recv_ctx, adapter->max_sds_rings))
200		return -ENOMEM;
201
202	for (ring = 0; ring < adapter->max_sds_rings; ring++) {
203		sds_ring = &recv_ctx->sds_rings[ring];
204		netif_napi_add(netdev, &sds_ring->napi,
205				netxen_nic_poll, NETXEN_NETDEV_WEIGHT);
206	}
207
208	return 0;
209}
210
211static void
212netxen_napi_del(struct netxen_adapter *adapter)
213{
214	int ring;
215	struct nx_host_sds_ring *sds_ring;
216	struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
217
218	for (ring = 0; ring < adapter->max_sds_rings; ring++) {
219		sds_ring = &recv_ctx->sds_rings[ring];
220		netif_napi_del(&sds_ring->napi);
221	}
222
223	netxen_free_sds_rings(&adapter->recv_ctx);
224}
225
226static void
227netxen_napi_enable(struct netxen_adapter *adapter)
228{
229	int ring;
230	struct nx_host_sds_ring *sds_ring;
231	struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
232
233	for (ring = 0; ring < adapter->max_sds_rings; ring++) {
234		sds_ring = &recv_ctx->sds_rings[ring];
235		napi_enable(&sds_ring->napi);
236		netxen_nic_enable_int(sds_ring);
237	}
238}
239
240static void
241netxen_napi_disable(struct netxen_adapter *adapter)
242{
243	int ring;
244	struct nx_host_sds_ring *sds_ring;
245	struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
246
247	for (ring = 0; ring < adapter->max_sds_rings; ring++) {
248		sds_ring = &recv_ctx->sds_rings[ring];
249		netxen_nic_disable_int(sds_ring);
250		napi_synchronize(&sds_ring->napi);
251		napi_disable(&sds_ring->napi);
252	}
253}
254
255static int nx_set_dma_mask(struct netxen_adapter *adapter)
256{
257	struct pci_dev *pdev = adapter->pdev;
258	uint64_t mask, cmask;
259
260	adapter->pci_using_dac = 0;
261
262	mask = DMA_BIT_MASK(32);
263	cmask = DMA_BIT_MASK(32);
264
265	if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
266#ifndef CONFIG_IA64
267		mask = DMA_BIT_MASK(35);
268#endif
269	} else {
270		mask = DMA_BIT_MASK(39);
271		cmask = mask;
272	}
273
274	if (pci_set_dma_mask(pdev, mask) == 0 &&
275		pci_set_consistent_dma_mask(pdev, cmask) == 0) {
276		adapter->pci_using_dac = 1;
277		return 0;
278	}
279
280	return -EIO;
281}
282
283/* Update addressable range if firmware supports it */
284static int
285nx_update_dma_mask(struct netxen_adapter *adapter)
286{
287	int change, shift, err;
288	uint64_t mask, old_mask, old_cmask;
289	struct pci_dev *pdev = adapter->pdev;
290
291	change = 0;
292
293	shift = NXRD32(adapter, CRB_DMA_SHIFT);
294	if (shift > 32)
295		return 0;
296
297	if (NX_IS_REVISION_P3(adapter->ahw.revision_id) && (shift > 9))
298		change = 1;
299	else if ((adapter->ahw.revision_id == NX_P2_C1) && (shift <= 4))
300		change = 1;
301
302	if (change) {
303		old_mask = pdev->dma_mask;
304		old_cmask = pdev->dev.coherent_dma_mask;
305
306		mask = DMA_BIT_MASK(32+shift);
307
308		err = pci_set_dma_mask(pdev, mask);
309		if (err)
310			goto err_out;
311
312		if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
313
314			err = pci_set_consistent_dma_mask(pdev, mask);
315			if (err)
316				goto err_out;
317		}
318		dev_info(&pdev->dev, "using %d-bit dma mask\n", 32+shift);
319	}
320
321	return 0;
322
323err_out:
324	pci_set_dma_mask(pdev, old_mask);
325	pci_set_consistent_dma_mask(pdev, old_cmask);
326	return err;
327}
328
329static int
330netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot)
331{
332	u32 val, timeout;
333
334	if (first_boot == 0x55555555) {
335		/* This is the first boot after power up */
336		NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
337
338		if (!NX_IS_REVISION_P2(adapter->ahw.revision_id))
339			return 0;
340
341		first_boot = NXRD32(adapter, NETXEN_PCIE_REG(0x4));
342		if (!(first_boot & 0x4)) {
343			first_boot |= 0x4;
344			NXWR32(adapter, NETXEN_PCIE_REG(0x4), first_boot);
345			NXRD32(adapter, NETXEN_PCIE_REG(0x4));
346		}
347
348		/* This is the first boot after power up */
349		first_boot = NXRD32(adapter, NETXEN_ROMUSB_GLB_SW_RESET);
350		if (first_boot != 0x80000f) {
351			/* clear the register for future unloads/loads */
352			NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), 0);
353			return -EIO;
354		}
355
356		/* Start P2 boot loader */
357		val = NXRD32(adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE);
358		NXWR32(adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE, val | 0x1);
359		timeout = 0;
360		do {
361			msleep(1);
362			val = NXRD32(adapter, NETXEN_CAM_RAM(0x1fc));
363
364			if (++timeout > 5000)
365				return -EIO;
366
367		} while (val == NETXEN_BDINFO_MAGIC);
368	}
369	return 0;
370}
371
372static void netxen_set_port_mode(struct netxen_adapter *adapter)
373{
374	u32 val, data;
375
376	val = adapter->ahw.board_type;
377	if ((val == NETXEN_BRDTYPE_P3_HMEZ) ||
378		(val == NETXEN_BRDTYPE_P3_XG_LOM)) {
379		if (port_mode == NETXEN_PORT_MODE_802_3_AP) {
380			data = NETXEN_PORT_MODE_802_3_AP;
381			NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
382		} else if (port_mode == NETXEN_PORT_MODE_XG) {
383			data = NETXEN_PORT_MODE_XG;
384			NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
385		} else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_1G) {
386			data = NETXEN_PORT_MODE_AUTO_NEG_1G;
387			NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
388		} else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_XG) {
389			data = NETXEN_PORT_MODE_AUTO_NEG_XG;
390			NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
391		} else {
392			data = NETXEN_PORT_MODE_AUTO_NEG;
393			NXWR32(adapter, NETXEN_PORT_MODE_ADDR, data);
394		}
395
396		if ((wol_port_mode != NETXEN_PORT_MODE_802_3_AP) &&
397			(wol_port_mode != NETXEN_PORT_MODE_XG) &&
398			(wol_port_mode != NETXEN_PORT_MODE_AUTO_NEG_1G) &&
399			(wol_port_mode != NETXEN_PORT_MODE_AUTO_NEG_XG)) {
400			wol_port_mode = NETXEN_PORT_MODE_AUTO_NEG;
401		}
402		NXWR32(adapter, NETXEN_WOL_PORT_MODE, wol_port_mode);
403	}
404}
405
406static void netxen_set_msix_bit(struct pci_dev *pdev, int enable)
407{
408	u32 control;
409	int pos;
410
411	pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
412	if (pos) {
413		pci_read_config_dword(pdev, pos, &control);
414		if (enable)
415			control |= PCI_MSIX_FLAGS_ENABLE;
416		else
417			control = 0;
418		pci_write_config_dword(pdev, pos, control);
419	}
420}
421
422static void netxen_init_msix_entries(struct netxen_adapter *adapter, int count)
423{
424	int i;
425
426	for (i = 0; i < count; i++)
427		adapter->msix_entries[i].entry = i;
428}
429
430static int
431netxen_read_mac_addr(struct netxen_adapter *adapter)
432{
433	int i;
434	unsigned char *p;
435	u64 mac_addr;
436	struct net_device *netdev = adapter->netdev;
437	struct pci_dev *pdev = adapter->pdev;
438
439	if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
440		if (netxen_p3_get_mac_addr(adapter, &mac_addr) != 0)
441			return -EIO;
442	} else {
443		if (netxen_get_flash_mac_addr(adapter, &mac_addr) != 0)
444			return -EIO;
445	}
446
447	p = (unsigned char *)&mac_addr;
448	for (i = 0; i < 6; i++)
449		netdev->dev_addr[i] = *(p + 5 - i);
450
451	memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len);
452	memcpy(adapter->mac_addr, netdev->dev_addr, netdev->addr_len);
453
454	/* set station address */
455
456	if (!is_valid_ether_addr(netdev->perm_addr))
457		dev_warn(&pdev->dev, "Bad MAC address %pM.\n", netdev->dev_addr);
458
459	return 0;
460}
461
462int netxen_nic_set_mac(struct net_device *netdev, void *p)
463{
464	struct netxen_adapter *adapter = netdev_priv(netdev);
465	struct sockaddr *addr = p;
466
467	if (!is_valid_ether_addr(addr->sa_data))
468		return -EINVAL;
469
470	if (netif_running(netdev)) {
471		netif_device_detach(netdev);
472		netxen_napi_disable(adapter);
473	}
474
475	memcpy(adapter->mac_addr, addr->sa_data, netdev->addr_len);
476	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
477	adapter->macaddr_set(adapter, addr->sa_data);
478
479	if (netif_running(netdev)) {
480		netif_device_attach(netdev);
481		netxen_napi_enable(adapter);
482	}
483	return 0;
484}
485
486static void netxen_set_multicast_list(struct net_device *dev)
487{
488	struct netxen_adapter *adapter = netdev_priv(dev);
489
490	adapter->set_multi(dev);
491}
492
493static const struct net_device_ops netxen_netdev_ops = {
494	.ndo_open	   = netxen_nic_open,
495	.ndo_stop	   = netxen_nic_close,
496	.ndo_start_xmit    = netxen_nic_xmit_frame,
497	.ndo_get_stats	   = netxen_nic_get_stats,
498	.ndo_validate_addr = eth_validate_addr,
499	.ndo_set_multicast_list = netxen_set_multicast_list,
500	.ndo_set_mac_address    = netxen_nic_set_mac,
501	.ndo_change_mtu	   = netxen_nic_change_mtu,
502	.ndo_tx_timeout	   = netxen_tx_timeout,
503#ifdef CONFIG_NET_POLL_CONTROLLER
504	.ndo_poll_controller = netxen_nic_poll_controller,
505#endif
506};
507
508static void
509netxen_setup_intr(struct netxen_adapter *adapter)
510{
511	struct netxen_legacy_intr_set *legacy_intrp;
512	struct pci_dev *pdev = adapter->pdev;
513	int err, num_msix;
514
515	if (adapter->rss_supported) {
516		num_msix = (num_online_cpus() >= MSIX_ENTRIES_PER_ADAPTER) ?
517			MSIX_ENTRIES_PER_ADAPTER : 2;
518	} else
519		num_msix = 1;
520
521	adapter->max_sds_rings = 1;
522
523	adapter->flags &= ~(NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED);
524
525	if (adapter->ahw.revision_id >= NX_P3_B0)
526		legacy_intrp = &legacy_intr[adapter->ahw.pci_func];
527	else
528		legacy_intrp = &legacy_intr[0];
529
530	adapter->int_vec_bit = legacy_intrp->int_vec_bit;
531	adapter->tgt_status_reg = netxen_get_ioaddr(adapter,
532			legacy_intrp->tgt_status_reg);
533	adapter->tgt_mask_reg = netxen_get_ioaddr(adapter,
534			legacy_intrp->tgt_mask_reg);
535	adapter->pci_int_reg = netxen_get_ioaddr(adapter,
536			legacy_intrp->pci_int_reg);
537	adapter->isr_int_vec = netxen_get_ioaddr(adapter, ISR_INT_VECTOR);
538
539	if (adapter->ahw.revision_id >= NX_P3_B1)
540		adapter->crb_int_state_reg = netxen_get_ioaddr(adapter,
541			ISR_INT_STATE_REG);
542	else
543		adapter->crb_int_state_reg = netxen_get_ioaddr(adapter,
544			CRB_INT_VECTOR);
545
546	netxen_set_msix_bit(pdev, 0);
547
548	if (adapter->msix_supported) {
549
550		netxen_init_msix_entries(adapter, num_msix);
551		err = pci_enable_msix(pdev, adapter->msix_entries, num_msix);
552		if (err == 0) {
553			adapter->flags |= NETXEN_NIC_MSIX_ENABLED;
554			netxen_set_msix_bit(pdev, 1);
555
556			if (adapter->rss_supported)
557				adapter->max_sds_rings = num_msix;
558
559			dev_info(&pdev->dev, "using msi-x interrupts\n");
560			return;
561		}
562
563		if (err > 0)
564			pci_disable_msix(pdev);
565
566		/* fall through for msi */
567	}
568
569	if (use_msi && !pci_enable_msi(pdev)) {
570		adapter->flags |= NETXEN_NIC_MSI_ENABLED;
571		adapter->tgt_status_reg = netxen_get_ioaddr(adapter,
572				msi_tgt_status[adapter->ahw.pci_func]);
573		dev_info(&pdev->dev, "using msi interrupts\n");
574		adapter->msix_entries[0].vector = pdev->irq;
575		return;
576	}
577
578	dev_info(&pdev->dev, "using legacy interrupts\n");
579	adapter->msix_entries[0].vector = pdev->irq;
580}
581
582static void
583netxen_teardown_intr(struct netxen_adapter *adapter)
584{
585	if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
586		pci_disable_msix(adapter->pdev);
587	if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
588		pci_disable_msi(adapter->pdev);
589}
590
591static void
592netxen_cleanup_pci_map(struct netxen_adapter *adapter)
593{
594	if (adapter->ahw.db_base != NULL)
595		iounmap(adapter->ahw.db_base);
596	if (adapter->ahw.pci_base0 != NULL)
597		iounmap(adapter->ahw.pci_base0);
598	if (adapter->ahw.pci_base1 != NULL)
599		iounmap(adapter->ahw.pci_base1);
600	if (adapter->ahw.pci_base2 != NULL)
601		iounmap(adapter->ahw.pci_base2);
602}
603
604static int
605netxen_setup_pci_map(struct netxen_adapter *adapter)
606{
607	void __iomem *db_ptr = NULL;
608
609	resource_size_t mem_base, db_base;
610	unsigned long mem_len, db_len = 0;
611
612	struct pci_dev *pdev = adapter->pdev;
613	int pci_func = adapter->ahw.pci_func;
614	struct netxen_hardware_context *ahw = &adapter->ahw;
615
616	int err = 0;
617
618	/*
619	 * Set the CRB window to invalid. If any register in window 0 is
620	 * accessed it should set the window to 0 and then reset it to 1.
621	 */
622	adapter->ahw.crb_win = -1;
623	adapter->ahw.ocm_win = -1;
624
625	/* remap phys address */
626	mem_base = pci_resource_start(pdev, 0);	/* 0 is for BAR 0 */
627	mem_len = pci_resource_len(pdev, 0);
628
629	/* 128 Meg of memory */
630	if (mem_len == NETXEN_PCI_128MB_SIZE) {
631
632		ahw->pci_base0 = ioremap(mem_base, FIRST_PAGE_GROUP_SIZE);
633		ahw->pci_base1 = ioremap(mem_base + SECOND_PAGE_GROUP_START,
634				SECOND_PAGE_GROUP_SIZE);
635		ahw->pci_base2 = ioremap(mem_base + THIRD_PAGE_GROUP_START,
636				THIRD_PAGE_GROUP_SIZE);
637		if (ahw->pci_base0 == NULL || ahw->pci_base1 == NULL ||
638						ahw->pci_base2 == NULL) {
639			dev_err(&pdev->dev, "failed to map PCI bar 0\n");
640			err = -EIO;
641			goto err_out;
642		}
643
644		ahw->pci_len0 = FIRST_PAGE_GROUP_SIZE;
645
646	} else if (mem_len == NETXEN_PCI_32MB_SIZE) {
647
648		ahw->pci_base1 = ioremap(mem_base, SECOND_PAGE_GROUP_SIZE);
649		ahw->pci_base2 = ioremap(mem_base + THIRD_PAGE_GROUP_START -
650			SECOND_PAGE_GROUP_START, THIRD_PAGE_GROUP_SIZE);
651		if (ahw->pci_base1 == NULL || ahw->pci_base2 == NULL) {
652			dev_err(&pdev->dev, "failed to map PCI bar 0\n");
653			err = -EIO;
654			goto err_out;
655		}
656
657	} else if (mem_len == NETXEN_PCI_2MB_SIZE) {
658
659		ahw->pci_base0 = pci_ioremap_bar(pdev, 0);
660		if (ahw->pci_base0 == NULL) {
661			dev_err(&pdev->dev, "failed to map PCI bar 0\n");
662			return -EIO;
663		}
664		ahw->pci_len0 = mem_len;
665	} else {
666		return -EIO;
667	}
668
669	netxen_setup_hwops(adapter);
670
671	dev_info(&pdev->dev, "%dMB memory map\n", (int)(mem_len>>20));
672
673	if (NX_IS_REVISION_P3P(adapter->ahw.revision_id)) {
674		adapter->ahw.ocm_win_crb = netxen_get_ioaddr(adapter,
675			NETXEN_PCIX_PS_REG(PCIX_OCM_WINDOW_REG(pci_func)));
676
677	} else if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
678		adapter->ahw.ocm_win_crb = netxen_get_ioaddr(adapter,
679			NETXEN_PCIX_PS_REG(PCIE_MN_WINDOW_REG(pci_func)));
680	}
681
682	if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
683		goto skip_doorbell;
684
685	db_base = pci_resource_start(pdev, 4);	/* doorbell is on bar 4 */
686	db_len = pci_resource_len(pdev, 4);
687
688	if (db_len == 0) {
689		printk(KERN_ERR "%s: doorbell is disabled\n",
690				netxen_nic_driver_name);
691		err = -EIO;
692		goto err_out;
693	}
694
695	db_ptr = ioremap(db_base, NETXEN_DB_MAPSIZE_BYTES);
696	if (!db_ptr) {
697		printk(KERN_ERR "%s: Failed to allocate doorbell map.",
698				netxen_nic_driver_name);
699		err = -EIO;
700		goto err_out;
701	}
702
703skip_doorbell:
704	adapter->ahw.db_base = db_ptr;
705	adapter->ahw.db_len = db_len;
706	return 0;
707
708err_out:
709	netxen_cleanup_pci_map(adapter);
710	return err;
711}
712
713static void
714netxen_check_options(struct netxen_adapter *adapter)
715{
716	u32 fw_major, fw_minor, fw_build;
717	char brd_name[NETXEN_MAX_SHORT_NAME];
718	char serial_num[32];
719	int i, offset, val;
720	int *ptr32;
721	struct pci_dev *pdev = adapter->pdev;
722
723	adapter->driver_mismatch = 0;
724
725	ptr32 = (int *)&serial_num;
726	offset = NX_FW_SERIAL_NUM_OFFSET;
727	for (i = 0; i < 8; i++) {
728		if (netxen_rom_fast_read(adapter, offset, &val) == -1) {
729			dev_err(&pdev->dev, "error reading board info\n");
730			adapter->driver_mismatch = 1;
731			return;
732		}
733		ptr32[i] = cpu_to_le32(val);
734		offset += sizeof(u32);
735	}
736
737	fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR);
738	fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR);
739	fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB);
740
741	adapter->fw_version = NETXEN_VERSION_CODE(fw_major, fw_minor, fw_build);
742
743	if (adapter->portnum == 0) {
744		get_brd_name_by_type(adapter->ahw.board_type, brd_name);
745
746		pr_info("%s: %s Board S/N %s  Chip rev 0x%x\n",
747				module_name(THIS_MODULE),
748				brd_name, serial_num, adapter->ahw.revision_id);
749	}
750
751	if (adapter->fw_version < NETXEN_VERSION_CODE(3, 4, 216)) {
752		adapter->driver_mismatch = 1;
753		dev_warn(&pdev->dev, "firmware version %d.%d.%d unsupported\n",
754				fw_major, fw_minor, fw_build);
755		return;
756	}
757
758	if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
759		i = NXRD32(adapter, NETXEN_SRE_MISC);
760		adapter->ahw.cut_through = (i & 0x8000) ? 1 : 0;
761	}
762
763	dev_info(&pdev->dev, "firmware v%d.%d.%d [%s]\n",
764			fw_major, fw_minor, fw_build,
765			adapter->ahw.cut_through ? "cut-through" : "legacy");
766
767	if (adapter->fw_version >= NETXEN_VERSION_CODE(4, 0, 222))
768		adapter->capabilities = NXRD32(adapter, CRB_FW_CAPABILITIES_1);
769
770	adapter->flags &= ~NETXEN_NIC_LRO_ENABLED;
771
772	if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
773		adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G;
774		adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
775	} else if (adapter->ahw.port_type == NETXEN_NIC_GBE) {
776		adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
777		adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
778	}
779
780	adapter->msix_supported = 0;
781	if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
782		adapter->msix_supported = !!use_msi_x;
783		adapter->rss_supported = !!use_msi_x;
784	} else {
785		u32 flashed_ver = 0;
786		netxen_rom_fast_read(adapter,
787				NX_FW_VERSION_OFFSET, (int *)&flashed_ver);
788		flashed_ver = NETXEN_DECODE_VERSION(flashed_ver);
789
790		if (flashed_ver >= NETXEN_VERSION_CODE(3, 4, 336)) {
791			switch (adapter->ahw.board_type) {
792			case NETXEN_BRDTYPE_P2_SB31_10G:
793			case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
794				adapter->msix_supported = !!use_msi_x;
795				adapter->rss_supported = !!use_msi_x;
796				break;
797			default:
798				break;
799			}
800		}
801	}
802
803	adapter->num_txd = MAX_CMD_DESCRIPTORS;
804
805	if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
806		adapter->num_lro_rxd = MAX_LRO_RCV_DESCRIPTORS;
807		adapter->max_rds_rings = 3;
808	} else {
809		adapter->num_lro_rxd = 0;
810		adapter->max_rds_rings = 2;
811	}
812}
813
814static int
815netxen_start_firmware(struct netxen_adapter *adapter)
816{
817	int val, err, first_boot;
818	struct pci_dev *pdev = adapter->pdev;
819
820	/* required for NX2031 dummy dma */
821	err = nx_set_dma_mask(adapter);
822	if (err)
823		return err;
824
825	if (!netxen_can_start_firmware(adapter))
826		goto wait_init;
827
828	first_boot = NXRD32(adapter, NETXEN_CAM_RAM(0x1fc));
829
830	err = netxen_check_hw_init(adapter, first_boot);
831	if (err) {
832		dev_err(&pdev->dev, "error in init HW init sequence\n");
833		return err;
834	}
835
836	netxen_request_firmware(adapter);
837
838	err = netxen_need_fw_reset(adapter);
839	if (err < 0)
840		goto err_out;
841	if (err == 0)
842		goto wait_init;
843
844	if (first_boot != 0x55555555) {
845		NXWR32(adapter, CRB_CMDPEG_STATE, 0);
846		netxen_pinit_from_rom(adapter);
847		msleep(1);
848	}
849
850	NXWR32(adapter, CRB_DMA_SHIFT, 0x55555555);
851	NXWR32(adapter, NETXEN_PEG_HALT_STATUS1, 0);
852	NXWR32(adapter, NETXEN_PEG_HALT_STATUS2, 0);
853
854	if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
855		netxen_set_port_mode(adapter);
856
857	err = netxen_load_firmware(adapter);
858	if (err)
859		goto err_out;
860
861	netxen_release_firmware(adapter);
862
863	if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
864
865		/* Initialize multicast addr pool owners */
866		val = 0x7654;
867		if (adapter->ahw.port_type == NETXEN_NIC_XGBE)
868			val |= 0x0f000000;
869		NXWR32(adapter, NETXEN_MAC_ADDR_CNTL_REG, val);
870
871	}
872
873	err = netxen_init_dummy_dma(adapter);
874	if (err)
875		goto err_out;
876
877	/*
878	 * Tell the hardware our version number.
879	 */
880	val = (_NETXEN_NIC_LINUX_MAJOR << 16)
881		| ((_NETXEN_NIC_LINUX_MINOR << 8))
882		| (_NETXEN_NIC_LINUX_SUBVERSION);
883	NXWR32(adapter, CRB_DRIVER_VERSION, val);
884
885wait_init:
886	/* Handshake with the card before we register the devices. */
887	err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
888	if (err) {
889		netxen_free_dummy_dma(adapter);
890		goto err_out;
891	}
892
893	NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_READY);
894
895	nx_update_dma_mask(adapter);
896
897	netxen_check_options(adapter);
898
899	adapter->need_fw_reset = 0;
900
901	/* fall through and release firmware */
902
903err_out:
904	netxen_release_firmware(adapter);
905	return err;
906}
907
908static int
909netxen_nic_request_irq(struct netxen_adapter *adapter)
910{
911	irq_handler_t handler;
912	struct nx_host_sds_ring *sds_ring;
913	int err, ring;
914
915	unsigned long flags = IRQF_SAMPLE_RANDOM;
916	struct net_device *netdev = adapter->netdev;
917	struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
918
919	if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
920		handler = netxen_msix_intr;
921	else if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
922		handler = netxen_msi_intr;
923	else {
924		flags |= IRQF_SHARED;
925		handler = netxen_intr;
926	}
927	adapter->irq = netdev->irq;
928
929	for (ring = 0; ring < adapter->max_sds_rings; ring++) {
930		sds_ring = &recv_ctx->sds_rings[ring];
931		sprintf(sds_ring->name, "%s[%d]", netdev->name, ring);
932		err = request_irq(sds_ring->irq, handler,
933				  flags, sds_ring->name, sds_ring);
934		if (err)
935			return err;
936	}
937
938	return 0;
939}
940
941static void
942netxen_nic_free_irq(struct netxen_adapter *adapter)
943{
944	int ring;
945	struct nx_host_sds_ring *sds_ring;
946
947	struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
948
949	for (ring = 0; ring < adapter->max_sds_rings; ring++) {
950		sds_ring = &recv_ctx->sds_rings[ring];
951		free_irq(sds_ring->irq, sds_ring);
952	}
953}
954
955static void
956netxen_nic_init_coalesce_defaults(struct netxen_adapter *adapter)
957{
958	adapter->coal.flags = NETXEN_NIC_INTR_DEFAULT;
959	adapter->coal.normal.data.rx_time_us =
960		NETXEN_DEFAULT_INTR_COALESCE_RX_TIME_US;
961	adapter->coal.normal.data.rx_packets =
962		NETXEN_DEFAULT_INTR_COALESCE_RX_PACKETS;
963	adapter->coal.normal.data.tx_time_us =
964		NETXEN_DEFAULT_INTR_COALESCE_TX_TIME_US;
965	adapter->coal.normal.data.tx_packets =
966		NETXEN_DEFAULT_INTR_COALESCE_TX_PACKETS;
967}
968
969/* with rtnl_lock */
970static int
971__netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev)
972{
973	int err;
974
975	if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
976		return -EIO;
977
978	err = adapter->init_port(adapter, adapter->physical_port);
979	if (err) {
980		printk(KERN_ERR "%s: Failed to initialize port %d\n",
981				netxen_nic_driver_name, adapter->portnum);
982		return err;
983	}
984	if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
985		adapter->macaddr_set(adapter, adapter->mac_addr);
986
987	adapter->set_multi(netdev);
988	adapter->set_mtu(adapter, netdev->mtu);
989
990	adapter->ahw.linkup = 0;
991
992	if (adapter->max_sds_rings > 1)
993		netxen_config_rss(adapter, 1);
994
995	if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
996		netxen_config_intr_coalesce(adapter);
997
998	if (adapter->capabilities & NX_FW_CAPABILITY_HW_LRO)
999		netxen_config_hw_lro(adapter, NETXEN_NIC_LRO_ENABLED);
1000
1001	netxen_napi_enable(adapter);
1002
1003	if (adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION)
1004		netxen_linkevent_request(adapter, 1);
1005	else
1006		netxen_nic_set_link_parameters(adapter);
1007
1008	set_bit(__NX_DEV_UP, &adapter->state);
1009	return 0;
1010}
1011
1012/* Usage: During resume and firmware recovery module.*/
1013
1014static inline int
1015netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev)
1016{
1017	int err = 0;
1018
1019	rtnl_lock();
1020	if (netif_running(netdev))
1021		err = __netxen_nic_up(adapter, netdev);
1022	rtnl_unlock();
1023
1024	return err;
1025}
1026
1027/* with rtnl_lock */
1028static void
1029__netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
1030{
1031	if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
1032		return;
1033
1034	if (!test_and_clear_bit(__NX_DEV_UP, &adapter->state))
1035		return;
1036
1037	smp_mb();
1038	spin_lock(&adapter->tx_clean_lock);
1039	netif_carrier_off(netdev);
1040	netif_tx_disable(netdev);
1041
1042	if (adapter->stop_port)
1043		adapter->stop_port(adapter);
1044
1045	if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
1046		netxen_p3_free_mac_list(adapter);
1047
1048	adapter->set_promisc(adapter, NETXEN_NIU_NON_PROMISC_MODE);
1049
1050	netxen_napi_disable(adapter);
1051
1052	netxen_release_tx_buffers(adapter);
1053	spin_unlock(&adapter->tx_clean_lock);
1054}
1055
1056/* Usage: During suspend and firmware recovery module */
1057
1058static inline void
1059netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
1060{
1061	rtnl_lock();
1062	if (netif_running(netdev))
1063		__netxen_nic_down(adapter, netdev);
1064	rtnl_unlock();
1065
1066}
1067
1068static int
1069netxen_nic_attach(struct netxen_adapter *adapter)
1070{
1071	struct net_device *netdev = adapter->netdev;
1072	struct pci_dev *pdev = adapter->pdev;
1073	int err, ring;
1074	struct nx_host_rds_ring *rds_ring;
1075	struct nx_host_tx_ring *tx_ring;
1076
1077	if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC)
1078		return 0;
1079
1080	err = netxen_init_firmware(adapter);
1081	if (err)
1082		return err;
1083
1084	err = netxen_napi_add(adapter, netdev);
1085	if (err)
1086		return err;
1087
1088	err = netxen_alloc_sw_resources(adapter);
1089	if (err) {
1090		printk(KERN_ERR "%s: Error in setting sw resources\n",
1091				netdev->name);
1092		return err;
1093	}
1094
1095	err = netxen_alloc_hw_resources(adapter);
1096	if (err) {
1097		printk(KERN_ERR "%s: Error in setting hw resources\n",
1098				netdev->name);
1099		goto err_out_free_sw;
1100	}
1101
1102	if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
1103		tx_ring = adapter->tx_ring;
1104		tx_ring->crb_cmd_producer = netxen_get_ioaddr(adapter,
1105				crb_cmd_producer[adapter->portnum]);
1106		tx_ring->crb_cmd_consumer = netxen_get_ioaddr(adapter,
1107				crb_cmd_consumer[adapter->portnum]);
1108
1109		tx_ring->producer = 0;
1110		tx_ring->sw_consumer = 0;
1111
1112		netxen_nic_update_cmd_producer(adapter, tx_ring);
1113		netxen_nic_update_cmd_consumer(adapter, tx_ring);
1114	}
1115
1116	for (ring = 0; ring < adapter->max_rds_rings; ring++) {
1117		rds_ring = &adapter->recv_ctx.rds_rings[ring];
1118		netxen_post_rx_buffers(adapter, ring, rds_ring);
1119	}
1120
1121	err = netxen_nic_request_irq(adapter);
1122	if (err) {
1123		dev_err(&pdev->dev, "%s: failed to setup interrupt\n",
1124				netdev->name);
1125		goto err_out_free_rxbuf;
1126	}
1127
1128	if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
1129		netxen_nic_init_coalesce_defaults(adapter);
1130
1131	netxen_create_sysfs_entries(adapter);
1132
1133	adapter->is_up = NETXEN_ADAPTER_UP_MAGIC;
1134	return 0;
1135
1136err_out_free_rxbuf:
1137	netxen_release_rx_buffers(adapter);
1138	netxen_free_hw_resources(adapter);
1139err_out_free_sw:
1140	netxen_free_sw_resources(adapter);
1141	return err;
1142}
1143
1144static void
1145netxen_nic_detach(struct netxen_adapter *adapter)
1146{
1147	if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
1148		return;
1149
1150	netxen_remove_sysfs_entries(adapter);
1151
1152	netxen_free_hw_resources(adapter);
1153	netxen_release_rx_buffers(adapter);
1154	netxen_nic_free_irq(adapter);
1155	netxen_napi_del(adapter);
1156	netxen_free_sw_resources(adapter);
1157
1158	adapter->is_up = 0;
1159}
1160
1161int
1162netxen_nic_reset_context(struct netxen_adapter *adapter)
1163{
1164	int err = 0;
1165	struct net_device *netdev = adapter->netdev;
1166
1167	if (test_and_set_bit(__NX_RESETTING, &adapter->state))
1168		return -EBUSY;
1169
1170	if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
1171
1172		netif_device_detach(netdev);
1173
1174		if (netif_running(netdev))
1175			__netxen_nic_down(adapter, netdev);
1176
1177		netxen_nic_detach(adapter);
1178
1179		if (netif_running(netdev)) {
1180			err = netxen_nic_attach(adapter);
1181			if (!err)
1182				err = __netxen_nic_up(adapter, netdev);
1183
1184			if (err)
1185				goto done;
1186		}
1187
1188		netif_device_attach(netdev);
1189	}
1190
1191done:
1192	clear_bit(__NX_RESETTING, &adapter->state);
1193	return err;
1194}
1195
1196static int
1197netxen_setup_netdev(struct netxen_adapter *adapter,
1198		struct net_device *netdev)
1199{
1200	int err = 0;
1201	struct pci_dev *pdev = adapter->pdev;
1202
1203	adapter->rx_csum = 1;
1204	adapter->mc_enabled = 0;
1205	if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
1206		adapter->max_mc_count = 38;
1207	else
1208		adapter->max_mc_count = 16;
1209
1210	netdev->netdev_ops	   = &netxen_netdev_ops;
1211	netdev->watchdog_timeo     = 2*HZ;
1212
1213	netxen_nic_change_mtu(netdev, netdev->mtu);
1214
1215	SET_ETHTOOL_OPS(netdev, &netxen_nic_ethtool_ops);
1216
1217	netdev->features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
1218	netdev->features |= (NETIF_F_GRO);
1219	netdev->vlan_features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
1220
1221	if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
1222		netdev->features |= (NETIF_F_IPV6_CSUM | NETIF_F_TSO6);
1223		netdev->vlan_features |= (NETIF_F_IPV6_CSUM | NETIF_F_TSO6);
1224	}
1225
1226	if (adapter->pci_using_dac) {
1227		netdev->features |= NETIF_F_HIGHDMA;
1228		netdev->vlan_features |= NETIF_F_HIGHDMA;
1229	}
1230
1231	if (adapter->capabilities & NX_FW_CAPABILITY_FVLANTX)
1232		netdev->features |= (NETIF_F_HW_VLAN_TX);
1233
1234	if (adapter->capabilities & NX_FW_CAPABILITY_HW_LRO)
1235		netdev->features |= NETIF_F_LRO;
1236
1237	netdev->irq = adapter->msix_entries[0].vector;
1238
1239	INIT_WORK(&adapter->tx_timeout_task, netxen_tx_timeout_task);
1240
1241	if (netxen_read_mac_addr(adapter))
1242		dev_warn(&pdev->dev, "failed to read mac addr\n");
1243
1244	netif_carrier_off(netdev);
1245	netif_stop_queue(netdev);
1246
1247	err = register_netdev(netdev);
1248	if (err) {
1249		dev_err(&pdev->dev, "failed to register net device\n");
1250		return err;
1251	}
1252
1253	return 0;
1254}
1255
1256static int __devinit
1257netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1258{
1259	struct net_device *netdev = NULL;
1260	struct netxen_adapter *adapter = NULL;
1261	int i = 0, err;
1262	int pci_func_id = PCI_FUNC(pdev->devfn);
1263	uint8_t revision_id;
1264
1265	if (pdev->revision >= NX_P3_A0 && pdev->revision <= NX_P3_B1) {
1266		pr_warning("%s: chip revisions between 0x%x-0x%x "
1267				"will not be enabled.\n",
1268				module_name(THIS_MODULE), NX_P3_A0, NX_P3_B1);
1269		return -ENODEV;
1270	}
1271
1272	if ((err = pci_enable_device(pdev)))
1273		return err;
1274
1275	if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
1276		err = -ENODEV;
1277		goto err_out_disable_pdev;
1278	}
1279
1280	if ((err = pci_request_regions(pdev, netxen_nic_driver_name)))
1281		goto err_out_disable_pdev;
1282
1283	if (NX_IS_REVISION_P3(pdev->revision))
1284		pci_enable_pcie_error_reporting(pdev);
1285
1286	pci_set_master(pdev);
1287
1288	netdev = alloc_etherdev(sizeof(struct netxen_adapter));
1289	if(!netdev) {
1290		dev_err(&pdev->dev, "failed to allocate net_device\n");
1291		err = -ENOMEM;
1292		goto err_out_free_res;
1293	}
1294
1295	SET_NETDEV_DEV(netdev, &pdev->dev);
1296
1297	adapter = netdev_priv(netdev);
1298	adapter->netdev  = netdev;
1299	adapter->pdev    = pdev;
1300	adapter->ahw.pci_func  = pci_func_id;
1301
1302	revision_id = pdev->revision;
1303	adapter->ahw.revision_id = revision_id;
1304
1305	rwlock_init(&adapter->ahw.crb_lock);
1306	spin_lock_init(&adapter->ahw.mem_lock);
1307
1308	spin_lock_init(&adapter->tx_clean_lock);
1309	INIT_LIST_HEAD(&adapter->mac_list);
1310
1311	err = netxen_setup_pci_map(adapter);
1312	if (err)
1313		goto err_out_free_netdev;
1314
1315	/* This will be reset for mezz cards  */
1316	adapter->portnum = pci_func_id;
1317
1318	err = netxen_nic_get_board_info(adapter);
1319	if (err) {
1320		dev_err(&pdev->dev, "Error getting board config info.\n");
1321		goto err_out_iounmap;
1322	}
1323
1324	/* Mezz cards have PCI function 0,2,3 enabled */
1325	switch (adapter->ahw.board_type) {
1326	case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
1327	case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ:
1328		if (pci_func_id >= 2)
1329			adapter->portnum = pci_func_id - 2;
1330		break;
1331	default:
1332		break;
1333	}
1334
1335	err = netxen_start_firmware(adapter);
1336	if (err)
1337		goto err_out_decr_ref;
1338
1339	/*
1340	 * See if the firmware gave us a virtual-physical port mapping.
1341	 */
1342	adapter->physical_port = adapter->portnum;
1343	if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
1344		i = NXRD32(adapter, CRB_V2P(adapter->portnum));
1345		if (i != 0x55555555)
1346			adapter->physical_port = i;
1347	}
1348
1349	netxen_nic_clear_stats(adapter);
1350
1351	netxen_setup_intr(adapter);
1352
1353	err = netxen_setup_netdev(adapter, netdev);
1354	if (err)
1355		goto err_out_disable_msi;
1356
1357	pci_set_drvdata(pdev, adapter);
1358
1359	netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY);
1360
1361	switch (adapter->ahw.port_type) {
1362	case NETXEN_NIC_GBE:
1363		dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n",
1364				adapter->netdev->name);
1365		break;
1366	case NETXEN_NIC_XGBE:
1367		dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n",
1368				adapter->netdev->name);
1369		break;
1370	}
1371
1372	netxen_create_diag_entries(adapter);
1373
1374	return 0;
1375
1376err_out_disable_msi:
1377	netxen_teardown_intr(adapter);
1378
1379	netxen_free_dummy_dma(adapter);
1380
1381err_out_decr_ref:
1382	nx_decr_dev_ref_cnt(adapter);
1383
1384err_out_iounmap:
1385	netxen_cleanup_pci_map(adapter);
1386
1387err_out_free_netdev:
1388	free_netdev(netdev);
1389
1390err_out_free_res:
1391	pci_release_regions(pdev);
1392
1393err_out_disable_pdev:
1394	pci_set_drvdata(pdev, NULL);
1395	pci_disable_device(pdev);
1396	return err;
1397}
1398
1399static void __devexit netxen_nic_remove(struct pci_dev *pdev)
1400{
1401	struct netxen_adapter *adapter;
1402	struct net_device *netdev;
1403
1404	adapter = pci_get_drvdata(pdev);
1405	if (adapter == NULL)
1406		return;
1407
1408	netdev = adapter->netdev;
1409
1410	netxen_cancel_fw_work(adapter);
1411
1412	unregister_netdev(netdev);
1413
1414	cancel_work_sync(&adapter->tx_timeout_task);
1415
1416	netxen_nic_detach(adapter);
1417
1418	nx_decr_dev_ref_cnt(adapter);
1419
1420	if (adapter->portnum == 0)
1421		netxen_free_dummy_dma(adapter);
1422
1423	clear_bit(__NX_RESETTING, &adapter->state);
1424
1425	netxen_teardown_intr(adapter);
1426
1427	netxen_remove_diag_entries(adapter);
1428
1429	netxen_cleanup_pci_map(adapter);
1430
1431	netxen_release_firmware(adapter);
1432
1433	if (NX_IS_REVISION_P3(pdev->revision))
1434		pci_disable_pcie_error_reporting(pdev);
1435
1436	pci_release_regions(pdev);
1437	pci_disable_device(pdev);
1438	pci_set_drvdata(pdev, NULL);
1439
1440	free_netdev(netdev);
1441}
1442
1443static void netxen_nic_detach_func(struct netxen_adapter *adapter)
1444{
1445	struct net_device *netdev = adapter->netdev;
1446
1447	netif_device_detach(netdev);
1448
1449	netxen_cancel_fw_work(adapter);
1450
1451	if (netif_running(netdev))
1452		netxen_nic_down(adapter, netdev);
1453
1454	cancel_work_sync(&adapter->tx_timeout_task);
1455
1456	netxen_nic_detach(adapter);
1457
1458	if (adapter->portnum == 0)
1459		netxen_free_dummy_dma(adapter);
1460
1461	nx_decr_dev_ref_cnt(adapter);
1462
1463	clear_bit(__NX_RESETTING, &adapter->state);
1464}
1465
1466static int netxen_nic_attach_func(struct pci_dev *pdev)
1467{
1468	struct netxen_adapter *adapter = pci_get_drvdata(pdev);
1469	struct net_device *netdev = adapter->netdev;
1470	int err;
1471
1472	err = pci_enable_device(pdev);
1473	if (err)
1474		return err;
1475
1476	pci_set_power_state(pdev, PCI_D0);
1477	pci_set_master(pdev);
1478	pci_restore_state(pdev);
1479
1480	adapter->ahw.crb_win = -1;
1481	adapter->ahw.ocm_win = -1;
1482
1483	err = netxen_start_firmware(adapter);
1484	if (err) {
1485		dev_err(&pdev->dev, "failed to start firmware\n");
1486		return err;
1487	}
1488
1489	if (netif_running(netdev)) {
1490		err = netxen_nic_attach(adapter);
1491		if (err)
1492			goto err_out;
1493
1494		err = netxen_nic_up(adapter, netdev);
1495		if (err)
1496			goto err_out_detach;
1497
1498		netxen_config_indev_addr(netdev, NETDEV_UP);
1499	}
1500
1501	netif_device_attach(netdev);
1502	netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY);
1503	return 0;
1504
1505err_out_detach:
1506	netxen_nic_detach(adapter);
1507err_out:
1508	nx_decr_dev_ref_cnt(adapter);
1509	return err;
1510}
1511
1512static pci_ers_result_t netxen_io_error_detected(struct pci_dev *pdev,
1513						pci_channel_state_t state)
1514{
1515	struct netxen_adapter *adapter = pci_get_drvdata(pdev);
1516
1517	if (state == pci_channel_io_perm_failure)
1518		return PCI_ERS_RESULT_DISCONNECT;
1519
1520	if (nx_dev_request_aer(adapter))
1521		return PCI_ERS_RESULT_RECOVERED;
1522
1523	netxen_nic_detach_func(adapter);
1524
1525	pci_disable_device(pdev);
1526
1527	return PCI_ERS_RESULT_NEED_RESET;
1528}
1529
1530static pci_ers_result_t netxen_io_slot_reset(struct pci_dev *pdev)
1531{
1532	int err = 0;
1533
1534	err = netxen_nic_attach_func(pdev);
1535
1536	return err ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED;
1537}
1538
1539static void netxen_io_resume(struct pci_dev *pdev)
1540{
1541	pci_cleanup_aer_uncorrect_error_status(pdev);
1542}
1543
1544static void netxen_nic_shutdown(struct pci_dev *pdev)
1545{
1546	struct netxen_adapter *adapter = pci_get_drvdata(pdev);
1547
1548	netxen_nic_detach_func(adapter);
1549
1550	if (pci_save_state(pdev))
1551		return;
1552
1553	if (netxen_nic_wol_supported(adapter)) {
1554		pci_enable_wake(pdev, PCI_D3cold, 1);
1555		pci_enable_wake(pdev, PCI_D3hot, 1);
1556	}
1557
1558	pci_disable_device(pdev);
1559}
1560
1561#ifdef CONFIG_PM
1562static int
1563netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state)
1564{
1565	struct netxen_adapter *adapter = pci_get_drvdata(pdev);
1566	int retval;
1567
1568	netxen_nic_detach_func(adapter);
1569
1570	retval = pci_save_state(pdev);
1571	if (retval)
1572		return retval;
1573
1574	if (netxen_nic_wol_supported(adapter)) {
1575		pci_enable_wake(pdev, PCI_D3cold, 1);
1576		pci_enable_wake(pdev, PCI_D3hot, 1);
1577	}
1578
1579	pci_disable_device(pdev);
1580	pci_set_power_state(pdev, pci_choose_state(pdev, state));
1581
1582	return 0;
1583}
1584
1585static int
1586netxen_nic_resume(struct pci_dev *pdev)
1587{
1588	return netxen_nic_attach_func(pdev);
1589}
1590#endif
1591
1592static int netxen_nic_open(struct net_device *netdev)
1593{
1594	struct netxen_adapter *adapter = netdev_priv(netdev);
1595	int err = 0;
1596
1597	if (adapter->driver_mismatch)
1598		return -EIO;
1599
1600	err = netxen_nic_attach(adapter);
1601	if (err)
1602		return err;
1603
1604	err = __netxen_nic_up(adapter, netdev);
1605	if (err)
1606		goto err_out;
1607
1608	netif_start_queue(netdev);
1609
1610	return 0;
1611
1612err_out:
1613	netxen_nic_detach(adapter);
1614	return err;
1615}
1616
1617/*
1618 * netxen_nic_close - Disables a network interface entry point
1619 */
1620static int netxen_nic_close(struct net_device *netdev)
1621{
1622	struct netxen_adapter *adapter = netdev_priv(netdev);
1623
1624	__netxen_nic_down(adapter, netdev);
1625	return 0;
1626}
1627
1628static void
1629netxen_tso_check(struct net_device *netdev,
1630		struct nx_host_tx_ring *tx_ring,
1631		struct cmd_desc_type0 *first_desc,
1632		struct sk_buff *skb)
1633{
1634	u8 opcode = TX_ETHER_PKT;
1635	__be16 protocol = skb->protocol;
1636	u16 flags = 0, vid = 0;
1637	u32 producer;
1638	int copied, offset, copy_len, hdr_len = 0, tso = 0, vlan_oob = 0;
1639	struct cmd_desc_type0 *hwdesc;
1640	struct vlan_ethhdr *vh;
1641
1642	if (protocol == cpu_to_be16(ETH_P_8021Q)) {
1643
1644		vh = (struct vlan_ethhdr *)skb->data;
1645		protocol = vh->h_vlan_encapsulated_proto;
1646		flags = FLAGS_VLAN_TAGGED;
1647
1648	} else if (vlan_tx_tag_present(skb)) {
1649
1650		flags = FLAGS_VLAN_OOB;
1651		vid = vlan_tx_tag_get(skb);
1652		netxen_set_tx_vlan_tci(first_desc, vid);
1653		vlan_oob = 1;
1654	}
1655
1656	if ((netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) &&
1657			skb_shinfo(skb)->gso_size > 0) {
1658
1659		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
1660
1661		first_desc->mss = cpu_to_le16(skb_shinfo(skb)->gso_size);
1662		first_desc->total_hdr_length = hdr_len;
1663		if (vlan_oob) {
1664			first_desc->total_hdr_length += VLAN_HLEN;
1665			first_desc->tcp_hdr_offset = VLAN_HLEN;
1666			first_desc->ip_hdr_offset = VLAN_HLEN;
1667			/* Only in case of TSO on vlan device */
1668			flags |= FLAGS_VLAN_TAGGED;
1669		}
1670
1671		opcode = (protocol == cpu_to_be16(ETH_P_IPV6)) ?
1672				TX_TCP_LSO6 : TX_TCP_LSO;
1673		tso = 1;
1674
1675	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
1676		u8 l4proto;
1677
1678		if (protocol == cpu_to_be16(ETH_P_IP)) {
1679			l4proto = ip_hdr(skb)->protocol;
1680
1681			if (l4proto == IPPROTO_TCP)
1682				opcode = TX_TCP_PKT;
1683			else if(l4proto == IPPROTO_UDP)
1684				opcode = TX_UDP_PKT;
1685		} else if (protocol == cpu_to_be16(ETH_P_IPV6)) {
1686			l4proto = ipv6_hdr(skb)->nexthdr;
1687
1688			if (l4proto == IPPROTO_TCP)
1689				opcode = TX_TCPV6_PKT;
1690			else if(l4proto == IPPROTO_UDP)
1691				opcode = TX_UDPV6_PKT;
1692		}
1693	}
1694
1695	first_desc->tcp_hdr_offset += skb_transport_offset(skb);
1696	first_desc->ip_hdr_offset += skb_network_offset(skb);
1697	netxen_set_tx_flags_opcode(first_desc, flags, opcode);
1698
1699	if (!tso)
1700		return;
1701
1702	/* For LSO, we need to copy the MAC/IP/TCP headers into
1703	 * the descriptor ring
1704	 */
1705	producer = tx_ring->producer;
1706	copied = 0;
1707	offset = 2;
1708
1709	if (vlan_oob) {
1710		/* Create a TSO vlan header template for firmware */
1711
1712		hwdesc = &tx_ring->desc_head[producer];
1713		tx_ring->cmd_buf_arr[producer].skb = NULL;
1714
1715		copy_len = min((int)sizeof(struct cmd_desc_type0) - offset,
1716				hdr_len + VLAN_HLEN);
1717
1718		vh = (struct vlan_ethhdr *)((char *)hwdesc + 2);
1719		skb_copy_from_linear_data(skb, vh, 12);
1720		vh->h_vlan_proto = htons(ETH_P_8021Q);
1721		vh->h_vlan_TCI = htons(vid);
1722		skb_copy_from_linear_data_offset(skb, 12,
1723				(char *)vh + 16, copy_len - 16);
1724
1725		copied = copy_len - VLAN_HLEN;
1726		offset = 0;
1727
1728		producer = get_next_index(producer, tx_ring->num_desc);
1729	}
1730
1731	while (copied < hdr_len) {
1732
1733		copy_len = min((int)sizeof(struct cmd_desc_type0) - offset,
1734				(hdr_len - copied));
1735
1736		hwdesc = &tx_ring->desc_head[producer];
1737		tx_ring->cmd_buf_arr[producer].skb = NULL;
1738
1739		skb_copy_from_linear_data_offset(skb, copied,
1740				 (char *)hwdesc + offset, copy_len);
1741
1742		copied += copy_len;
1743		offset = 0;
1744
1745		producer = get_next_index(producer, tx_ring->num_desc);
1746	}
1747
1748	tx_ring->producer = producer;
1749	barrier();
1750}
1751
1752static int
1753netxen_map_tx_skb(struct pci_dev *pdev,
1754		struct sk_buff *skb, struct netxen_cmd_buffer *pbuf)
1755{
1756	struct netxen_skb_frag *nf;
1757	struct skb_frag_struct *frag;
1758	int i, nr_frags;
1759	dma_addr_t map;
1760
1761	nr_frags = skb_shinfo(skb)->nr_frags;
1762	nf = &pbuf->frag_array[0];
1763
1764	map = pci_map_single(pdev, skb->data,
1765			skb_headlen(skb), PCI_DMA_TODEVICE);
1766	if (pci_dma_mapping_error(pdev, map))
1767		goto out_err;
1768
1769	nf->dma = map;
1770	nf->length = skb_headlen(skb);
1771
1772	for (i = 0; i < nr_frags; i++) {
1773		frag = &skb_shinfo(skb)->frags[i];
1774		nf = &pbuf->frag_array[i+1];
1775
1776		map = pci_map_page(pdev, frag->page, frag->page_offset,
1777				frag->size, PCI_DMA_TODEVICE);
1778		if (pci_dma_mapping_error(pdev, map))
1779			goto unwind;
1780
1781		nf->dma = map;
1782		nf->length = frag->size;
1783	}
1784
1785	return 0;
1786
1787unwind:
1788	while (--i >= 0) {
1789		nf = &pbuf->frag_array[i+1];
1790		pci_unmap_page(pdev, nf->dma, nf->length, PCI_DMA_TODEVICE);
1791	}
1792
1793	nf = &pbuf->frag_array[0];
1794	pci_unmap_single(pdev, nf->dma, skb_headlen(skb), PCI_DMA_TODEVICE);
1795
1796out_err:
1797	return -ENOMEM;
1798}
1799
1800static inline void
1801netxen_clear_cmddesc(u64 *desc)
1802{
1803	desc[0] = 0ULL;
1804	desc[2] = 0ULL;
1805}
1806
1807static netdev_tx_t
1808netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
1809{
1810	struct netxen_adapter *adapter = netdev_priv(netdev);
1811	struct nx_host_tx_ring *tx_ring = adapter->tx_ring;
1812	struct netxen_cmd_buffer *pbuf;
1813	struct netxen_skb_frag *buffrag;
1814	struct cmd_desc_type0 *hwdesc, *first_desc;
1815	struct pci_dev *pdev;
1816	int i, k;
1817
1818	u32 producer;
1819	int frag_count, no_of_desc;
1820	u32 num_txd = tx_ring->num_desc;
1821
1822	frag_count = skb_shinfo(skb)->nr_frags + 1;
1823
1824	/* 4 fragments per cmd des */
1825	no_of_desc = (frag_count + 3) >> 2;
1826
1827	if (unlikely(no_of_desc + 2 > netxen_tx_avail(tx_ring))) {
1828		netif_stop_queue(netdev);
1829		return NETDEV_TX_BUSY;
1830	}
1831
1832	producer = tx_ring->producer;
1833	pbuf = &tx_ring->cmd_buf_arr[producer];
1834
1835	pdev = adapter->pdev;
1836
1837	if (netxen_map_tx_skb(pdev, skb, pbuf))
1838		goto drop_packet;
1839
1840	pbuf->skb = skb;
1841	pbuf->frag_count = frag_count;
1842
1843	first_desc = hwdesc = &tx_ring->desc_head[producer];
1844	netxen_clear_cmddesc((u64 *)hwdesc);
1845
1846	netxen_set_tx_frags_len(first_desc, frag_count, skb->len);
1847	netxen_set_tx_port(first_desc, adapter->portnum);
1848
1849	for (i = 0; i < frag_count; i++) {
1850
1851		k = i % 4;
1852
1853		if ((k == 0) && (i > 0)) {
1854			/* move to next desc.*/
1855			producer = get_next_index(producer, num_txd);
1856			hwdesc = &tx_ring->desc_head[producer];
1857			netxen_clear_cmddesc((u64 *)hwdesc);
1858			tx_ring->cmd_buf_arr[producer].skb = NULL;
1859		}
1860
1861		buffrag = &pbuf->frag_array[i];
1862
1863		hwdesc->buffer_length[k] = cpu_to_le16(buffrag->length);
1864		switch (k) {
1865		case 0:
1866			hwdesc->addr_buffer1 = cpu_to_le64(buffrag->dma);
1867			break;
1868		case 1:
1869			hwdesc->addr_buffer2 = cpu_to_le64(buffrag->dma);
1870			break;
1871		case 2:
1872			hwdesc->addr_buffer3 = cpu_to_le64(buffrag->dma);
1873			break;
1874		case 3:
1875			hwdesc->addr_buffer4 = cpu_to_le64(buffrag->dma);
1876			break;
1877		}
1878	}
1879
1880	tx_ring->producer = get_next_index(producer, num_txd);
1881
1882	netxen_tso_check(netdev, tx_ring, first_desc, skb);
1883
1884	netxen_nic_update_cmd_producer(adapter, tx_ring);
1885
1886	adapter->stats.txbytes += skb->len;
1887	adapter->stats.xmitcalled++;
1888
1889	return NETDEV_TX_OK;
1890
1891drop_packet:
1892	adapter->stats.txdropped++;
1893	dev_kfree_skb_any(skb);
1894	return NETDEV_TX_OK;
1895}
1896
1897static int netxen_nic_check_temp(struct netxen_adapter *adapter)
1898{
1899	struct net_device *netdev = adapter->netdev;
1900	uint32_t temp, temp_state, temp_val;
1901	int rv = 0;
1902
1903	temp = NXRD32(adapter, CRB_TEMP_STATE);
1904
1905	temp_state = nx_get_temp_state(temp);
1906	temp_val = nx_get_temp_val(temp);
1907
1908	if (temp_state == NX_TEMP_PANIC) {
1909		printk(KERN_ALERT
1910		       "%s: Device temperature %d degrees C exceeds"
1911		       " maximum allowed. Hardware has been shut down.\n",
1912		       netdev->name, temp_val);
1913		rv = 1;
1914	} else if (temp_state == NX_TEMP_WARN) {
1915		if (adapter->temp == NX_TEMP_NORMAL) {
1916			printk(KERN_ALERT
1917			       "%s: Device temperature %d degrees C "
1918			       "exceeds operating range."
1919			       " Immediate action needed.\n",
1920			       netdev->name, temp_val);
1921		}
1922	} else {
1923		if (adapter->temp == NX_TEMP_WARN) {
1924			printk(KERN_INFO
1925			       "%s: Device temperature is now %d degrees C"
1926			       " in normal range.\n", netdev->name,
1927			       temp_val);
1928		}
1929	}
1930	adapter->temp = temp_state;
1931	return rv;
1932}
1933
1934void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup)
1935{
1936	struct net_device *netdev = adapter->netdev;
1937
1938	if (adapter->ahw.linkup && !linkup) {
1939		printk(KERN_INFO "%s: %s NIC Link is down\n",
1940		       netxen_nic_driver_name, netdev->name);
1941		adapter->ahw.linkup = 0;
1942		if (netif_running(netdev)) {
1943			netif_carrier_off(netdev);
1944			netif_stop_queue(netdev);
1945		}
1946		adapter->link_changed = !adapter->has_link_events;
1947	} else if (!adapter->ahw.linkup && linkup) {
1948		printk(KERN_INFO "%s: %s NIC Link is up\n",
1949		       netxen_nic_driver_name, netdev->name);
1950		adapter->ahw.linkup = 1;
1951		if (netif_running(netdev)) {
1952			netif_carrier_on(netdev);
1953			netif_wake_queue(netdev);
1954		}
1955		adapter->link_changed = !adapter->has_link_events;
1956	}
1957}
1958
1959static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
1960{
1961	u32 val, port, linkup;
1962
1963	port = adapter->physical_port;
1964
1965	if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
1966		val = NXRD32(adapter, CRB_XG_STATE_P3);
1967		val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val);
1968		linkup = (val == XG_LINK_UP_P3);
1969	} else {
1970		val = NXRD32(adapter, CRB_XG_STATE);
1971		val = (val >> port*8) & 0xff;
1972		linkup = (val == XG_LINK_UP);
1973	}
1974
1975	netxen_advert_link_change(adapter, linkup);
1976}
1977
1978static void netxen_tx_timeout(struct net_device *netdev)
1979{
1980	struct netxen_adapter *adapter = netdev_priv(netdev);
1981
1982	if (test_bit(__NX_RESETTING, &adapter->state))
1983		return;
1984
1985	dev_err(&netdev->dev, "transmit timeout, resetting.\n");
1986	schedule_work(&adapter->tx_timeout_task);
1987}
1988
1989static void netxen_tx_timeout_task(struct work_struct *work)
1990{
1991	struct netxen_adapter *adapter =
1992		container_of(work, struct netxen_adapter, tx_timeout_task);
1993
1994	if (!netif_running(adapter->netdev))
1995		return;
1996
1997	if (test_and_set_bit(__NX_RESETTING, &adapter->state))
1998		return;
1999
2000	if (++adapter->tx_timeo_cnt >= NX_MAX_TX_TIMEOUTS)
2001		goto request_reset;
2002
2003	rtnl_lock();
2004	if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
2005		/* try to scrub interrupt */
2006		netxen_napi_disable(adapter);
2007
2008		netxen_napi_enable(adapter);
2009
2010		netif_wake_queue(adapter->netdev);
2011
2012		clear_bit(__NX_RESETTING, &adapter->state);
2013	} else {
2014		clear_bit(__NX_RESETTING, &adapter->state);
2015		if (netxen_nic_reset_context(adapter)) {
2016			rtnl_unlock();
2017			goto request_reset;
2018		}
2019	}
2020	adapter->netdev->trans_start = jiffies;
2021	rtnl_unlock();
2022	return;
2023
2024request_reset:
2025	adapter->need_fw_reset = 1;
2026	clear_bit(__NX_RESETTING, &adapter->state);
2027}
2028
2029struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev)
2030{
2031	struct netxen_adapter *adapter = netdev_priv(netdev);
2032	struct net_device_stats *stats = &netdev->stats;
2033
2034	stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts;
2035	stats->tx_packets = adapter->stats.xmitfinished;
2036	stats->rx_bytes = adapter->stats.rxbytes;
2037	stats->tx_bytes = adapter->stats.txbytes;
2038	stats->rx_dropped = adapter->stats.rxdropped;
2039	stats->tx_dropped = adapter->stats.txdropped;
2040
2041	return stats;
2042}
2043
2044static irqreturn_t netxen_intr(int irq, void *data)
2045{
2046	struct nx_host_sds_ring *sds_ring = data;
2047	struct netxen_adapter *adapter = sds_ring->adapter;
2048	u32 status = 0;
2049
2050	status = readl(adapter->isr_int_vec);
2051
2052	if (!(status & adapter->int_vec_bit))
2053		return IRQ_NONE;
2054
2055	if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
2056		/* check interrupt state machine, to be sure */
2057		status = readl(adapter->crb_int_state_reg);
2058		if (!ISR_LEGACY_INT_TRIGGERED(status))
2059			return IRQ_NONE;
2060
2061	} else {
2062		unsigned long our_int = 0;
2063
2064		our_int = readl(adapter->crb_int_state_reg);
2065
2066		/* not our interrupt */
2067		if (!test_and_clear_bit((7 + adapter->portnum), &our_int))
2068			return IRQ_NONE;
2069
2070		/* claim interrupt */
2071		writel((our_int & 0xffffffff), adapter->crb_int_state_reg);
2072
2073		/* clear interrupt */
2074		netxen_nic_disable_int(sds_ring);
2075	}
2076
2077	writel(0xffffffff, adapter->tgt_status_reg);
2078	/* read twice to ensure write is flushed */
2079	readl(adapter->isr_int_vec);
2080	readl(adapter->isr_int_vec);
2081
2082	napi_schedule(&sds_ring->napi);
2083
2084	return IRQ_HANDLED;
2085}
2086
2087static irqreturn_t netxen_msi_intr(int irq, void *data)
2088{
2089	struct nx_host_sds_ring *sds_ring = data;
2090	struct netxen_adapter *adapter = sds_ring->adapter;
2091
2092	/* clear interrupt */
2093	writel(0xffffffff, adapter->tgt_status_reg);
2094
2095	napi_schedule(&sds_ring->napi);
2096	return IRQ_HANDLED;
2097}
2098
2099static irqreturn_t netxen_msix_intr(int irq, void *data)
2100{
2101	struct nx_host_sds_ring *sds_ring = data;
2102
2103	napi_schedule(&sds_ring->napi);
2104	return IRQ_HANDLED;
2105}
2106
2107static int netxen_nic_poll(struct napi_struct *napi, int budget)
2108{
2109	struct nx_host_sds_ring *sds_ring =
2110		container_of(napi, struct nx_host_sds_ring, napi);
2111
2112	struct netxen_adapter *adapter = sds_ring->adapter;
2113
2114	int tx_complete;
2115	int work_done;
2116
2117	tx_complete = netxen_process_cmd_ring(adapter);
2118
2119	work_done = netxen_process_rcv_ring(sds_ring, budget);
2120
2121	if ((work_done < budget) && tx_complete) {
2122		napi_complete(&sds_ring->napi);
2123		if (test_bit(__NX_DEV_UP, &adapter->state))
2124			netxen_nic_enable_int(sds_ring);
2125	}
2126
2127	return work_done;
2128}
2129
2130#ifdef CONFIG_NET_POLL_CONTROLLER
2131static void netxen_nic_poll_controller(struct net_device *netdev)
2132{
2133	int ring;
2134	struct nx_host_sds_ring *sds_ring;
2135	struct netxen_adapter *adapter = netdev_priv(netdev);
2136	struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
2137
2138	disable_irq(adapter->irq);
2139	for (ring = 0; ring < adapter->max_sds_rings; ring++) {
2140		sds_ring = &recv_ctx->sds_rings[ring];
2141		netxen_intr(adapter->irq, sds_ring);
2142	}
2143	enable_irq(adapter->irq);
2144}
2145#endif
2146
2147static int
2148nx_incr_dev_ref_cnt(struct netxen_adapter *adapter)
2149{
2150	int count;
2151	if (netxen_api_lock(adapter))
2152		return -EIO;
2153
2154	count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
2155
2156	NXWR32(adapter, NX_CRB_DEV_REF_COUNT, ++count);
2157
2158	netxen_api_unlock(adapter);
2159	return count;
2160}
2161
2162static int
2163nx_decr_dev_ref_cnt(struct netxen_adapter *adapter)
2164{
2165	int count;
2166	if (netxen_api_lock(adapter))
2167		return -EIO;
2168
2169	count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
2170	WARN_ON(count == 0);
2171
2172	NXWR32(adapter, NX_CRB_DEV_REF_COUNT, --count);
2173
2174	if (count == 0)
2175		NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_COLD);
2176
2177	netxen_api_unlock(adapter);
2178	return count;
2179}
2180
2181static int
2182nx_dev_request_aer(struct netxen_adapter *adapter)
2183{
2184	u32 state;
2185	int ret = -EINVAL;
2186
2187	if (netxen_api_lock(adapter))
2188		return ret;
2189
2190	state = NXRD32(adapter, NX_CRB_DEV_STATE);
2191
2192	if (state == NX_DEV_NEED_AER)
2193		ret = 0;
2194	else if (state == NX_DEV_READY) {
2195		NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_NEED_AER);
2196		ret = 0;
2197	}
2198
2199	netxen_api_unlock(adapter);
2200	return ret;
2201}
2202
2203static int
2204nx_dev_request_reset(struct netxen_adapter *adapter)
2205{
2206	u32 state;
2207	int ret = -EINVAL;
2208
2209	if (netxen_api_lock(adapter))
2210		return ret;
2211
2212	state = NXRD32(adapter, NX_CRB_DEV_STATE);
2213
2214	if (state == NX_DEV_NEED_RESET)
2215		ret = 0;
2216	else if (state != NX_DEV_INITALIZING && state != NX_DEV_NEED_AER) {
2217		NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_NEED_RESET);
2218		ret = 0;
2219	}
2220
2221	netxen_api_unlock(adapter);
2222
2223	return ret;
2224}
2225
2226static int
2227netxen_can_start_firmware(struct netxen_adapter *adapter)
2228{
2229	int count;
2230	int can_start = 0;
2231
2232	if (netxen_api_lock(adapter))
2233		return 0;
2234
2235	count = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
2236
2237	if ((count < 0) || (count >= NX_MAX_PCI_FUNC))
2238		count = 0;
2239
2240	if (count == 0) {
2241		can_start = 1;
2242		NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_INITALIZING);
2243	}
2244
2245	NXWR32(adapter, NX_CRB_DEV_REF_COUNT, ++count);
2246
2247	netxen_api_unlock(adapter);
2248
2249	return can_start;
2250}
2251
2252static void
2253netxen_schedule_work(struct netxen_adapter *adapter,
2254		work_func_t func, int delay)
2255{
2256	INIT_DELAYED_WORK(&adapter->fw_work, func);
2257	schedule_delayed_work(&adapter->fw_work, delay);
2258}
2259
2260static void
2261netxen_cancel_fw_work(struct netxen_adapter *adapter)
2262{
2263	while (test_and_set_bit(__NX_RESETTING, &adapter->state))
2264		msleep(10);
2265
2266	cancel_delayed_work_sync(&adapter->fw_work);
2267}
2268
2269static void
2270netxen_attach_work(struct work_struct *work)
2271{
2272	struct netxen_adapter *adapter = container_of(work,
2273				struct netxen_adapter, fw_work.work);
2274	struct net_device *netdev = adapter->netdev;
2275	int err = 0;
2276
2277	if (netif_running(netdev)) {
2278		err = netxen_nic_attach(adapter);
2279		if (err)
2280			goto done;
2281
2282		err = netxen_nic_up(adapter, netdev);
2283		if (err) {
2284			netxen_nic_detach(adapter);
2285			goto done;
2286		}
2287
2288		netxen_config_indev_addr(netdev, NETDEV_UP);
2289	}
2290
2291	netif_device_attach(netdev);
2292
2293done:
2294	adapter->fw_fail_cnt = 0;
2295	clear_bit(__NX_RESETTING, &adapter->state);
2296	netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY);
2297}
2298
2299static void
2300netxen_fwinit_work(struct work_struct *work)
2301{
2302	struct netxen_adapter *adapter = container_of(work,
2303				struct netxen_adapter, fw_work.work);
2304	int dev_state;
2305
2306	dev_state = NXRD32(adapter, NX_CRB_DEV_STATE);
2307
2308	switch (dev_state) {
2309	case NX_DEV_COLD:
2310	case NX_DEV_READY:
2311		if (!netxen_start_firmware(adapter)) {
2312			netxen_schedule_work(adapter, netxen_attach_work, 0);
2313			return;
2314		}
2315		break;
2316
2317	case NX_DEV_NEED_RESET:
2318	case NX_DEV_INITALIZING:
2319		if (++adapter->fw_wait_cnt < FW_POLL_THRESH) {
2320			netxen_schedule_work(adapter,
2321					netxen_fwinit_work, 2 * FW_POLL_DELAY);
2322			return;
2323		}
2324
2325	case NX_DEV_FAILED:
2326	default:
2327		nx_incr_dev_ref_cnt(adapter);
2328		break;
2329	}
2330
2331	clear_bit(__NX_RESETTING, &adapter->state);
2332}
2333
2334static void
2335netxen_detach_work(struct work_struct *work)
2336{
2337	struct netxen_adapter *adapter = container_of(work,
2338				struct netxen_adapter, fw_work.work);
2339	struct net_device *netdev = adapter->netdev;
2340	int ref_cnt, delay;
2341	u32 status;
2342
2343	netif_device_detach(netdev);
2344
2345	netxen_nic_down(adapter, netdev);
2346
2347	rtnl_lock();
2348	netxen_nic_detach(adapter);
2349	rtnl_unlock();
2350
2351	status = NXRD32(adapter, NETXEN_PEG_HALT_STATUS1);
2352
2353	if (status & NX_RCODE_FATAL_ERROR)
2354		goto err_ret;
2355
2356	if (adapter->temp == NX_TEMP_PANIC)
2357		goto err_ret;
2358
2359	ref_cnt = nx_decr_dev_ref_cnt(adapter);
2360
2361	if (ref_cnt == -EIO)
2362		goto err_ret;
2363
2364	delay = (ref_cnt == 0) ? 0 : (2 * FW_POLL_DELAY);
2365
2366	adapter->fw_wait_cnt = 0;
2367	netxen_schedule_work(adapter, netxen_fwinit_work, delay);
2368
2369	return;
2370
2371err_ret:
2372	clear_bit(__NX_RESETTING, &adapter->state);
2373}
2374
2375static int
2376netxen_check_health(struct netxen_adapter *adapter)
2377{
2378	u32 state, heartbit;
2379	struct net_device *netdev = adapter->netdev;
2380
2381	state = NXRD32(adapter, NX_CRB_DEV_STATE);
2382	if (state == NX_DEV_NEED_AER)
2383		return 0;
2384
2385	if (netxen_nic_check_temp(adapter))
2386		goto detach;
2387
2388	if (adapter->need_fw_reset) {
2389		if (nx_dev_request_reset(adapter))
2390			return 0;
2391		goto detach;
2392	}
2393
2394	/* NX_DEV_NEED_RESET, this state can be marked in two cases
2395	 * 1. Tx timeout 2. Fw hang
2396	 * Send request to destroy context in case of tx timeout only
2397	 * and doesn't required in case of Fw hang
2398	 */
2399	if (state == NX_DEV_NEED_RESET) {
2400		adapter->need_fw_reset = 1;
2401		if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
2402			goto detach;
2403	}
2404
2405	if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
2406		return 0;
2407
2408	heartbit = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER);
2409	if (heartbit != adapter->heartbit) {
2410		adapter->heartbit = heartbit;
2411		adapter->fw_fail_cnt = 0;
2412		if (adapter->need_fw_reset)
2413			goto detach;
2414		return 0;
2415	}
2416
2417	if (++adapter->fw_fail_cnt < FW_FAIL_THRESH)
2418		return 0;
2419
2420	if (nx_dev_request_reset(adapter))
2421		return 0;
2422
2423	clear_bit(__NX_FW_ATTACHED, &adapter->state);
2424
2425	dev_info(&netdev->dev, "firmware hang detected\n");
2426
2427detach:
2428	if ((auto_fw_reset == AUTO_FW_RESET_ENABLED) &&
2429			!test_and_set_bit(__NX_RESETTING, &adapter->state))
2430		netxen_schedule_work(adapter, netxen_detach_work, 0);
2431	return 1;
2432}
2433
2434static void
2435netxen_fw_poll_work(struct work_struct *work)
2436{
2437	struct netxen_adapter *adapter = container_of(work,
2438				struct netxen_adapter, fw_work.work);
2439
2440	if (test_bit(__NX_RESETTING, &adapter->state))
2441		goto reschedule;
2442
2443	if (test_bit(__NX_DEV_UP, &adapter->state)) {
2444		if (!adapter->has_link_events) {
2445
2446			netxen_nic_handle_phy_intr(adapter);
2447
2448			if (adapter->link_changed)
2449				netxen_nic_set_link_parameters(adapter);
2450		}
2451	}
2452
2453	if (netxen_check_health(adapter))
2454		return;
2455
2456reschedule:
2457	netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY);
2458}
2459
2460static ssize_t
2461netxen_store_bridged_mode(struct device *dev,
2462		struct device_attribute *attr, const char *buf, size_t len)
2463{
2464	struct net_device *net = to_net_dev(dev);
2465	struct netxen_adapter *adapter = netdev_priv(net);
2466	unsigned long new;
2467	int ret = -EINVAL;
2468
2469	if (!(adapter->capabilities & NX_FW_CAPABILITY_BDG))
2470		goto err_out;
2471
2472	if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
2473		goto err_out;
2474
2475	if (strict_strtoul(buf, 2, &new))
2476		goto err_out;
2477
2478	if (!netxen_config_bridged_mode(adapter, !!new))
2479		ret = len;
2480
2481err_out:
2482	return ret;
2483}
2484
2485static ssize_t
2486netxen_show_bridged_mode(struct device *dev,
2487		struct device_attribute *attr, char *buf)
2488{
2489	struct net_device *net = to_net_dev(dev);
2490	struct netxen_adapter *adapter;
2491	int bridged_mode = 0;
2492
2493	adapter = netdev_priv(net);
2494
2495	if (adapter->capabilities & NX_FW_CAPABILITY_BDG)
2496		bridged_mode = !!(adapter->flags & NETXEN_NIC_BRIDGE_ENABLED);
2497
2498	return sprintf(buf, "%d\n", bridged_mode);
2499}
2500
2501static struct device_attribute dev_attr_bridged_mode = {
2502       .attr = {.name = "bridged_mode", .mode = (S_IRUGO | S_IWUSR)},
2503       .show = netxen_show_bridged_mode,
2504       .store = netxen_store_bridged_mode,
2505};
2506
2507static ssize_t
2508netxen_store_diag_mode(struct device *dev,
2509		struct device_attribute *attr, const char *buf, size_t len)
2510{
2511	struct netxen_adapter *adapter = dev_get_drvdata(dev);
2512	unsigned long new;
2513
2514	if (strict_strtoul(buf, 2, &new))
2515		return -EINVAL;
2516
2517	if (!!new != !!(adapter->flags & NETXEN_NIC_DIAG_ENABLED))
2518		adapter->flags ^= NETXEN_NIC_DIAG_ENABLED;
2519
2520	return len;
2521}
2522
2523static ssize_t
2524netxen_show_diag_mode(struct device *dev,
2525		struct device_attribute *attr, char *buf)
2526{
2527	struct netxen_adapter *adapter = dev_get_drvdata(dev);
2528
2529	return sprintf(buf, "%d\n",
2530			!!(adapter->flags & NETXEN_NIC_DIAG_ENABLED));
2531}
2532
2533static struct device_attribute dev_attr_diag_mode = {
2534	.attr = {.name = "diag_mode", .mode = (S_IRUGO | S_IWUSR)},
2535	.show = netxen_show_diag_mode,
2536	.store = netxen_store_diag_mode,
2537};
2538
2539static int
2540netxen_sysfs_validate_crb(struct netxen_adapter *adapter,
2541		loff_t offset, size_t size)
2542{
2543	size_t crb_size = 4;
2544
2545	if (!(adapter->flags & NETXEN_NIC_DIAG_ENABLED))
2546		return -EIO;
2547
2548	if (offset < NETXEN_PCI_CRBSPACE) {
2549		if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
2550			return -EINVAL;
2551
2552		if (ADDR_IN_RANGE(offset, NETXEN_PCI_CAMQM,
2553						NETXEN_PCI_CAMQM_2M_END))
2554			crb_size = 8;
2555		else
2556			return -EINVAL;
2557	}
2558
2559	if ((size != crb_size) || (offset & (crb_size-1)))
2560		return  -EINVAL;
2561
2562	return 0;
2563}
2564
2565static ssize_t
2566netxen_sysfs_read_crb(struct file *filp, struct kobject *kobj,
2567		struct bin_attribute *attr,
2568		char *buf, loff_t offset, size_t size)
2569{
2570	struct device *dev = container_of(kobj, struct device, kobj);
2571	struct netxen_adapter *adapter = dev_get_drvdata(dev);
2572	u32 data;
2573	u64 qmdata;
2574	int ret;
2575
2576	ret = netxen_sysfs_validate_crb(adapter, offset, size);
2577	if (ret != 0)
2578		return ret;
2579
2580	if (NX_IS_REVISION_P3(adapter->ahw.revision_id) &&
2581		ADDR_IN_RANGE(offset, NETXEN_PCI_CAMQM,
2582					NETXEN_PCI_CAMQM_2M_END)) {
2583		netxen_pci_camqm_read_2M(adapter, offset, &qmdata);
2584		memcpy(buf, &qmdata, size);
2585	} else {
2586		data = NXRD32(adapter, offset);
2587		memcpy(buf, &data, size);
2588	}
2589
2590	return size;
2591}
2592
2593static ssize_t
2594netxen_sysfs_write_crb(struct file *filp, struct kobject *kobj,
2595		struct bin_attribute *attr,
2596		char *buf, loff_t offset, size_t size)
2597{
2598	struct device *dev = container_of(kobj, struct device, kobj);
2599	struct netxen_adapter *adapter = dev_get_drvdata(dev);
2600	u32 data;
2601	u64 qmdata;
2602	int ret;
2603
2604	ret = netxen_sysfs_validate_crb(adapter, offset, size);
2605	if (ret != 0)
2606		return ret;
2607
2608	if (NX_IS_REVISION_P3(adapter->ahw.revision_id) &&
2609		ADDR_IN_RANGE(offset, NETXEN_PCI_CAMQM,
2610					NETXEN_PCI_CAMQM_2M_END)) {
2611		memcpy(&qmdata, buf, size);
2612		netxen_pci_camqm_write_2M(adapter, offset, qmdata);
2613	} else {
2614		memcpy(&data, buf, size);
2615		NXWR32(adapter, offset, data);
2616	}
2617
2618	return size;
2619}
2620
2621static int
2622netxen_sysfs_validate_mem(struct netxen_adapter *adapter,
2623		loff_t offset, size_t size)
2624{
2625	if (!(adapter->flags & NETXEN_NIC_DIAG_ENABLED))
2626		return -EIO;
2627
2628	if ((size != 8) || (offset & 0x7))
2629		return  -EIO;
2630
2631	return 0;
2632}
2633
2634static ssize_t
2635netxen_sysfs_read_mem(struct file *filp, struct kobject *kobj,
2636		struct bin_attribute *attr,
2637		char *buf, loff_t offset, size_t size)
2638{
2639	struct device *dev = container_of(kobj, struct device, kobj);
2640	struct netxen_adapter *adapter = dev_get_drvdata(dev);
2641	u64 data;
2642	int ret;
2643
2644	ret = netxen_sysfs_validate_mem(adapter, offset, size);
2645	if (ret != 0)
2646		return ret;
2647
2648	if (adapter->pci_mem_read(adapter, offset, &data))
2649		return -EIO;
2650
2651	memcpy(buf, &data, size);
2652
2653	return size;
2654}
2655
2656static ssize_t netxen_sysfs_write_mem(struct file *filp, struct kobject *kobj,
2657		struct bin_attribute *attr, char *buf,
2658		loff_t offset, size_t size)
2659{
2660	struct device *dev = container_of(kobj, struct device, kobj);
2661	struct netxen_adapter *adapter = dev_get_drvdata(dev);
2662	u64 data;
2663	int ret;
2664
2665	ret = netxen_sysfs_validate_mem(adapter, offset, size);
2666	if (ret != 0)
2667		return ret;
2668
2669	memcpy(&data, buf, size);
2670
2671	if (adapter->pci_mem_write(adapter, offset, data))
2672		return -EIO;
2673
2674	return size;
2675}
2676
2677
2678static struct bin_attribute bin_attr_crb = {
2679	.attr = {.name = "crb", .mode = (S_IRUGO | S_IWUSR)},
2680	.size = 0,
2681	.read = netxen_sysfs_read_crb,
2682	.write = netxen_sysfs_write_crb,
2683};
2684
2685static struct bin_attribute bin_attr_mem = {
2686	.attr = {.name = "mem", .mode = (S_IRUGO | S_IWUSR)},
2687	.size = 0,
2688	.read = netxen_sysfs_read_mem,
2689	.write = netxen_sysfs_write_mem,
2690};
2691
2692
2693static void
2694netxen_create_sysfs_entries(struct netxen_adapter *adapter)
2695{
2696	struct net_device *netdev = adapter->netdev;
2697	struct device *dev = &netdev->dev;
2698
2699	if (adapter->capabilities & NX_FW_CAPABILITY_BDG) {
2700		/* bridged_mode control */
2701		if (device_create_file(dev, &dev_attr_bridged_mode)) {
2702			dev_warn(&netdev->dev,
2703				"failed to create bridged_mode sysfs entry\n");
2704		}
2705	}
2706}
2707
2708static void
2709netxen_remove_sysfs_entries(struct netxen_adapter *adapter)
2710{
2711	struct net_device *netdev = adapter->netdev;
2712	struct device *dev = &netdev->dev;
2713
2714	if (adapter->capabilities & NX_FW_CAPABILITY_BDG)
2715		device_remove_file(dev, &dev_attr_bridged_mode);
2716}
2717
2718static void
2719netxen_create_diag_entries(struct netxen_adapter *adapter)
2720{
2721	struct pci_dev *pdev = adapter->pdev;
2722	struct device *dev;
2723
2724	dev = &pdev->dev;
2725	if (device_create_file(dev, &dev_attr_diag_mode))
2726		dev_info(dev, "failed to create diag_mode sysfs entry\n");
2727	if (device_create_bin_file(dev, &bin_attr_crb))
2728		dev_info(dev, "failed to create crb sysfs entry\n");
2729	if (device_create_bin_file(dev, &bin_attr_mem))
2730		dev_info(dev, "failed to create mem sysfs entry\n");
2731}
2732
2733
2734static void
2735netxen_remove_diag_entries(struct netxen_adapter *adapter)
2736{
2737	struct pci_dev *pdev = adapter->pdev;
2738	struct device *dev = &pdev->dev;
2739
2740	device_remove_file(dev, &dev_attr_diag_mode);
2741	device_remove_bin_file(dev, &bin_attr_crb);
2742	device_remove_bin_file(dev, &bin_attr_mem);
2743}
2744
2745#ifdef CONFIG_INET
2746
2747#define is_netxen_netdev(dev) (dev->netdev_ops == &netxen_netdev_ops)
2748
2749static int
2750netxen_destip_supported(struct netxen_adapter *adapter)
2751{
2752	if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
2753		return 0;
2754
2755	if (adapter->ahw.cut_through)
2756		return 0;
2757
2758	return 1;
2759}
2760
2761static void
2762netxen_config_indev_addr(struct net_device *dev, unsigned long event)
2763{
2764	struct in_device *indev;
2765	struct netxen_adapter *adapter = netdev_priv(dev);
2766
2767	if (!netxen_destip_supported(adapter))
2768		return;
2769
2770	indev = in_dev_get(dev);
2771	if (!indev)
2772		return;
2773
2774	for_ifa(indev) {
2775		switch (event) {
2776		case NETDEV_UP:
2777			netxen_config_ipaddr(adapter,
2778					ifa->ifa_address, NX_IP_UP);
2779			break;
2780		case NETDEV_DOWN:
2781			netxen_config_ipaddr(adapter,
2782					ifa->ifa_address, NX_IP_DOWN);
2783			break;
2784		default:
2785			break;
2786		}
2787	} endfor_ifa(indev);
2788
2789	in_dev_put(indev);
2790}
2791
2792static int netxen_netdev_event(struct notifier_block *this,
2793				 unsigned long event, void *ptr)
2794{
2795	struct netxen_adapter *adapter;
2796	struct net_device *dev = (struct net_device *)ptr;
2797
2798recheck:
2799	if (dev == NULL)
2800		goto done;
2801
2802	if (dev->priv_flags & IFF_802_1Q_VLAN) {
2803		dev = vlan_dev_real_dev(dev);
2804		goto recheck;
2805	}
2806
2807	if (!is_netxen_netdev(dev))
2808		goto done;
2809
2810	adapter = netdev_priv(dev);
2811
2812	if (!adapter)
2813		goto done;
2814
2815	if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
2816		goto done;
2817
2818	netxen_config_indev_addr(dev, event);
2819done:
2820	return NOTIFY_DONE;
2821}
2822
2823static int
2824netxen_inetaddr_event(struct notifier_block *this,
2825		unsigned long event, void *ptr)
2826{
2827	struct netxen_adapter *adapter;
2828	struct net_device *dev;
2829
2830	struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
2831
2832	dev = ifa->ifa_dev ? ifa->ifa_dev->dev : NULL;
2833
2834recheck:
2835	if (dev == NULL || !netif_running(dev))
2836		goto done;
2837
2838	if (dev->priv_flags & IFF_802_1Q_VLAN) {
2839		dev = vlan_dev_real_dev(dev);
2840		goto recheck;
2841	}
2842
2843	if (!is_netxen_netdev(dev))
2844		goto done;
2845
2846	adapter = netdev_priv(dev);
2847
2848	if (!adapter || !netxen_destip_supported(adapter))
2849		goto done;
2850
2851	if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC)
2852		goto done;
2853
2854	switch (event) {
2855	case NETDEV_UP:
2856		netxen_config_ipaddr(adapter, ifa->ifa_address, NX_IP_UP);
2857		break;
2858	case NETDEV_DOWN:
2859		netxen_config_ipaddr(adapter, ifa->ifa_address, NX_IP_DOWN);
2860		break;
2861	default:
2862		break;
2863	}
2864
2865done:
2866	return NOTIFY_DONE;
2867}
2868
2869static struct notifier_block	netxen_netdev_cb = {
2870	.notifier_call = netxen_netdev_event,
2871};
2872
2873static struct notifier_block netxen_inetaddr_cb = {
2874	.notifier_call = netxen_inetaddr_event,
2875};
2876#else
2877static void
2878netxen_config_indev_addr(struct net_device *dev, unsigned long event)
2879{ }
2880#endif
2881
2882static struct pci_error_handlers netxen_err_handler = {
2883	.error_detected = netxen_io_error_detected,
2884	.slot_reset = netxen_io_slot_reset,
2885	.resume = netxen_io_resume,
2886};
2887
2888static struct pci_driver netxen_driver = {
2889	.name = netxen_nic_driver_name,
2890	.id_table = netxen_pci_tbl,
2891	.probe = netxen_nic_probe,
2892	.remove = __devexit_p(netxen_nic_remove),
2893#ifdef CONFIG_PM
2894	.suspend = netxen_nic_suspend,
2895	.resume = netxen_nic_resume,
2896#endif
2897	.shutdown = netxen_nic_shutdown,
2898	.err_handler = &netxen_err_handler
2899};
2900
2901static int __init netxen_init_module(void)
2902{
2903	printk(KERN_INFO "%s\n", netxen_nic_driver_string);
2904
2905#ifdef CONFIG_INET
2906	register_netdevice_notifier(&netxen_netdev_cb);
2907	register_inetaddr_notifier(&netxen_inetaddr_cb);
2908#endif
2909	return pci_register_driver(&netxen_driver);
2910}
2911
2912module_init(netxen_init_module);
2913
2914static void __exit netxen_exit_module(void)
2915{
2916	pci_unregister_driver(&netxen_driver);
2917
2918#ifdef CONFIG_INET
2919	unregister_inetaddr_notifier(&netxen_inetaddr_cb);
2920	unregister_netdevice_notifier(&netxen_netdev_cb);
2921#endif
2922}
2923
2924module_exit(netxen_exit_module);
2925