]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qlge: update to qlogic 1.00.00.31
authorSritej Velaga <sritej.velaga@qlogic.com>
Tue, 8 Jan 2013 22:15:25 +0000 (15:15 -0700)
committerJerry Snitselaar <jerry.snitselaar@oracle.com>
Tue, 8 Jan 2013 22:15:25 +0000 (15:15 -0700)
Signed-off-by: Jerry Snitselaar <jerry.snitselaar@oracle.com>
drivers/net/qlge/qlge.h
drivers/net/qlge/qlge_dbg.c
drivers/net/qlge/qlge_ethtool.c
drivers/net/qlge/qlge_main.c

index a131d7b5d2fe00e1f96997bef8f8afa54186aaa5..b9cb55534282583e73d664381dde4362afe08ce8 100644 (file)
@@ -7,11 +7,9 @@
 #ifndef _QLGE_H_
 #define _QLGE_H_
 
-#include <linux/interrupt.h>
 #include <linux/pci.h>
 #include <linux/netdevice.h>
 #include <linux/rtnetlink.h>
-#include <linux/if_vlan.h>
 
 /*
  * General definitions...
@@ -2060,7 +2058,7 @@ struct ql_adapter {
 
        struct nic_stats nic_stats;
 
-       unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
+       struct vlan_group *vlgrp;
 
        /* PCI Configuration information for this device */
        struct pci_dev *pdev;
index 58185b604b729c131c9215bbdf9c8cfbbb53f24c..fca804f36d61a2e6f2d79140945adee3732a2ec1 100644 (file)
@@ -1824,8 +1824,10 @@ void ql_dump_hw_cb(struct ql_adapter *qdev, int size, u32 bit, u16 q_id)
        pr_err("%s: Enter\n", __func__);
 
        ptr = kmalloc(size, GFP_ATOMIC);
-       if (ptr == NULL)
+       if (ptr == NULL) {
+               pr_err("%s: Couldn't allocate a buffer\n", __func__);
                return;
+       }
 
        if (ql_write_cfg(qdev, ptr, size, bit, q_id)) {
                pr_err("%s: Failed to upload control block!\n", __func__);
index 6f316ab23257dc7343776d92db05cc471561d681..dca3c43f07fb190f0de5ec82afe5a5520585108c 100644 (file)
@@ -328,6 +328,7 @@ quit:
 static void ql_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
 {
        int index;
+
        switch (stringset) {
        case ETH_SS_TEST:
                memcpy(buf, *ql_gstrings_test, QLGE_TEST_LEN * ETH_GSTRING_LEN);
@@ -335,8 +336,8 @@ static void ql_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
        case ETH_SS_STATS:
                for (index = 0; index < QLGE_STATS_LEN; index++) {
                        memcpy(buf + index * ETH_GSTRING_LEN,
-                               ql_gstrings_stats[index].stat_string,
-                               ETH_GSTRING_LEN);
+                       ql_gstrings_stats[index].stat_string,
+                       ETH_GSTRING_LEN);
                }
                break;
        }
@@ -403,15 +404,12 @@ static void ql_get_drvinfo(struct net_device *ndev,
 {
        struct ql_adapter *qdev = netdev_priv(ndev);
        strlcpy(drvinfo->driver, qlge_driver_name, sizeof(drvinfo->driver));
-       strlcpy(drvinfo->version, qlge_driver_version,
-               sizeof(drvinfo->version));
-       snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
-                "v%d.%d.%d",
+       strlcpy(drvinfo->version, qlge_driver_version, sizeof(drvinfo->version));
+       snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), "v%d.%d.%d",
                 (qdev->fw_rev_id & 0x00ff0000) >> 16,
                 (qdev->fw_rev_id & 0x0000ff00) >> 8,
                 (qdev->fw_rev_id & 0x000000ff));
-       strlcpy(drvinfo->bus_info, pci_name(qdev->pdev),
-               sizeof(drvinfo->bus_info));
+       strlcpy(drvinfo->bus_info, pci_name(qdev->pdev), sizeof(drvinfo->bus_info));
        drvinfo->n_stats = 0;
        drvinfo->testinfo_len = 0;
        if (!test_bit(QL_FRC_COREDUMP, &qdev->flags))
@@ -694,6 +692,8 @@ static int ql_set_pauseparam(struct net_device *netdev,
                return -EINVAL;
 
        status = ql_mb_set_port_cfg(qdev);
+       if (status)
+               return status;
        return status;
 }
 
index b262d6156816134e980c81915b23e10b526d8803..953c0f956cd0ba5c9c5985825280753cc4d863f8 100644 (file)
@@ -7,7 +7,6 @@
  */
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/module.h>
 #include <linux/list.h>
@@ -34,8 +33,8 @@
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
-#include <linux/if_vlan.h>
 #include <linux/skbuff.h>
+#include <linux/if_vlan.h>
 #include <linux/delay.h>
 #include <linux/mm.h>
 #include <linux/vmalloc.h>
@@ -409,7 +408,7 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type,
                                      (qdev->
                                       func << CAM_OUT_FUNC_SHIFT) |
                                        (0 << CAM_OUT_CQ_ID_SHIFT));
