]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/net/netxen/netxen_nic_main.c
netxen: cleanup interrupt code
[linux-2.6-omap-h63xx.git] / drivers / net / netxen / netxen_nic_main.c
1 /*
2  * Copyright (C) 2003 - 2006 NetXen, Inc.
3  * All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18  * MA  02111-1307, USA.
19  *
20  * The full GNU General Public License is included in this distribution
21  * in the file called LICENSE.
22  *
23  * Contact Information:
24  *    info@netxen.com
25  * NetXen,
26  * 3965 Freedom Circle, Fourth floor,
27  * Santa Clara, CA 95054
28  *
29  *
30  *  Main source file for NetXen NIC Driver on Linux
31  *
32  */
33
34 #include <linux/vmalloc.h>
35 #include <linux/highmem.h>
36 #include "netxen_nic_hw.h"
37
38 #include "netxen_nic.h"
39 #include "netxen_nic_phan_reg.h"
40
41 #include <linux/dma-mapping.h>
42 #include <net/ip.h>
43
44 MODULE_DESCRIPTION("NetXen Multi port (1/10) Gigabit Network Driver");
45 MODULE_LICENSE("GPL");
46 MODULE_VERSION(NETXEN_NIC_LINUX_VERSIONID);
47
48 char netxen_nic_driver_name[] = "netxen_nic";
49 static char netxen_nic_driver_string[] = "NetXen Network Driver version "
50     NETXEN_NIC_LINUX_VERSIONID;
51
52 static int port_mode = NETXEN_PORT_MODE_AUTO_NEG;
53
54 /* Default to restricted 1G auto-neg mode */
55 static int wol_port_mode = 5;
56
57 static int use_msi = 1;
58
59 static int use_msi_x = 1;
60
61 /* Local functions to NetXen NIC driver */
62 static int __devinit netxen_nic_probe(struct pci_dev *pdev,
63                 const struct pci_device_id *ent);
64 static void __devexit netxen_nic_remove(struct pci_dev *pdev);
65 static int netxen_nic_open(struct net_device *netdev);
66 static int netxen_nic_close(struct net_device *netdev);
67 static int netxen_nic_xmit_frame(struct sk_buff *, struct net_device *);
68 static void netxen_tx_timeout(struct net_device *netdev);
69 static void netxen_tx_timeout_task(struct work_struct *work);
70 static void netxen_watchdog(unsigned long);
71 static int netxen_nic_poll(struct napi_struct *napi, int budget);
72 #ifdef CONFIG_NET_POLL_CONTROLLER
73 static void netxen_nic_poll_controller(struct net_device *netdev);
74 #endif
75 static irqreturn_t netxen_intr(int irq, void *data);
76 static irqreturn_t netxen_msi_intr(int irq, void *data);
77
78 /*  PCI Device ID Table  */
79 #define ENTRY(device) \
80         {PCI_DEVICE(0x4040, (device)), \
81         .class = PCI_CLASS_NETWORK_ETHERNET << 8, .class_mask = ~0}
82
83 static struct pci_device_id netxen_pci_tbl[] __devinitdata = {
84         ENTRY(0x0001),
85         ENTRY(0x0002),
86         ENTRY(0x0003),
87         ENTRY(0x0004),
88         ENTRY(0x0005),
89         ENTRY(0x0024),
90         ENTRY(0x0025),
91         ENTRY(0x0100),
92         {0,}
93 };
94
95 MODULE_DEVICE_TABLE(pci, netxen_pci_tbl);
96
97 /*
98  * In netxen_nic_down(), we must wait for any pending callback requests into
99  * netxen_watchdog_task() to complete; eg otherwise the watchdog_timer could be
100  * reenabled right after it is deleted in netxen_nic_down().
101  * FLUSH_SCHEDULED_WORK()  does this synchronization.
102  *
103  * Normally, schedule_work()/flush_scheduled_work() could have worked, but
104  * netxen_nic_close() is invoked with kernel rtnl lock held. netif_carrier_off()
105  * call in netxen_nic_close() triggers a schedule_work(&linkwatch_work), and a
106  * subsequent call to flush_scheduled_work() in netxen_nic_down() would cause
107  * linkwatch_event() to be executed which also attempts to acquire the rtnl
108  * lock thus causing a deadlock.
109  */
110
111 static struct workqueue_struct *netxen_workq;
112 #define SCHEDULE_WORK(tp)       queue_work(netxen_workq, tp)
113 #define FLUSH_SCHEDULED_WORK()  flush_workqueue(netxen_workq)
114
115 static void netxen_watchdog(unsigned long);
116
117 static uint32_t crb_cmd_producer[4] = {
118         CRB_CMD_PRODUCER_OFFSET, CRB_CMD_PRODUCER_OFFSET_1,
119         CRB_CMD_PRODUCER_OFFSET_2, CRB_CMD_PRODUCER_OFFSET_3
120 };
121
122 void
123 netxen_nic_update_cmd_producer(struct netxen_adapter *adapter,
124                 uint32_t crb_producer)
125 {
126         adapter->pci_write_normalize(adapter,
127                         adapter->crb_addr_cmd_producer, crb_producer);
128 }
129
130 static uint32_t crb_cmd_consumer[4] = {
131         CRB_CMD_CONSUMER_OFFSET, CRB_CMD_CONSUMER_OFFSET_1,
132         CRB_CMD_CONSUMER_OFFSET_2, CRB_CMD_CONSUMER_OFFSET_3
133 };
134
135 static inline void
136 netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter,
137                 u32 crb_consumer)
138 {
139         adapter->pci_write_normalize(adapter,
140                         adapter->crb_addr_cmd_consumer, crb_consumer);
141 }
142
143 static uint32_t msi_tgt_status[8] = {
144         ISR_INT_TARGET_STATUS, ISR_INT_TARGET_STATUS_F1,
145         ISR_INT_TARGET_STATUS_F2, ISR_INT_TARGET_STATUS_F3,
146         ISR_INT_TARGET_STATUS_F4, ISR_INT_TARGET_STATUS_F5,
147         ISR_INT_TARGET_STATUS_F6, ISR_INT_TARGET_STATUS_F7
148 };
149
150 static struct netxen_legacy_intr_set legacy_intr[] = NX_LEGACY_INTR_CONFIG;
151
152 static inline void netxen_nic_disable_int(struct netxen_adapter *adapter)
153 {
154         adapter->pci_write_normalize(adapter, adapter->crb_intr_mask, 0);
155 }
156
157 static inline void netxen_nic_enable_int(struct netxen_adapter *adapter)
158 {
159         adapter->pci_write_normalize(adapter, adapter->crb_intr_mask, 0x1);
160
161         if (!NETXEN_IS_MSI_FAMILY(adapter))
162                 adapter->pci_write_immediate(adapter,
163                                 adapter->legacy_intr.tgt_mask_reg, 0xfbff);
164 }
165
166 static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id)
167 {
168         struct pci_dev *pdev = adapter->pdev;
169         int err;
170         uint64_t mask;
171
172 #ifdef CONFIG_IA64
173         adapter->dma_mask = DMA_32BIT_MASK;
174 #else
175         if (revision_id >= NX_P3_B0) {
176                 /* should go to DMA_64BIT_MASK */
177                 adapter->dma_mask = DMA_39BIT_MASK;
178                 mask = DMA_39BIT_MASK;
179         } else if (revision_id == NX_P3_A2) {
180                 adapter->dma_mask = DMA_39BIT_MASK;
181                 mask = DMA_39BIT_MASK;
182         } else if (revision_id == NX_P2_C1) {
183                 adapter->dma_mask = DMA_35BIT_MASK;
184                 mask = DMA_35BIT_MASK;
185         } else {
186                 adapter->dma_mask = DMA_32BIT_MASK;
187                 mask = DMA_32BIT_MASK;
188                 goto set_32_bit_mask;
189         }
190
191         /*
192          * Consistent DMA mask is set to 32 bit because it cannot be set to
193          * 35 bits. For P3 also leave it at 32 bits for now. Only the rings
194          * come off this pool.
195          */
196         if (pci_set_dma_mask(pdev, mask) == 0 &&
197                 pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK) == 0) {
198                 adapter->pci_using_dac = 1;
199                 return 0;
200         }
201 #endif /* CONFIG_IA64 */
202
203 set_32_bit_mask:
204         err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
205         if (!err)
206                 err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
207         if (err) {
208                 DPRINTK(ERR, "No usable DMA configuration, aborting:%d\n", err);
209                 return err;
210         }
211
212         adapter->pci_using_dac = 0;
213         return 0;
214 }
215
216 static void netxen_check_options(struct netxen_adapter *adapter)
217 {
218         switch (adapter->ahw.boardcfg.board_type) {
219         case NETXEN_BRDTYPE_P3_HMEZ:
220         case NETXEN_BRDTYPE_P3_XG_LOM:
221         case NETXEN_BRDTYPE_P3_10G_CX4:
222         case NETXEN_BRDTYPE_P3_10G_CX4_LP:
223         case NETXEN_BRDTYPE_P3_IMEZ:
224         case NETXEN_BRDTYPE_P3_10G_SFP_PLUS:
225         case NETXEN_BRDTYPE_P3_10G_SFP_QT:
226         case NETXEN_BRDTYPE_P3_10G_SFP_CT:
227         case NETXEN_BRDTYPE_P3_10G_XFP:
228         case NETXEN_BRDTYPE_P3_10000_BASE_T:
229                 adapter->msix_supported = !!use_msi_x;
230                 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
231                 break;
232
233         case NETXEN_BRDTYPE_P2_SB31_10G:
234         case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
235         case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
236         case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ:
237                 adapter->msix_supported = 0;
238                 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
239                 break;
240
241         case NETXEN_BRDTYPE_P3_REF_QG:
242         case NETXEN_BRDTYPE_P3_4_GB:
243         case NETXEN_BRDTYPE_P3_4_GB_MM:
244                 adapter->msix_supported = 0;
245                 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
246                 break;
247
248         case NETXEN_BRDTYPE_P2_SB35_4G:
249         case NETXEN_BRDTYPE_P2_SB31_2G:
250                 adapter->msix_supported = 0;
251                 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
252                 break;
253
254         default:
255                 adapter->msix_supported = 0;
256                 adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
257
258                 printk(KERN_WARNING "Unknown board type(0x%x)\n",
259                                 adapter->ahw.boardcfg.board_type);
260                 break;
261         }
262
263         adapter->max_tx_desc_count = MAX_CMD_DESCRIPTORS_HOST;
264         adapter->max_jumbo_rx_desc_count = MAX_JUMBO_RCV_DESCRIPTORS;
265         adapter->max_lro_rx_desc_count = MAX_LRO_RCV_DESCRIPTORS;
266
267         adapter->max_possible_rss_rings = 1;
268         return;
269 }
270
271 static int
272 netxen_check_hw_init(struct netxen_adapter *adapter, int first_boot)
273 {
274         int ret = 0;
275
276         if (first_boot == 0x55555555) {
277                 /* This is the first boot after power up */
278
279                 /* PCI bus master workaround */
280                 adapter->hw_read_wx(adapter,
281                         NETXEN_PCIE_REG(0x4), &first_boot, 4);
282                 if (!(first_boot & 0x4)) {
283                         first_boot |= 0x4;
284                         adapter->hw_write_wx(adapter,
285                                 NETXEN_PCIE_REG(0x4), &first_boot, 4);
286                         adapter->hw_read_wx(adapter,
287                                 NETXEN_PCIE_REG(0x4), &first_boot, 4);
288                 }
289
290                 /* This is the first boot after power up */
291                 adapter->hw_read_wx(adapter,
292                         NETXEN_ROMUSB_GLB_SW_RESET, &first_boot, 4);
293                 if (first_boot != 0x80000f) {
294                         /* clear the register for future unloads/loads */
295                         adapter->pci_write_normalize(adapter,
296                                         NETXEN_CAM_RAM(0x1fc), 0);
297                         ret = -1;
298                 }
299
300                 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
301                         /* Start P2 boot loader */
302                         adapter->pci_write_normalize(adapter,
303                                 NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
304                         adapter->pci_write_normalize(adapter,
305                                         NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1);
306                 }
307         }
308         return ret;
309 }
310
311 static void netxen_set_port_mode(struct netxen_adapter *adapter)
312 {
313         u32 val, data;
314
315         val = adapter->ahw.boardcfg.board_type;
316         if ((val == NETXEN_BRDTYPE_P3_HMEZ) ||
317                 (val == NETXEN_BRDTYPE_P3_XG_LOM)) {
318                 if (port_mode == NETXEN_PORT_MODE_802_3_AP) {
319                         data = NETXEN_PORT_MODE_802_3_AP;
320                         adapter->hw_write_wx(adapter,
321                                 NETXEN_PORT_MODE_ADDR, &data, 4);
322                 } else if (port_mode == NETXEN_PORT_MODE_XG) {
323                         data = NETXEN_PORT_MODE_XG;
324                         adapter->hw_write_wx(adapter,
325                                 NETXEN_PORT_MODE_ADDR, &data, 4);
326                 } else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_1G) {
327                         data = NETXEN_PORT_MODE_AUTO_NEG_1G;
328                         adapter->hw_write_wx(adapter,
329                                 NETXEN_PORT_MODE_ADDR, &data, 4);
330                 } else if (port_mode == NETXEN_PORT_MODE_AUTO_NEG_XG) {
331                         data = NETXEN_PORT_MODE_AUTO_NEG_XG;
332                         adapter->hw_write_wx(adapter,
333                                 NETXEN_PORT_MODE_ADDR, &data, 4);
334                 } else {
335                         data = NETXEN_PORT_MODE_AUTO_NEG;
336                         adapter->hw_write_wx(adapter,
337                                 NETXEN_PORT_MODE_ADDR, &data, 4);
338                 }
339
340                 if ((wol_port_mode != NETXEN_PORT_MODE_802_3_AP) &&
341                         (wol_port_mode != NETXEN_PORT_MODE_XG) &&
342                         (wol_port_mode != NETXEN_PORT_MODE_AUTO_NEG_1G) &&
343                         (wol_port_mode != NETXEN_PORT_MODE_AUTO_NEG_XG)) {
344                         wol_port_mode = NETXEN_PORT_MODE_AUTO_NEG;
345                 }
346                 adapter->hw_write_wx(adapter, NETXEN_WOL_PORT_MODE,
347                         &wol_port_mode, 4);
348         }
349 }
350
351 #define PCI_CAP_ID_GEN  0x10
352
353 static void netxen_pcie_strap_init(struct netxen_adapter *adapter)
354 {
355         u32 pdevfuncsave;
356         u32 c8c9value = 0;
357         u32 chicken = 0;
358         u32 control = 0;
359         int i, pos;
360         struct pci_dev *pdev;
361
362         pdev = pci_get_device(0x1166, 0x0140, NULL);
363         if (pdev) {
364                 pci_dev_put(pdev);
365                 adapter->hw_read_wx(adapter,
366                         NETXEN_PCIE_REG(PCIE_TGT_SPLIT_CHICKEN), &chicken, 4);
367                 chicken |= 0x4000;
368                 adapter->hw_write_wx(adapter,
369                         NETXEN_PCIE_REG(PCIE_TGT_SPLIT_CHICKEN), &chicken, 4);
370         }
371
372         pdev = adapter->pdev;
373
374         adapter->hw_read_wx(adapter,
375                 NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
376         /* clear chicken3.25:24 */
377         chicken &= 0xFCFFFFFF;
378         /*
379          * if gen1 and B0, set F1020 - if gen 2, do nothing
380          * if gen2 set to F1000
381          */
382         pos = pci_find_capability(pdev, PCI_CAP_ID_GEN);
383         if (pos == 0xC0) {
384                 pci_read_config_dword(pdev, pos + 0x10, &control);
385                 if ((control & 0x000F0000) != 0x00020000) {
386                         /*  set chicken3.24 if gen1 */
387                         chicken |= 0x01000000;
388                 }
389                 printk(KERN_INFO "%s Gen2 strapping detected\n",
390                                 netxen_nic_driver_name);
391                 c8c9value = 0xF1000;
392         } else {
393                 /* set chicken3.24 if gen1 */
394                 chicken |= 0x01000000;
395                 printk(KERN_INFO "%s Gen1 strapping detected\n",
396                                 netxen_nic_driver_name);
397                 if (adapter->ahw.revision_id == NX_P3_B0)
398                         c8c9value = 0xF1020;
399                 else
400                         c8c9value = 0;
401
402         }
403         adapter->hw_write_wx(adapter,
404                 NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
405
406         if (!c8c9value)
407                 return;
408
409         pdevfuncsave = pdev->devfn;
410         if (pdevfuncsave & 0x07)
411                 return;
412
413         for (i = 0; i < 8; i++) {
414                 pci_read_config_dword(pdev, pos + 8, &control);
415                 pci_read_config_dword(pdev, pos + 8, &control);
416                 pci_write_config_dword(pdev, pos + 8, c8c9value);
417                 pdev->devfn++;
418         }
419         pdev->devfn = pdevfuncsave;
420 }
421
422 static void netxen_set_msix_bit(struct pci_dev *pdev, int enable)
423 {
424         u32 control;
425         int pos;
426
427         pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
428         if (pos) {
429                 pci_read_config_dword(pdev, pos, &control);
430                 if (enable)
431                         control |= PCI_MSIX_FLAGS_ENABLE;
432                 else
433                         control = 0;
434                 pci_write_config_dword(pdev, pos, control);
435         }
436 }
437
438 static void netxen_init_msix_entries(struct netxen_adapter *adapter)
439 {
440         int i;
441
442         for (i = 0; i < MSIX_ENTRIES_PER_ADAPTER; i++)
443                 adapter->msix_entries[i].entry = i;
444 }
445
446 static int
447 netxen_read_mac_addr(struct netxen_adapter *adapter)
448 {
449         int i;
450         unsigned char *p;
451         __le64 mac_addr;
452         DECLARE_MAC_BUF(mac);
453         struct net_device *netdev = adapter->netdev;
454         struct pci_dev *pdev = adapter->pdev;
455
456         if (netxen_is_flash_supported(adapter) != 0)
457                 return -EIO;
458
459         if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
460                 if (netxen_p3_get_mac_addr(adapter, &mac_addr) != 0)
461                         return -EIO;
462         } else {
463                 if (netxen_get_flash_mac_addr(adapter, &mac_addr) != 0)
464                         return -EIO;
465         }
466
467         p = (unsigned char *)&mac_addr;
468         for (i = 0; i < 6; i++)
469                 netdev->dev_addr[i] = *(p + 5 - i);
470
471         memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len);
472
473         /* set station address */
474
475         if (!is_valid_ether_addr(netdev->perm_addr)) {
476                 dev_warn(&pdev->dev, "Bad MAC address %s.\n",
477                                 print_mac(mac, netdev->dev_addr));
478         } else
479                 adapter->macaddr_set(adapter, netdev->dev_addr);
480
481         return 0;
482 }
483
484 /*
485  * netxen_nic_probe()
486  *
487  * The Linux system will invoke this after identifying the vendor ID and
488  * device Id in the pci_tbl supported by this module.
489  *
490  * A quad port card has one operational PCI config space, (function 0),
491  * which is used to access all four ports.
492  *
493  * This routine will initialize the adapter, and setup the global parameters
494  * along with the port's specific structure.
495  */
496 static int __devinit
497 netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
498 {
499         struct net_device *netdev = NULL;
500         struct netxen_adapter *adapter = NULL;
501         void __iomem *mem_ptr0 = NULL;
502         void __iomem *mem_ptr1 = NULL;
503         void __iomem *mem_ptr2 = NULL;
504         unsigned long first_page_group_end;
505         unsigned long first_page_group_start;
506
507
508         u8 __iomem *db_ptr = NULL;
509         unsigned long mem_base, mem_len, db_base, db_len, pci_len0 = 0;
510         int i = 0, err;
511         int first_driver, first_boot;
512         u32 val;
513         int pci_func_id = PCI_FUNC(pdev->devfn);
514         struct netxen_legacy_intr_set *legacy_intrp;
515         uint8_t revision_id;
516
517         if (pci_func_id == 0)
518                 printk(KERN_INFO "%s\n", netxen_nic_driver_string);
519
520         if (pdev->class != 0x020000) {
521                 printk(KERN_DEBUG "NetXen function %d, class %x will not "
522                                 "be enabled.\n",pci_func_id, pdev->class);
523                 return -ENODEV;
524         }
525
526         if ((err = pci_enable_device(pdev)))
527                 return err;
528
529         if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
530                 err = -ENODEV;
531                 goto err_out_disable_pdev;
532         }
533
534         if ((err = pci_request_regions(pdev, netxen_nic_driver_name)))
535                 goto err_out_disable_pdev;
536
537         pci_set_master(pdev);
538
539         netdev = alloc_etherdev(sizeof(struct netxen_adapter));
540         if(!netdev) {
541                 printk(KERN_ERR"%s: Failed to allocate memory for the "
542                                 "device block.Check system memory resource"
543                                 " usage.\n", netxen_nic_driver_name);
544                 goto err_out_free_res;
545         }
546
547         SET_NETDEV_DEV(netdev, &pdev->dev);
548
549         adapter = netdev->priv;
550         adapter->netdev  = netdev;
551         adapter->pdev    = pdev;
552         adapter->ahw.pci_func  = pci_func_id;
553
554         revision_id = pdev->revision;
555         adapter->ahw.revision_id = revision_id;
556
557         err = nx_set_dma_mask(adapter, revision_id);
558         if (err)
559                 goto err_out_free_netdev;
560
561         rwlock_init(&adapter->adapter_lock);
562         adapter->ahw.qdr_sn_window = -1;
563         adapter->ahw.ddr_mn_window = -1;
564
565         /* remap phys address */
566         mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */
567         mem_len = pci_resource_len(pdev, 0);
568         pci_len0 = 0;
569
570         adapter->hw_write_wx = netxen_nic_hw_write_wx_128M;
571         adapter->hw_read_wx = netxen_nic_hw_read_wx_128M;
572         adapter->pci_read_immediate = netxen_nic_pci_read_immediate_128M;
573         adapter->pci_write_immediate = netxen_nic_pci_write_immediate_128M;
574         adapter->pci_read_normalize = netxen_nic_pci_read_normalize_128M;
575         adapter->pci_write_normalize = netxen_nic_pci_write_normalize_128M;
576         adapter->pci_set_window = netxen_nic_pci_set_window_128M;
577         adapter->pci_mem_read = netxen_nic_pci_mem_read_128M;
578         adapter->pci_mem_write = netxen_nic_pci_mem_write_128M;
579
580         /* 128 Meg of memory */
581         if (mem_len == NETXEN_PCI_128MB_SIZE) {
582                 mem_ptr0 = ioremap(mem_base, FIRST_PAGE_GROUP_SIZE);
583                 mem_ptr1 = ioremap(mem_base + SECOND_PAGE_GROUP_START,
584                                 SECOND_PAGE_GROUP_SIZE);
585                 mem_ptr2 = ioremap(mem_base + THIRD_PAGE_GROUP_START,
586                                 THIRD_PAGE_GROUP_SIZE);
587                 first_page_group_start = FIRST_PAGE_GROUP_START;
588                 first_page_group_end   = FIRST_PAGE_GROUP_END;
589         } else if (mem_len == NETXEN_PCI_32MB_SIZE) {
590                 mem_ptr1 = ioremap(mem_base, SECOND_PAGE_GROUP_SIZE);
591                 mem_ptr2 = ioremap(mem_base + THIRD_PAGE_GROUP_START -
592                         SECOND_PAGE_GROUP_START, THIRD_PAGE_GROUP_SIZE);
593                 first_page_group_start = 0;
594                 first_page_group_end   = 0;
595         } else if (mem_len == NETXEN_PCI_2MB_SIZE) {
596                 adapter->hw_write_wx = netxen_nic_hw_write_wx_2M;
597                 adapter->hw_read_wx = netxen_nic_hw_read_wx_2M;
598                 adapter->pci_read_immediate = netxen_nic_pci_read_immediate_2M;
599                 adapter->pci_write_immediate =
600                         netxen_nic_pci_write_immediate_2M;
601                 adapter->pci_read_normalize = netxen_nic_pci_read_normalize_2M;
602                 adapter->pci_write_normalize =
603                         netxen_nic_pci_write_normalize_2M;
604                 adapter->pci_set_window = netxen_nic_pci_set_window_2M;
605                 adapter->pci_mem_read = netxen_nic_pci_mem_read_2M;
606                 adapter->pci_mem_write = netxen_nic_pci_mem_write_2M;
607
608                 mem_ptr0 = ioremap(mem_base, mem_len);
609                 pci_len0 = mem_len;
610                 first_page_group_start = 0;
611                 first_page_group_end   = 0;
612
613                 adapter->ahw.ddr_mn_window = 0;
614                 adapter->ahw.qdr_sn_window = 0;
615
616                 adapter->ahw.mn_win_crb = 0x100000 + PCIX_MN_WINDOW +
617                         (pci_func_id * 0x20);
618                 adapter->ahw.ms_win_crb = 0x100000 + PCIX_SN_WINDOW;
619                 if (pci_func_id < 4)
620                         adapter->ahw.ms_win_crb += (pci_func_id * 0x20);
621                 else
622                         adapter->ahw.ms_win_crb +=
623                                         0xA0 + ((pci_func_id - 4) * 0x10);
624         } else {
625                 err = -EIO;
626                 goto err_out_free_netdev;
627         }
628
629         dev_info(&pdev->dev, "%dMB memory map\n", (int)(mem_len>>20));
630
631         db_base = pci_resource_start(pdev, 4);  /* doorbell is on bar 4 */
632         db_len = pci_resource_len(pdev, 4);
633
634         if (db_len == 0) {
635                 printk(KERN_ERR "%s: doorbell is disabled\n",
636                                 netxen_nic_driver_name);
637                 err = -EIO;
638                 goto err_out_iounmap;
639         }
640         DPRINTK(INFO, "doorbell ioremap from %lx a size of %lx\n", db_base,
641                 db_len);
642
643         db_ptr = ioremap(db_base, NETXEN_DB_MAPSIZE_BYTES);
644         if (!db_ptr) {
645                 printk(KERN_ERR "%s: Failed to allocate doorbell map.",
646                                 netxen_nic_driver_name);
647                 err = -EIO;
648                 goto err_out_iounmap;
649         }
650         DPRINTK(INFO, "doorbell ioremaped at %p\n", db_ptr);
651
652         adapter->ahw.pci_base0 = mem_ptr0;
653         adapter->ahw.pci_len0 = pci_len0;
654         adapter->ahw.first_page_group_start = first_page_group_start;
655         adapter->ahw.first_page_group_end   = first_page_group_end;
656         adapter->ahw.pci_base1 = mem_ptr1;
657         adapter->ahw.pci_base2 = mem_ptr2;
658         adapter->ahw.db_base = db_ptr;
659         adapter->ahw.db_len = db_len;
660
661         netif_napi_add(netdev, &adapter->napi,
662                         netxen_nic_poll, NETXEN_NETDEV_WEIGHT);
663
664         if (revision_id >= NX_P3_B0)
665                 legacy_intrp = &legacy_intr[pci_func_id];
666         else
667                 legacy_intrp = &legacy_intr[0];
668
669         adapter->legacy_intr.int_vec_bit = legacy_intrp->int_vec_bit;
670         adapter->legacy_intr.tgt_status_reg = legacy_intrp->tgt_status_reg;
671         adapter->legacy_intr.tgt_mask_reg = legacy_intrp->tgt_mask_reg;
672         adapter->legacy_intr.pci_int_reg = legacy_intrp->pci_int_reg;
673
674         /* this will be read from FW later */
675         adapter->intr_scheme = -1;
676         adapter->msi_mode = -1;
677
678         /* This will be reset for mezz cards  */
679         adapter->portnum = pci_func_id;
680         adapter->status   &= ~NETXEN_NETDEV_STATUS;
681         adapter->rx_csum = 1;
682         adapter->mc_enabled = 0;
683         if (NX_IS_REVISION_P3(revision_id))
684                 adapter->max_mc_count = 38;
685         else
686                 adapter->max_mc_count = 16;
687
688         netdev->open               = netxen_nic_open;
689         netdev->stop               = netxen_nic_close;
690         netdev->hard_start_xmit    = netxen_nic_xmit_frame;
691         netdev->get_stats          = netxen_nic_get_stats;
692         if (NX_IS_REVISION_P3(revision_id))
693                 netdev->set_multicast_list = netxen_p3_nic_set_multi;
694         else
695                 netdev->set_multicast_list = netxen_p2_nic_set_multi;
696         netdev->set_mac_address    = netxen_nic_set_mac;
697         netdev->change_mtu         = netxen_nic_change_mtu;
698         netdev->tx_timeout         = netxen_tx_timeout;
699         netdev->watchdog_timeo     = 2*HZ;
700
701         netxen_nic_change_mtu(netdev, netdev->mtu);
702
703         SET_ETHTOOL_OPS(netdev, &netxen_nic_ethtool_ops);
704 #ifdef CONFIG_NET_POLL_CONTROLLER
705         netdev->poll_controller = netxen_nic_poll_controller;
706 #endif
707         /* ScatterGather support */
708         netdev->features = NETIF_F_SG;
709         netdev->features |= NETIF_F_IP_CSUM;
710         netdev->features |= NETIF_F_TSO;
711         if (NX_IS_REVISION_P3(revision_id)) {
712                 netdev->features |= NETIF_F_IPV6_CSUM;
713                 netdev->features |= NETIF_F_TSO6;
714         }
715
716         if (adapter->pci_using_dac)
717                 netdev->features |= NETIF_F_HIGHDMA;
718
719         /*
720          * Set the CRB window to invalid. If any register in window 0 is
721          * accessed it should set the window to 0 and then reset it to 1.
722          */
723         adapter->curr_window = 255;
724
725         if (netxen_nic_get_board_info(adapter) != 0) {
726                 printk("%s: Error getting board config info.\n",
727                                 netxen_nic_driver_name);
728                 err = -EIO;
729                 goto err_out_iounmap;
730         }
731
732         netxen_initialize_adapter_ops(adapter);
733
734         /* Mezz cards have PCI function 0,2,3 enabled */
735         switch (adapter->ahw.boardcfg.board_type) {
736         case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
737         case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ:
738                 if (pci_func_id >= 2)
739                         adapter->portnum = pci_func_id - 2;
740                 break;
741         default:
742                 break;
743         }
744
745         /*
746          * This call will setup various max rx/tx counts.
747          * It must be done before any buffer/ring allocations.
748          */
749         netxen_check_options(adapter);
750
751         first_driver = 0;
752         if (NX_IS_REVISION_P3(revision_id)) {
753                 if (adapter->ahw.pci_func == 0)
754                         first_driver = 1;
755         } else {
756                 if (adapter->portnum == 0)
757                         first_driver = 1;
758         }
759
760         if (first_driver) {
761                 first_boot = adapter->pci_read_normalize(adapter,
762                                 NETXEN_CAM_RAM(0x1fc));
763
764                 err = netxen_check_hw_init(adapter, first_boot);
765                 if (err) {
766                         printk(KERN_ERR "%s: error in init HW init sequence\n",
767                                         netxen_nic_driver_name);
768                         goto err_out_iounmap;
769                 }
770
771                 if (NX_IS_REVISION_P3(revision_id))
772                         netxen_set_port_mode(adapter);
773
774                 if (first_boot != 0x55555555) {
775                         adapter->pci_write_normalize(adapter,
776                                                 CRB_CMDPEG_STATE, 0);
777                         netxen_pinit_from_rom(adapter, 0);
778                         msleep(1);
779                         netxen_load_firmware(adapter);
780                 }
781
782                 if (NX_IS_REVISION_P3(revision_id))
783                         netxen_pcie_strap_init(adapter);
784
785                 if (NX_IS_REVISION_P2(revision_id)) {
786
787                         /* Initialize multicast addr pool owners */
788                         val = 0x7654;
789                         if (adapter->ahw.board_type == NETXEN_NIC_XGBE)
790                                 val |= 0x0f000000;
791                         netxen_crb_writelit_adapter(adapter,
792                                         NETXEN_MAC_ADDR_CNTL_REG, val);
793
794                 }
795
796                 if ((first_boot == 0x55555555) &&
797                         (NX_IS_REVISION_P2(revision_id))) {
798                         /* Unlock the HW, prompting the boot sequence */
799                         adapter->pci_write_normalize(adapter,
800                                         NETXEN_ROMUSB_GLB_PEGTUNE_DONE, 1);
801                 }
802
803                 err = netxen_initialize_adapter_offload(adapter);
804                 if (err)
805                         goto err_out_iounmap;
806
807                 /*
808                  * Tell the hardware our version number.
809                  */
810                 i = (_NETXEN_NIC_LINUX_MAJOR << 16)
811                         | ((_NETXEN_NIC_LINUX_MINOR << 8))
812                         | (_NETXEN_NIC_LINUX_SUBVERSION);
813                 adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, i);
814
815                 /* Handshake with the card before we register the devices. */
816                 netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
817
818         }       /* first_driver */
819
820         netxen_nic_flash_print(adapter);
821
822         if (NX_IS_REVISION_P3(revision_id)) {
823                 adapter->hw_read_wx(adapter,
824                                 NETXEN_MIU_MN_CONTROL, &val, 4);
825                 adapter->ahw.cut_through = (val & 0x4) ? 1 : 0;
826                 dev_info(&pdev->dev, "firmware running in %s mode\n",
827                 adapter->ahw.cut_through ? "cut through" : "legacy");
828         }
829
830         /*
831          * See if the firmware gave us a virtual-physical port mapping.
832          */
833         adapter->physical_port = adapter->portnum;
834         i = adapter->pci_read_normalize(adapter, CRB_V2P(adapter->portnum));
835         if (i != 0x55555555)
836                 adapter->physical_port = i;
837
838         adapter->flags &= ~(NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED);
839
840         netxen_set_msix_bit(pdev, 0);
841
842         if (NX_IS_REVISION_P3(revision_id)) {
843                 if ((mem_len != NETXEN_PCI_128MB_SIZE) &&
844                         mem_len != NETXEN_PCI_2MB_SIZE)
845                         adapter->msix_supported = 0;
846         }
847
848         if (adapter->msix_supported) {
849
850                 netxen_init_msix_entries(adapter);
851
852                 if (pci_enable_msix(pdev, adapter->msix_entries,
853                                         MSIX_ENTRIES_PER_ADAPTER))
854                         goto request_msi;
855
856                 adapter->flags |= NETXEN_NIC_MSIX_ENABLED;
857                 netxen_set_msix_bit(pdev, 1);
858                 dev_info(&pdev->dev, "using msi-x interrupts\n");
859
860         } else {
861 request_msi:
862                 if (use_msi && !pci_enable_msi(pdev)) {
863                         adapter->flags |= NETXEN_NIC_MSI_ENABLED;
864                         dev_info(&pdev->dev, "using msi interrupts\n");
865                 } else
866                         dev_info(&pdev->dev, "using legacy interrupts\n");
867         }
868
869         if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
870                 netdev->irq = adapter->msix_entries[0].vector;
871         else
872                 netdev->irq = pdev->irq;
873
874         err = netxen_receive_peg_ready(adapter);
875         if (err)
876                 goto err_out_disable_msi;
877
878         init_timer(&adapter->watchdog_timer);
879         adapter->watchdog_timer.function = &netxen_watchdog;
880         adapter->watchdog_timer.data = (unsigned long)adapter;
881         INIT_WORK(&adapter->watchdog_task, netxen_watchdog_task);
882         INIT_WORK(&adapter->tx_timeout_task, netxen_tx_timeout_task);
883
884         err = netxen_read_mac_addr(adapter);
885         if (err)
886                 dev_warn(&pdev->dev, "failed to read mac addr\n");
887
888         netif_carrier_off(netdev);
889         netif_stop_queue(netdev);
890
891         if ((err = register_netdev(netdev))) {
892                 printk(KERN_ERR "%s: register_netdev failed port #%d"
893                                " aborting\n", netxen_nic_driver_name,
894                                adapter->portnum);
895                 err = -EIO;
896                 goto err_out_disable_msi;
897         }
898
899         pci_set_drvdata(pdev, adapter);
900
901         switch (adapter->ahw.board_type) {
902         case NETXEN_NIC_GBE:
903                 dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n",
904                                 adapter->netdev->name);
905                 break;
906         case NETXEN_NIC_XGBE:
907                 dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n",
908                                 adapter->netdev->name);
909                 break;
910         }
911
912         return 0;
913
914 err_out_disable_msi:
915         if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
916                 pci_disable_msix(pdev);
917         if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
918                 pci_disable_msi(pdev);
919
920         if (first_driver)
921                 netxen_free_adapter_offload(adapter);
922
923 err_out_iounmap:
924         if (db_ptr)
925                 iounmap(db_ptr);
926
927         if (mem_ptr0)
928                 iounmap(mem_ptr0);
929         if (mem_ptr1)
930                 iounmap(mem_ptr1);
931         if (mem_ptr2)
932                 iounmap(mem_ptr2);
933
934 err_out_free_netdev:
935         free_netdev(netdev);
936
937 err_out_free_res:
938         pci_release_regions(pdev);
939
940 err_out_disable_pdev:
941         pci_set_drvdata(pdev, NULL);
942         pci_disable_device(pdev);
943         return err;
944 }
945
946 static void __devexit netxen_nic_remove(struct pci_dev *pdev)
947 {
948         struct netxen_adapter *adapter;
949         struct net_device *netdev;
950
951         adapter = pci_get_drvdata(pdev);
952         if (adapter == NULL)
953                 return;
954
955         netdev = adapter->netdev;
956
957         unregister_netdev(netdev);
958
959         if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
960                 netxen_free_hw_resources(adapter);
961                 netxen_release_rx_buffers(adapter);
962                 netxen_free_sw_resources(adapter);
963         }
964
965         if (adapter->portnum == 0)
966                 netxen_free_adapter_offload(adapter);
967
968         if (adapter->irq)
969                 free_irq(adapter->irq, adapter);
970
971         if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
972                 pci_disable_msix(pdev);
973         if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
974                 pci_disable_msi(pdev);
975
976         iounmap(adapter->ahw.db_base);
977         iounmap(adapter->ahw.pci_base0);
978         iounmap(adapter->ahw.pci_base1);
979         iounmap(adapter->ahw.pci_base2);
980
981         pci_release_regions(pdev);
982         pci_disable_device(pdev);
983         pci_set_drvdata(pdev, NULL);
984
985         free_netdev(netdev);
986 }
987
988 /*
989  * Called when a network interface is made active
990  * @returns 0 on success, negative value on failure
991  */
992 static int netxen_nic_open(struct net_device *netdev)
993 {
994         struct netxen_adapter *adapter = (struct netxen_adapter *)netdev->priv;
995         int err = 0;
996         int ctx, ring;
997         irq_handler_t handler;
998         unsigned long flags = IRQF_SAMPLE_RANDOM;
999
1000         if (adapter->driver_mismatch)
1001                 return -EIO;
1002
1003         if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) {
1004                 err = netxen_init_firmware(adapter);
1005                 if (err != 0) {
1006                         printk(KERN_ERR "Failed to init firmware\n");
1007                         return -EIO;
1008                 }
1009
1010                 if (adapter->fw_major < 4)
1011                         adapter->max_rds_rings = 3;
1012                 else
1013                         adapter->max_rds_rings = 2;
1014
1015                 err = netxen_alloc_sw_resources(adapter);
1016                 if (err) {
1017                         printk(KERN_ERR "%s: Error in setting sw resources\n",
1018                                         netdev->name);
1019                         return err;
1020                 }
1021
1022                 netxen_nic_clear_stats(adapter);
1023
1024                 err = netxen_alloc_hw_resources(adapter);
1025                 if (err) {
1026                         printk(KERN_ERR "%s: Error in setting hw resources\n",
1027                                         netdev->name);
1028                         goto err_out_free_sw;
1029                 }
1030
1031                 if ((adapter->msi_mode != MSI_MODE_MULTIFUNC) ||
1032                         (adapter->intr_scheme != INTR_SCHEME_PERPORT)) {
1033                         printk(KERN_ERR "%s: Firmware interrupt scheme is "
1034                                         "incompatible with driver\n",
1035                                         netdev->name);
1036                         adapter->driver_mismatch = 1;
1037                         goto err_out_free_hw;
1038                 }
1039
1040                 if (adapter->fw_major < 4) {
1041                         adapter->crb_addr_cmd_producer =
1042                                 crb_cmd_producer[adapter->portnum];
1043                         adapter->crb_addr_cmd_consumer =
1044                                 crb_cmd_consumer[adapter->portnum];
1045
1046                         netxen_nic_update_cmd_producer(adapter, 0);
1047                         netxen_nic_update_cmd_consumer(adapter, 0);
1048                 }
1049
1050                 for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
1051                         for (ring = 0; ring < adapter->max_rds_rings; ring++)
1052                                 netxen_post_rx_buffers(adapter, ctx, ring);
1053                 }
1054                 if (NETXEN_IS_MSI_FAMILY(adapter))
1055                         handler = netxen_msi_intr;
1056                 else {
1057                         flags |= IRQF_SHARED;
1058                         handler = netxen_intr;
1059                 }
1060                 adapter->irq = netdev->irq;
1061                 err = request_irq(adapter->irq, handler,
1062                                   flags, netdev->name, adapter);
1063                 if (err) {
1064                         printk(KERN_ERR "request_irq failed with: %d\n", err);
1065                         goto err_out_free_rxbuf;
1066                 }
1067
1068                 adapter->is_up = NETXEN_ADAPTER_UP_MAGIC;
1069         }
1070
1071         /* Done here again so that even if phantom sw overwrote it,
1072          * we set it */
1073         err = adapter->init_port(adapter, adapter->physical_port);
1074         if (err) {
1075                 printk(KERN_ERR "%s: Failed to initialize port %d\n",
1076                                 netxen_nic_driver_name, adapter->portnum);
1077                 goto err_out_free_irq;
1078         }
1079         adapter->macaddr_set(adapter, netdev->dev_addr);
1080
1081         netxen_nic_set_link_parameters(adapter);
1082
1083         netdev->set_multicast_list(netdev);
1084         if (adapter->set_mtu)
1085                 adapter->set_mtu(adapter, netdev->mtu);
1086
1087         adapter->ahw.linkup = 0;
1088         mod_timer(&adapter->watchdog_timer, jiffies);
1089
1090         napi_enable(&adapter->napi);
1091         netxen_nic_enable_int(adapter);
1092
1093         netif_start_queue(netdev);
1094
1095         return 0;
1096
1097 err_out_free_irq:
1098         free_irq(adapter->irq, adapter);
1099 err_out_free_rxbuf:
1100         netxen_release_rx_buffers(adapter);
1101 err_out_free_hw:
1102         netxen_free_hw_resources(adapter);
1103 err_out_free_sw:
1104         netxen_free_sw_resources(adapter);
1105         return err;
1106 }
1107
1108 /*
1109  * netxen_nic_close - Disables a network interface entry point
1110  */
1111 static int netxen_nic_close(struct net_device *netdev)
1112 {
1113         struct netxen_adapter *adapter = netdev_priv(netdev);
1114
1115         netif_carrier_off(netdev);
1116         netif_stop_queue(netdev);
1117         napi_disable(&adapter->napi);
1118
1119         if (adapter->stop_port)
1120                 adapter->stop_port(adapter);
1121
1122         netxen_nic_disable_int(adapter);
1123
1124         netxen_release_tx_buffers(adapter);
1125
1126         FLUSH_SCHEDULED_WORK();
1127         del_timer_sync(&adapter->watchdog_timer);
1128
1129         return 0;
1130 }
1131
1132 void netxen_tso_check(struct netxen_adapter *adapter,
1133                       struct cmd_desc_type0 *desc, struct sk_buff *skb)
1134 {
1135         if (desc->mss) {
1136                 desc->total_hdr_length = (sizeof(struct ethhdr) +
1137                                           ip_hdrlen(skb) + tcp_hdrlen(skb));
1138
1139                 if ((NX_IS_REVISION_P3(adapter->ahw.revision_id)) &&
1140                                 (skb->protocol == htons(ETH_P_IPV6)))
1141                         netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO6);
1142                 else
1143                         netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO);
1144
1145         } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
1146                 if (ip_hdr(skb)->protocol == IPPROTO_TCP)
1147                         netxen_set_cmd_desc_opcode(desc, TX_TCP_PKT);
1148                 else if (ip_hdr(skb)->protocol == IPPROTO_UDP)
1149                         netxen_set_cmd_desc_opcode(desc, TX_UDP_PKT);
1150                 else
1151                         return;
1152         }
1153         desc->tcp_hdr_offset = skb_transport_offset(skb);
1154         desc->ip_hdr_offset = skb_network_offset(skb);
1155 }
1156
1157 static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
1158 {
1159         struct netxen_adapter *adapter = netdev_priv(netdev);
1160         struct netxen_hardware_context *hw = &adapter->ahw;
1161         unsigned int first_seg_len = skb->len - skb->data_len;
1162         struct netxen_skb_frag *buffrag;
1163         unsigned int i;
1164
1165         u32 producer, consumer;
1166         u32 saved_producer = 0;
1167         struct cmd_desc_type0 *hwdesc;
1168         int k;
1169         struct netxen_cmd_buffer *pbuf = NULL;
1170         int frag_count;
1171         int no_of_desc;
1172         u32 num_txd = adapter->max_tx_desc_count;
1173
1174         frag_count = skb_shinfo(skb)->nr_frags + 1;
1175
1176         /* There 4 fragments per descriptor */
1177         no_of_desc = (frag_count + 3) >> 2;
1178         if (netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) {
1179                 if (skb_shinfo(skb)->gso_size > 0) {
1180
1181                         no_of_desc++;
1182                         if ((ip_hdrlen(skb) + tcp_hdrlen(skb) +
1183                              sizeof(struct ethhdr)) >
1184                             (sizeof(struct cmd_desc_type0) - 2)) {
1185                                 no_of_desc++;
1186                         }
1187                 }
1188         }
1189
1190         producer = adapter->cmd_producer;
1191         smp_mb();
1192         consumer = adapter->last_cmd_consumer;
1193         if ((no_of_desc+2) > find_diff_among(producer, consumer, num_txd)) {
1194                 netif_stop_queue(netdev);
1195                 smp_mb();
1196                 return NETDEV_TX_BUSY;
1197         }
1198
1199         /* Copy the descriptors into the hardware    */
1200         saved_producer = producer;
1201         hwdesc = &hw->cmd_desc_head[producer];
1202         memset(hwdesc, 0, sizeof(struct cmd_desc_type0));
1203         /* Take skb->data itself */
1204         pbuf = &adapter->cmd_buf_arr[producer];
1205         if ((netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) &&
1206                         skb_shinfo(skb)->gso_size > 0) {
1207                 pbuf->mss = skb_shinfo(skb)->gso_size;
1208                 hwdesc->mss = cpu_to_le16(skb_shinfo(skb)->gso_size);
1209         } else {
1210                 pbuf->mss = 0;
1211                 hwdesc->mss = 0;
1212         }
1213         pbuf->total_length = skb->len;
1214         pbuf->skb = skb;
1215         pbuf->cmd = TX_ETHER_PKT;
1216         pbuf->frag_count = frag_count;
1217         pbuf->port = adapter->portnum;
1218         buffrag = &pbuf->frag_array[0];
1219         buffrag->dma = pci_map_single(adapter->pdev, skb->data, first_seg_len,
1220                                       PCI_DMA_TODEVICE);
1221         buffrag->length = first_seg_len;
1222         netxen_set_cmd_desc_totallength(hwdesc, skb->len);
1223         netxen_set_cmd_desc_num_of_buff(hwdesc, frag_count);
1224         netxen_set_cmd_desc_opcode(hwdesc, TX_ETHER_PKT);
1225
1226         netxen_set_cmd_desc_port(hwdesc, adapter->portnum);
1227         netxen_set_cmd_desc_ctxid(hwdesc, adapter->portnum);
1228         hwdesc->buffer1_length = cpu_to_le16(first_seg_len);
1229         hwdesc->addr_buffer1 = cpu_to_le64(buffrag->dma);
1230
1231         for (i = 1, k = 1; i < frag_count; i++, k++) {
1232                 struct skb_frag_struct *frag;
1233                 int len, temp_len;
1234                 unsigned long offset;
1235                 dma_addr_t temp_dma;
1236
1237                 /* move to next desc. if there is a need */
1238                 if ((i & 0x3) == 0) {
1239                         k = 0;
1240                         producer = get_next_index(producer, num_txd);
1241                         hwdesc = &hw->cmd_desc_head[producer];
1242                         memset(hwdesc, 0, sizeof(struct cmd_desc_type0));
1243                         pbuf = &adapter->cmd_buf_arr[producer];
1244                         pbuf->skb = NULL;
1245                 }
1246                 frag = &skb_shinfo(skb)->frags[i - 1];
1247                 len = frag->size;
1248                 offset = frag->page_offset;
1249
1250                 temp_len = len;
1251                 temp_dma = pci_map_page(adapter->pdev, frag->page, offset,
1252                                         len, PCI_DMA_TODEVICE);
1253
1254                 buffrag++;
1255                 buffrag->dma = temp_dma;
1256                 buffrag->length = temp_len;
1257
1258                 switch (k) {
1259                 case 0:
1260                         hwdesc->buffer1_length = cpu_to_le16(temp_len);
1261                         hwdesc->addr_buffer1 = cpu_to_le64(temp_dma);
1262                         break;
1263                 case 1:
1264                         hwdesc->buffer2_length = cpu_to_le16(temp_len);
1265                         hwdesc->addr_buffer2 = cpu_to_le64(temp_dma);
1266                         break;
1267                 case 2:
1268                         hwdesc->buffer3_length = cpu_to_le16(temp_len);
1269                         hwdesc->addr_buffer3 = cpu_to_le64(temp_dma);
1270                         break;
1271                 case 3:
1272                         hwdesc->buffer4_length = cpu_to_le16(temp_len);
1273                         hwdesc->addr_buffer4 = cpu_to_le64(temp_dma);
1274                         break;
1275                 }
1276                 frag++;
1277         }
1278         producer = get_next_index(producer, num_txd);
1279
1280         /* might change opcode to TX_TCP_LSO */
1281         netxen_tso_check(adapter, &hw->cmd_desc_head[saved_producer], skb);
1282
1283         /* For LSO, we need to copy the MAC/IP/TCP headers into
1284          * the descriptor ring
1285          */
1286         if (netxen_get_cmd_desc_opcode(&hw->cmd_desc_head[saved_producer])
1287             == TX_TCP_LSO) {
1288                 int hdr_len, first_hdr_len, more_hdr;
1289                 hdr_len = hw->cmd_desc_head[saved_producer].total_hdr_length;
1290                 if (hdr_len > (sizeof(struct cmd_desc_type0) - 2)) {
1291                         first_hdr_len = sizeof(struct cmd_desc_type0) - 2;
1292                         more_hdr = 1;
1293                 } else {
1294                         first_hdr_len = hdr_len;
1295                         more_hdr = 0;
1296                 }
1297                 /* copy the MAC/IP/TCP headers to the cmd descriptor list */
1298                 hwdesc = &hw->cmd_desc_head[producer];
1299                 pbuf = &adapter->cmd_buf_arr[producer];
1300                 pbuf->skb = NULL;
1301
1302                 /* copy the first 64 bytes */
1303                 memcpy(((void *)hwdesc) + 2,
1304                        (void *)(skb->data), first_hdr_len);
1305                 producer = get_next_index(producer, num_txd);
1306
1307                 if (more_hdr) {
1308                         hwdesc = &hw->cmd_desc_head[producer];
1309                         pbuf = &adapter->cmd_buf_arr[producer];
1310                         pbuf->skb = NULL;
1311                         /* copy the next 64 bytes - should be enough except
1312                          * for pathological case
1313                          */
1314                         skb_copy_from_linear_data_offset(skb, first_hdr_len,
1315                                                          hwdesc,
1316                                                          (hdr_len -
1317                                                           first_hdr_len));
1318                         producer = get_next_index(producer, num_txd);
1319                 }
1320         }
1321
1322         adapter->cmd_producer = producer;
1323         adapter->stats.txbytes += skb->len;
1324
1325         netxen_nic_update_cmd_producer(adapter, adapter->cmd_producer);
1326
1327         adapter->stats.xmitcalled++;
1328         netdev->trans_start = jiffies;
1329
1330         return NETDEV_TX_OK;
1331 }
1332
1333 static int netxen_nic_check_temp(struct netxen_adapter *adapter)
1334 {
1335         struct net_device *netdev = adapter->netdev;
1336         uint32_t temp, temp_state, temp_val;
1337         int rv = 0;
1338
1339         temp = adapter->pci_read_normalize(adapter, CRB_TEMP_STATE);
1340
1341         temp_state = nx_get_temp_state(temp);
1342         temp_val = nx_get_temp_val(temp);
1343
1344         if (temp_state == NX_TEMP_PANIC) {
1345                 printk(KERN_ALERT
1346                        "%s: Device temperature %d degrees C exceeds"
1347                        " maximum allowed. Hardware has been shut down.\n",
1348                        netxen_nic_driver_name, temp_val);
1349
1350                 netif_carrier_off(netdev);
1351                 netif_stop_queue(netdev);
1352                 rv = 1;
1353         } else if (temp_state == NX_TEMP_WARN) {
1354                 if (adapter->temp == NX_TEMP_NORMAL) {
1355                         printk(KERN_ALERT
1356                                "%s: Device temperature %d degrees C "
1357                                "exceeds operating range."
1358                                " Immediate action needed.\n",
1359                                netxen_nic_driver_name, temp_val);
1360                 }
1361         } else {
1362                 if (adapter->temp == NX_TEMP_WARN) {
1363                         printk(KERN_INFO
1364                                "%s: Device temperature is now %d degrees C"
1365                                " in normal range.\n", netxen_nic_driver_name,
1366                                temp_val);
1367                 }
1368         }
1369         adapter->temp = temp_state;
1370         return rv;
1371 }
1372
1373 static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
1374 {
1375         struct net_device *netdev = adapter->netdev;
1376         u32 val, port, linkup;
1377
1378         port = adapter->physical_port;
1379
1380         if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
1381                 val = adapter->pci_read_normalize(adapter, CRB_XG_STATE_P3);
1382                 val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val);
1383                 linkup = (val == XG_LINK_UP_P3);
1384         } else {
1385                 val = adapter->pci_read_normalize(adapter, CRB_XG_STATE);
1386                 if (adapter->ahw.board_type == NETXEN_NIC_GBE)
1387                         linkup = (val >> port) & 1;
1388                 else {
1389                         val = (val >> port*8) & 0xff;
1390                         linkup = (val == XG_LINK_UP);
1391                 }
1392         }
1393
1394         if (adapter->ahw.linkup && !linkup) {
1395                 printk(KERN_INFO "%s: %s NIC Link is down\n",
1396                        netxen_nic_driver_name, netdev->name);
1397                 adapter->ahw.linkup = 0;
1398                 if (netif_running(netdev)) {
1399                         netif_carrier_off(netdev);
1400                         netif_stop_queue(netdev);
1401                 }
1402         } else if (!adapter->ahw.linkup && linkup) {
1403                 printk(KERN_INFO "%s: %s NIC Link is up\n",
1404                        netxen_nic_driver_name, netdev->name);
1405                 adapter->ahw.linkup = 1;
1406                 if (netif_running(netdev)) {
1407                         netif_carrier_on(netdev);
1408                         netif_wake_queue(netdev);
1409                 }
1410         }
1411 }
1412
1413 static void netxen_watchdog(unsigned long v)
1414 {
1415         struct netxen_adapter *adapter = (struct netxen_adapter *)v;
1416
1417         SCHEDULE_WORK(&adapter->watchdog_task);
1418 }
1419
1420 void netxen_watchdog_task(struct work_struct *work)
1421 {
1422         struct netxen_adapter *adapter =
1423                 container_of(work, struct netxen_adapter, watchdog_task);
1424
1425         if ((adapter->portnum  == 0) && netxen_nic_check_temp(adapter))
1426                 return;
1427
1428         netxen_nic_handle_phy_intr(adapter);
1429
1430         if (netif_running(adapter->netdev))
1431                 mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
1432 }
1433
1434 static void netxen_tx_timeout(struct net_device *netdev)
1435 {
1436         struct netxen_adapter *adapter = (struct netxen_adapter *)
1437                                                 netdev_priv(netdev);
1438         SCHEDULE_WORK(&adapter->tx_timeout_task);
1439 }
1440
1441 static void netxen_tx_timeout_task(struct work_struct *work)
1442 {
1443         struct netxen_adapter *adapter =
1444                 container_of(work, struct netxen_adapter, tx_timeout_task);
1445
1446         printk(KERN_ERR "%s %s: transmit timeout, resetting.\n",
1447                netxen_nic_driver_name, adapter->netdev->name);
1448
1449         netxen_nic_disable_int(adapter);
1450         napi_disable(&adapter->napi);
1451
1452         adapter->netdev->trans_start = jiffies;
1453
1454         napi_enable(&adapter->napi);
1455         netxen_nic_enable_int(adapter);
1456         netif_wake_queue(adapter->netdev);
1457 }
1458
1459 /*
1460  * netxen_nic_get_stats - Get System Network Statistics
1461  * @netdev: network interface device structure
1462  */
1463 struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev)
1464 {
1465         struct netxen_adapter *adapter = netdev_priv(netdev);
1466         struct net_device_stats *stats = &adapter->net_stats;
1467
1468         memset(stats, 0, sizeof(*stats));
1469
1470         /* total packets received   */
1471         stats->rx_packets = adapter->stats.no_rcv;
1472         /* total packets transmitted    */
1473         stats->tx_packets = adapter->stats.xmitedframes +
1474                 adapter->stats.xmitfinished;
1475         /* total bytes received     */
1476         stats->rx_bytes = adapter->stats.rxbytes;
1477         /* total bytes transmitted  */
1478         stats->tx_bytes = adapter->stats.txbytes;
1479         /* bad packets received     */
1480         stats->rx_errors = adapter->stats.rcvdbadskb;
1481         /* packet transmit problems */
1482         stats->tx_errors = adapter->stats.nocmddescriptor;
1483         /* no space in linux buffers    */
1484         stats->rx_dropped = adapter->stats.rxdropped;
1485         /* no space available in linux  */
1486         stats->tx_dropped = adapter->stats.txdropped;
1487
1488         return stats;
1489 }
1490
1491 static irqreturn_t netxen_intr(int irq, void *data)
1492 {
1493         struct netxen_adapter *adapter = data;
1494         u32 status = 0;
1495
1496         status = adapter->pci_read_immediate(adapter, ISR_INT_VECTOR);
1497
1498         if (!(status & adapter->legacy_intr.int_vec_bit))
1499                 return IRQ_NONE;
1500
1501         if (adapter->ahw.revision_id >= NX_P3_B1) {
1502                 /* check interrupt state machine, to be sure */
1503                 status = adapter->pci_read_immediate(adapter,
1504                                 ISR_INT_STATE_REG);
1505                 if (!ISR_LEGACY_INT_TRIGGERED(status))
1506                         return IRQ_NONE;
1507
1508         } else {
1509                 unsigned long our_int = 0;
1510
1511                 our_int = adapter->pci_read_normalize(adapter, CRB_INT_VECTOR);
1512
1513                 /* not our interrupt */
1514                 if (!test_and_clear_bit((7 + adapter->portnum), &our_int))
1515                         return IRQ_NONE;
1516
1517                 /* claim interrupt */
1518                 adapter->pci_write_normalize(adapter,
1519                                 CRB_INT_VECTOR, (our_int & 0xffffffff));
1520         }
1521
1522         /* clear interrupt */
1523         if (adapter->fw_major < 4)
1524                 netxen_nic_disable_int(adapter);
1525
1526         adapter->pci_write_immediate(adapter,
1527                         adapter->legacy_intr.tgt_status_reg,
1528                         0xffffffff);
1529         /* read twice to ensure write is flushed */
1530         adapter->pci_read_immediate(adapter, ISR_INT_VECTOR);
1531         adapter->pci_read_immediate(adapter, ISR_INT_VECTOR);
1532
1533         napi_schedule(&adapter->napi);
1534
1535         return IRQ_HANDLED;
1536 }
1537
1538 static irqreturn_t netxen_msi_intr(int irq, void *data)
1539 {
1540         struct netxen_adapter *adapter = data;
1541
1542         /* clear interrupt */
1543         adapter->pci_write_immediate(adapter,
1544                         msi_tgt_status[adapter->ahw.pci_func], 0xffffffff);
1545
1546         napi_schedule(&adapter->napi);
1547         return IRQ_HANDLED;
1548 }
1549
1550 static int netxen_nic_poll(struct napi_struct *napi, int budget)
1551 {
1552         struct netxen_adapter *adapter = container_of(napi, struct netxen_adapter, napi);
1553         int tx_complete;
1554         int ctx;
1555         int work_done;
1556
1557         tx_complete = netxen_process_cmd_ring(adapter);
1558
1559         work_done = 0;
1560         for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) {
1561                 /*
1562                  * Fairness issue. This will give undue weight to the
1563                  * receive context 0.
1564                  */
1565
1566                 /*
1567                  * To avoid starvation, we give each of our receivers,
1568                  * a fraction of the quota. Sometimes, it might happen that we
1569                  * have enough quota to process every packet, but since all the
1570                  * packets are on one context, it gets only half of the quota,
1571                  * and ends up not processing it.
1572                  */
1573                 work_done += netxen_process_rcv_ring(adapter, ctx,
1574                                                      budget / MAX_RCV_CTX);
1575         }
1576
1577         if ((work_done < budget) && tx_complete) {
1578                 netif_rx_complete(adapter->netdev, &adapter->napi);
1579                 netxen_nic_enable_int(adapter);
1580         }
1581
1582         return work_done;
1583 }
1584
1585 #ifdef CONFIG_NET_POLL_CONTROLLER
1586 static void netxen_nic_poll_controller(struct net_device *netdev)
1587 {
1588         struct netxen_adapter *adapter = netdev_priv(netdev);
1589         disable_irq(adapter->irq);
1590         netxen_intr(adapter->irq, adapter);
1591         enable_irq(adapter->irq);
1592 }
1593 #endif
1594
1595 static struct pci_driver netxen_driver = {
1596         .name = netxen_nic_driver_name,
1597         .id_table = netxen_pci_tbl,
1598         .probe = netxen_nic_probe,
1599         .remove = __devexit_p(netxen_nic_remove)
1600 };
1601
1602 /* Driver Registration on NetXen card    */
1603
1604 static int __init netxen_init_module(void)
1605 {
1606         if ((netxen_workq = create_singlethread_workqueue("netxen")) == NULL)
1607                 return -ENOMEM;
1608
1609         return pci_register_driver(&netxen_driver);
1610 }
1611
1612 module_init(netxen_init_module);
1613
1614 static void __exit netxen_exit_module(void)
1615 {
1616         pci_unregister_driver(&netxen_driver);
1617         destroy_workqueue(netxen_workq);
1618 }
1619
1620 module_exit(netxen_exit_module);