-                       if (qdev->ndev->features & NETIF_F_HW_VLAN_RX)
+                       if (qdev->vlgrp)
                                cam_output |= CAM_OUT_RV;
                        /* route to NIC core */
                        ql_write32(qdev, MAC_ADDR_DATA, cam_output);
@@ -1398,10 +1397,12 @@ static int ql_map_send(struct ql_adapter *qdev,
                        map_idx++;
                }
 
-               map = skb_frag_dma_map(&qdev->pdev->dev, frag, 0, skb_frag_size(frag),
-                                      DMA_TO_DEVICE);
+               map =
+                   pci_map_page(qdev->pdev, frag->page,
+                                frag->page_offset, frag->size,
+                                PCI_DMA_TODEVICE);
 
-               err = dma_mapping_error(&qdev->pdev->dev, map);
+               err = pci_dma_mapping_error(qdev->pdev, map);
                if (err) {
                        netif_err(qdev, tx_queued, qdev->ndev,
                                  "PCI mapping frags failed with error: %d.\n",
@@ -1410,10 +1411,10 @@ static int ql_map_send(struct ql_adapter *qdev,
                }
 
                tbd->addr = cpu_to_le64(map);
-               tbd->len = cpu_to_le32(skb_frag_size(frag));
+               tbd->len = cpu_to_le32(frag->size);
                dma_unmap_addr_set(&tx_ring_desc->map[map_idx], mapaddr, map);
                dma_unmap_len_set(&tx_ring_desc->map[map_idx], maplen,
-                                 skb_frag_size(frag));
+                                 frag->size);
 
        }
        /* Save the number of segments we've mapped. */
@@ -1472,6 +1473,8 @@ static void ql_process_mac_rx_gro_page(struct ql_adapter *qdev,
 {
        struct sk_buff *skb;
        struct bq_desc *lbq_desc = ql_get_curr_lchunk(qdev, rx_ring);
+       struct skb_frag_struct *rx_frag;
+       int nr_frags;
        struct napi_struct *napi = &rx_ring->napi;
 
        napi->dev = qdev->ndev;
@@ -1485,10 +1488,12 @@ static void ql_process_mac_rx_gro_page(struct ql_adapter *qdev,
                return;
        }
        prefetch(lbq_desc->p.pg_chunk.va);
-       __skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags,
-                            lbq_desc->p.pg_chunk.page,
-                            lbq_desc->p.pg_chunk.offset,
-                            length);
+       rx_frag = skb_shinfo(skb)->frags;
+       nr_frags = skb_shinfo(skb)->nr_frags;
+       rx_frag += nr_frags;
+       rx_frag->page = lbq_desc->p.pg_chunk.page;
+       rx_frag->page_offset = lbq_desc->p.pg_chunk.offset;
+       rx_frag->size = length;
 
        skb->len += length;
        skb->data_len += length;
@@ -1499,9 +1504,10 @@ static void ql_process_mac_rx_gro_page(struct ql_adapter *qdev,
        rx_ring->rx_bytes += length;
        skb->ip_summed = CHECKSUM_UNNECESSARY;
        skb_record_rx_queue(skb, rx_ring->cq_id);
-       if (vlan_id != 0xffff)
-               __vlan_hwaccel_put_tag(skb, vlan_id);
-       napi_gro_frags(napi);
+       if (qdev->vlgrp && (vlan_id != 0xffff))
+               vlan_gro_frags(&rx_ring->napi, qdev->vlgrp, vlan_id);
+       else
+               napi_gro_frags(napi);
 }
 
 /* Process an inbound completion from an rx ring. */
@@ -1567,7 +1573,7 @@ static void ql_process_mac_rx_page(struct ql_adapter *qdev,
                        struct iphdr *iph =
                                (struct iphdr *) ((u8 *)addr + ETH_HLEN);
                        if (!(iph->frag_off &
-                               htons(IP_MF|IP_OFFSET))) {
+                               cpu_to_be16(IP_MF|IP_OFFSET))) {
                                skb->ip_summed = CHECKSUM_UNNECESSARY;
                                netif_printk(qdev, rx_status, KERN_DEBUG,
                                             qdev->ndev,
@@ -1577,12 +1583,17 @@ static void ql_process_mac_rx_page(struct ql_adapter *qdev,
        }
 
        skb_record_rx_queue(skb, rx_ring->cq_id);
-       if (vlan_id != 0xffff)
-               __vlan_hwaccel_put_tag(skb, vlan_id);
-       if (skb->ip_summed == CHECKSUM_UNNECESSARY)
-               napi_gro_receive(napi, skb);
-       else
-               netif_receive_skb(skb);
+       if (skb->ip_summed == CHECKSUM_UNNECESSARY) {
+               if (qdev->vlgrp && (vlan_id != 0xffff))
+                       vlan_gro_receive(napi, qdev->vlgrp, vlan_id, skb);
+               else
+                       napi_gro_receive(napi, skb);
+       } else {
+               if (qdev->vlgrp && (vlan_id != 0xffff))
+                       vlan_hwaccel_receive_skb(skb, qdev->vlgrp, vlan_id);
+               else
+                       netif_receive_skb(skb);
+       }
        return;
 err_out:
        dev_kfree_skb_any(skb);
@@ -1631,6 +1642,7 @@ static void ql_process_mac_rx_skb(struct ql_adapter *qdev,
        }
 
        prefetch(skb->data);
+       skb->dev = ndev;
        if (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK) {
                netif_printk(qdev, rx_status, KERN_DEBUG, qdev->ndev,
                             "%s Multicast.\n",
@@ -1664,8 +1676,7 @@ static void ql_process_mac_rx_skb(struct ql_adapter *qdev,
                                (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_V4)) {
                        /* Unfragmented ipv4 UDP frame. */
                        struct iphdr *iph = (struct iphdr *) skb->data;
-                       if (!(iph->frag_off &
-                               htons(IP_MF|IP_OFFSET))) {
+                       if (!(iph->frag_off & htons(IP_MF|IP_OFFSET))) {
                                skb->ip_summed = CHECKSUM_UNNECESSARY;
                                netif_printk(qdev, rx_status, KERN_DEBUG,
                                             qdev->ndev,
@@ -1675,12 +1686,18 @@ static void ql_process_mac_rx_skb(struct ql_adapter *qdev,
        }
 
        skb_record_rx_queue(skb, rx_ring->cq_id);
-       if (vlan_id != 0xffff)
-               __vlan_hwaccel_put_tag(skb, vlan_id);
-       if (skb->ip_summed == CHECKSUM_UNNECESSARY)
-               napi_gro_receive(&rx_ring->napi, skb);
-       else
-               netif_receive_skb(skb);
+       if (skb->ip_summed == CHECKSUM_UNNECESSARY) {
+               if (qdev->vlgrp && (vlan_id != 0xffff))
+                       vlan_gro_receive(&rx_ring->napi, qdev->vlgrp,
+                                               vlan_id, skb);
+               else
+                       napi_gro_receive(&rx_ring->napi, skb);
+       } else {
+               if (qdev->vlgrp && (vlan_id != 0xffff))
+                       vlan_hwaccel_receive_skb(skb, qdev->vlgrp, vlan_id);
+               else
+                       netif_receive_skb(skb);
+       }
 }
 
 static void ql_realign_skb(struct sk_buff *skb, int len)
@@ -1936,6 +1953,7 @@ static void ql_process_mac_split_rx_intr(struct ql_adapter *qdev,
        }
 
        prefetch(skb->data);
+       skb->dev = ndev;
        if (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK) {
                netif_printk(qdev, rx_status, KERN_DEBUG, qdev->ndev, "%s Multicast.\n",
                             (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK) ==
@@ -1968,8 +1986,7 @@ static void ql_process_mac_split_rx_intr(struct ql_adapter *qdev,
                                (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_V4)) {
                /* Unfragmented ipv4 UDP frame. */
                        struct iphdr *iph = (struct iphdr *) skb->data;
-                       if (!(iph->frag_off &
-                               htons(IP_MF|IP_OFFSET))) {
+                       if (!(iph->frag_off & htons(IP_MF|IP_OFFSET))) {
                                skb->ip_summed = CHECKSUM_UNNECESSARY;
                                netif_printk(qdev, rx_status, KERN_DEBUG, qdev->ndev,
                                             "TCP checksum done!\n");
@@ -1980,12 +1997,22 @@ static void ql_process_mac_split_rx_intr(struct ql_adapter *qdev,
        rx_ring->rx_packets++;
        rx_ring->rx_bytes += skb->len;
        skb_record_rx_queue(skb, rx_ring->cq_id);
-       if ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V) && (vlan_id != 0))
-               __vlan_hwaccel_put_tag(skb, vlan_id);
-       if (skb->ip_summed == CHECKSUM_UNNECESSARY)
-               napi_gro_receive(&rx_ring->napi, skb);
-       else
-               netif_receive_skb(skb);
+       if (skb->ip_summed == CHECKSUM_UNNECESSARY) {
+               if (qdev->vlgrp &&
+                       (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V) &&
+                       (vlan_id != 0))
+                       vlan_gro_receive(&rx_ring->napi, qdev->vlgrp,
+                               vlan_id, skb);
+               else
+                       napi_gro_receive(&rx_ring->napi, skb);
+       } else {
+               if (qdev->vlgrp &&
+                       (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V) &&
+                       (vlan_id != 0))
+                       vlan_hwaccel_receive_skb(skb, qdev->vlgrp, vlan_id);
+               else
+                       netif_receive_skb(skb);
+       }
 }
 
 /* Process an inbound completion from an rx ring. */
@@ -2281,119 +2308,67 @@ static int ql_napi_poll_msix(struct napi_struct *napi, int budget)
        return work_done;
 }
 
-static void qlge_vlan_mode(struct net_device *ndev, netdev_features_t features)
+static void qlge_vlan_rx_register(struct net_device *ndev, struct vlan_group *grp)
 {
        struct ql_adapter *qdev = netdev_priv(ndev);
 
-       if (features & NETIF_F_HW_VLAN_RX) {
+       qdev->vlgrp = grp;
+       if (grp) {
                ql_write32(qdev, NIC_RCV_CFG, NIC_RCV_CFG_VLAN_MASK |
-                                NIC_RCV_CFG_VLAN_MATCH_AND_NON);
+                          NIC_RCV_CFG_VLAN_MATCH_AND_NON);
        } else {
                ql_write32(qdev, NIC_RCV_CFG, NIC_RCV_CFG_VLAN_MASK);
        }
 }
 
-static netdev_features_t qlge_fix_features(struct net_device *ndev,
-       netdev_features_t features)
-{
-       /*
-        * Since there is no support for separate rx/tx vlan accel
-        * enable/disable make sure tx flag is always in same state as rx.
-        */
-       if (features & NETIF_F_HW_VLAN_RX)
-               features |= NETIF_F_HW_VLAN_TX;
-       else
-               features &= ~NETIF_F_HW_VLAN_TX;
-
-       return features;
-}
-
-static int qlge_set_features(struct net_device *ndev,
-       netdev_features_t features)
-{
-       netdev_features_t changed = ndev->features ^ features;
-
-       if (changed & NETIF_F_HW_VLAN_RX)
-               qlge_vlan_mode(ndev, features);
-
-       return 0;
-}
-
-static int __qlge_vlan_rx_add_vid(struct ql_adapter *qdev, u16 vid)
-{
-       u32 enable_bit = MAC_ADDR_E;
-       int err;
-
-       err = ql_set_mac_addr_reg(qdev, (u8 *) &enable_bit,
-                                 MAC_ADDR_TYPE_VLAN, vid);
-       if (err)
-               netif_err(qdev, ifup, qdev->ndev,
-                         "Failed to init vlan address.\n");
-       return err;
-}
-
-static int qlge_vlan_rx_add_vid(struct net_device *ndev, u16 vid)
+static void qlge_vlan_rx_add_vid(struct net_device *ndev, u16 vid)
 {
        struct ql_adapter *qdev = netdev_priv(ndev);
+       u32 enable_bit = MAC_ADDR_E;
        int status;
-       int err;
 
        status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
        if (status)
-               return status;
-
-       err = __qlge_vlan_rx_add_vid(qdev, vid);
-       set_bit(vid, qdev->active_vlans);
-
-       ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
-
-       return err;
-}
-
-static int __qlge_vlan_rx_kill_vid(struct ql_adapter *qdev, u16 vid)
-{
-       u32 enable_bit = 0;
-       int err;
-
-       err = ql_set_mac_addr_reg(qdev, (u8 *) &enable_bit,
-                                 MAC_ADDR_TYPE_VLAN, vid);
-       if (err)
+               return;
+       if (ql_set_mac_addr_reg
+           (qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) {
                netif_err(qdev, ifup, qdev->ndev,
-                         "Failed to clear vlan address.\n");
-       return err;
+                         "Failed to init vlan address.\n");
+       }
+       ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
 }
 
-static int qlge_vlan_rx_kill_vid(struct net_device *ndev, u16 vid)
+static void qlge_vlan_rx_kill_vid(struct net_device *ndev, u16 vid)
 {
        struct ql_adapter *qdev = netdev_priv(ndev);
+       u32 enable_bit = 0;
        int status;
-       int err;
 
        status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
        if (status)
-               return status;
-
-       err = __qlge_vlan_rx_kill_vid(qdev, vid);
-       clear_bit(vid, qdev->active_vlans);
+               return;
 
+       if (ql_set_mac_addr_reg
+           (qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) {
+               netif_err(qdev, ifup, qdev->ndev,
+                         "Failed to clear vlan address.\n");
+       }
        ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
 
-       return err;
 }
 
 static void qlge_restore_vlan(struct ql_adapter *qdev)
 {
-       int status;
-       u16 vid;
-
-       status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
-       if (status)
-               return;
+       qlge_vlan_rx_register(qdev->ndev, qdev->vlgrp);
 
-       for_each_set_bit(vid, qdev->active_vlans, VLAN_N_VID)
-               __qlge_vlan_rx_add_vid(qdev, vid);
-
-       ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
+       if (qdev->vlgrp) {
+               u16 vid;
+               for (vid = 0; vid < VLAN_N_VID; vid++) {
+                       if (!vlan_group_get_device(qdev->vlgrp, vid))
+                               continue;
+                       qlge_vlan_rx_add_vid(qdev->ndev, vid);
+               }
+       }
 }
 
 /* MSI-X Multiple Vector Interrupt Handler for inbound completions. */
@@ -3101,7 +3076,7 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring)
        if (rx_ring->lbq_len) {
                cqicb->flags |= FLAGS_LL;       /* Load lbq values */
                tmp = (u64)rx_ring->lbq_base_dma;
-               base_indirect_ptr = rx_ring->lbq_base_indirect;
+               base_indirect_ptr = (__le64 *) rx_ring->lbq_base_indirect;
                page_entries = 0;
                do {
                        *base_indirect_ptr = cpu_to_le64(tmp);
@@ -3125,7 +3100,7 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring)
        if (rx_ring->sbq_len) {
                cqicb->flags |= FLAGS_LS;       /* Load sbq values */
                tmp = (u64)rx_ring->sbq_base_dma;
-               base_indirect_ptr = rx_ring->sbq_base_indirect;
+               base_indirect_ptr = (__le64 *) rx_ring->sbq_base_indirect;
                page_entries = 0;
                do {
                        *base_indirect_ptr = cpu_to_le64(tmp);
@@ -3861,7 +3836,7 @@ static int ql_wol(struct ql_adapter *qdev)
        if (qdev->wol & (WAKE_ARP | WAKE_MAGICSECURE | WAKE_PHY | WAKE_UCAST |
                        WAKE_MCAST | WAKE_BCAST)) {
                netif_err(qdev, ifdown, qdev->ndev,
-                         "Unsupported WOL parameter. qdev->wol = 0x%x.\n",
+                         "Unsupported WOL paramter. qdev->wol = 0x%x.\n",
                          qdev->wol);
                return -EINVAL;
        }
@@ -4632,12 +4607,11 @@ static const struct net_device_ops qlge_netdev_ops = {
        .ndo_start_xmit         = qlge_send,
        .ndo_change_mtu         = qlge_change_mtu,
        .ndo_get_stats          = qlge_get_stats,
-       .ndo_set_rx_mode        = qlge_set_multicast_list,
+       .ndo_set_multicast_list = qlge_set_multicast_list,
        .ndo_set_mac_address    = qlge_set_mac_address,
        .ndo_validate_addr      = eth_validate_addr,
        .ndo_tx_timeout         = qlge_tx_timeout,
-       .ndo_fix_features       = qlge_fix_features,
-       .ndo_set_features       = qlge_set_features,
+       .ndo_vlan_rx_register   = qlge_vlan_rx_register,
        .ndo_vlan_rx_add_vid    = qlge_vlan_rx_add_vid,
        .ndo_vlan_rx_kill_vid   = qlge_vlan_rx_kill_vid,
 };
@@ -4665,7 +4639,7 @@ static int __devinit qlge_probe(struct pci_dev *pdev,
        int err = 0;
 
        ndev = alloc_etherdev_mq(sizeof(struct ql_adapter),
-                       min(MAX_CPUS, netif_get_num_default_rss_queues()));
+                       min(MAX_CPUS, (int)num_online_cpus()));
        if (!ndev)
                return -ENOMEM;
 
@@ -4682,7 +4656,6 @@ static int __devinit qlge_probe(struct pci_dev *pdev,
                NETIF_F_HW_VLAN_TX | NETIF_F_RXCSUM;
        ndev->features = ndev->hw_features |
                NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER;
-       ndev->vlan_features = ndev->hw_features;
 
        if (test_bit(QL_DMA64, &qdev->flags))
                ndev->features |= NETIF_F_HIGHDMA;
@@ -4847,7 +4820,7 @@ static void qlge_io_resume(struct pci_dev *pdev)
        netif_device_attach(ndev);
 }
 
-static const struct pci_error_handlers qlge_err_handler = {
+static struct pci_error_handlers qlge_err_handler = {
        .error_detected = qlge_io_error_detected,
        .slot_reset = qlge_io_slot_reset,
        .resume = qlge_io_resume,