Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

staging: qlge: Initialize devlink health dump framework

Initialize devlink health dump framework for the qlge driver so the
coredump could be done via devlink.

struct qlge_adapter is now used as the private data structure of
struct devlink so it could exist independently of struct net_device
and devlink reload could be supported in the future. The private data
of PCIe driver now points to qlge_adapter.

Since devlink_alloc will zero out struct qlge_adapter, memset in
qlge_init_device is not necessary.

Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
Link: https://lore.kernel.org/r/20210123104613.38359-3-coiby.xu@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Coiby Xu and committed by
Greg Kroah-Hartman
953b9400 f8c047be

+151 -66
+1
drivers/staging/qlge/Kconfig
··· 3 3 config QLGE 4 4 tristate "QLogic QLGE 10Gb Ethernet Driver Support" 5 5 depends on ETHERNET && PCI 6 + select NET_DEVLINK 6 7 help 7 8 This driver supports QLogic ISP8XXX 10Gb Ethernet cards. 8 9
+1 -1
drivers/staging/qlge/Makefile
··· 5 5 6 6 obj-$(CONFIG_QLGE) += qlge.o 7 7 8 - qlge-objs := qlge_main.o qlge_dbg.o qlge_mpi.o qlge_ethtool.o 8 + qlge-objs := qlge_main.o qlge_dbg.o qlge_mpi.o qlge_ethtool.o qlge_devlink.o
+13
drivers/staging/qlge/qlge.h
··· 2060 2060 int (*port_initialize)(struct qlge_adapter *qdev); 2061 2061 }; 2062 2062 2063 + struct qlge_netdev_priv { 2064 + struct qlge_adapter *qdev; 2065 + struct net_device *ndev; 2066 + }; 2067 + 2068 + static inline 2069 + struct qlge_adapter *netdev_to_qdev(struct net_device *ndev) 2070 + { 2071 + struct qlge_netdev_priv *ndev_priv = netdev_priv(ndev); 2072 + 2073 + return ndev_priv->qdev; 2074 + } 2063 2075 /* 2064 2076 * The main Adapter structure definition. 2065 2077 * This structure has all fields relevant to the hardware. ··· 2089 2077 struct pci_dev *pdev; 2090 2078 struct net_device *ndev; /* Parent NET device */ 2091 2079 2080 + struct devlink_health_reporter *reporter; 2092 2081 /* Hardware information */ 2093 2082 u32 chip_rev_id; 2094 2083 u32 fw_rev_id;
+31
drivers/staging/qlge/qlge_devlink.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + #include "qlge.h" 3 + #include "qlge_devlink.h" 4 + 5 + static int 6 + qlge_reporter_coredump(struct devlink_health_reporter *reporter, 7 + struct devlink_fmsg *fmsg, void *priv_ctx, 8 + struct netlink_ext_ack *extack) 9 + { 10 + return 0; 11 + } 12 + 13 + static const struct devlink_health_reporter_ops qlge_reporter_ops = { 14 + .name = "dummy", 15 + .dump = qlge_reporter_coredump, 16 + }; 17 + 18 + void qlge_health_create_reporters(struct qlge_adapter *priv) 19 + { 20 + struct devlink_health_reporter *reporter; 21 + struct devlink *devlink; 22 + 23 + devlink = priv_to_devlink(priv); 24 + priv->reporter = 25 + devlink_health_reporter_create(devlink, &qlge_reporter_ops, 26 + 0, priv); 27 + if (IS_ERR(priv->reporter)) 28 + netdev_warn(priv->ndev, 29 + "Failed to create reporter, err = %ld\n", 30 + PTR_ERR(reporter)); 31 + }
+9
drivers/staging/qlge/qlge_devlink.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 + #ifndef QLGE_DEVLINK_H 3 + #define QLGE_DEVLINK_H 4 + 5 + #include <net/devlink.h> 6 + 7 + void qlge_health_create_reporters(struct qlge_adapter *priv); 8 + 9 + #endif /* QLGE_DEVLINK_H */
+18 -18
drivers/staging/qlge/qlge_ethtool.c
··· 366 366 qlge_get_ethtool_stats(struct net_device *ndev, 367 367 struct ethtool_stats *stats, u64 *data) 368 368 { 369 - struct qlge_adapter *qdev = netdev_priv(ndev); 369 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 370 370 int index, length; 371 371 372 372 length = QLGE_STATS_LEN; ··· 383 383 static int qlge_get_link_ksettings(struct net_device *ndev, 384 384 struct ethtool_link_ksettings *ecmd) 385 385 { 386 - struct qlge_adapter *qdev = netdev_priv(ndev); 386 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 387 387 u32 supported, advertising; 388 388 389 389 supported = SUPPORTED_10000baseT_Full; ··· 415 415 static void qlge_get_drvinfo(struct net_device *ndev, 416 416 struct ethtool_drvinfo *drvinfo) 417 417 { 418 - struct qlge_adapter *qdev = netdev_priv(ndev); 418 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 419 419 420 420 strlcpy(drvinfo->driver, qlge_driver_name, sizeof(drvinfo->driver)); 421 421 strlcpy(drvinfo->version, qlge_driver_version, ··· 431 431 432 432 static void qlge_get_wol(struct net_device *ndev, struct ethtool_wolinfo *wol) 433 433 { 434 - struct qlge_adapter *qdev = netdev_priv(ndev); 434 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 435 435 unsigned short ssys_dev = qdev->pdev->subsystem_device; 436 436 437 437 /* WOL is only supported for mezz card. */ ··· 444 444 445 445 static int qlge_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol) 446 446 { 447 - struct qlge_adapter *qdev = netdev_priv(ndev); 447 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 448 448 unsigned short ssys_dev = qdev->pdev->subsystem_device; 449 449 450 450 /* WOL is only supported for mezz card. */ ··· 466 466 enum ethtool_phys_id_state state) 467 467 468 468 { 469 - struct qlge_adapter *qdev = netdev_priv(ndev); 469 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 470 470 471 471 switch (state) { 472 472 case ETHTOOL_ID_ACTIVE: ··· 574 574 static void qlge_self_test(struct net_device *ndev, 575 575 struct ethtool_test *eth_test, u64 *data) 576 576 { 577 - struct qlge_adapter *qdev = netdev_priv(ndev); 577 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 578 578 579 579 memset(data, 0, sizeof(u64) * QLGE_TEST_LEN); 580 580 ··· 603 603 604 604 static int qlge_get_regs_len(struct net_device *ndev) 605 605 { 606 - struct qlge_adapter *qdev = netdev_priv(ndev); 606 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 607 607 608 608 if (!test_bit(QL_FRC_COREDUMP, &qdev->flags)) 609 609 return sizeof(struct qlge_mpi_coredump); ··· 614 614 static void qlge_get_regs(struct net_device *ndev, 615 615 struct ethtool_regs *regs, void *p) 616 616 { 617 - struct qlge_adapter *qdev = netdev_priv(ndev); 617 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 618 618 619 619 qlge_get_dump(qdev, p); 620 620 qdev->core_is_dumped = 0; ··· 624 624 regs->len = sizeof(struct qlge_reg_dump); 625 625 } 626 626 627 - static int qlge_get_coalesce(struct net_device *dev, struct ethtool_coalesce *c) 627 + static int qlge_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *c) 628 628 { 629 - struct qlge_adapter *qdev = netdev_priv(dev); 629 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 630 630 631 631 c->rx_coalesce_usecs = qdev->rx_coalesce_usecs; 632 632 c->tx_coalesce_usecs = qdev->tx_coalesce_usecs; ··· 649 649 650 650 static int qlge_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *c) 651 651 { 652 - struct qlge_adapter *qdev = netdev_priv(ndev); 652 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 653 653 654 654 /* Validate user parameters. */ 655 655 if (c->rx_coalesce_usecs > qdev->rx_ring_size / 2) ··· 677 677 return qlge_update_ring_coalescing(qdev); 678 678 } 679 679 680 - static void qlge_get_pauseparam(struct net_device *netdev, 680 + static void qlge_get_pauseparam(struct net_device *ndev, 681 681 struct ethtool_pauseparam *pause) 682 682 { 683 - struct qlge_adapter *qdev = netdev_priv(netdev); 683 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 684 684 685 685 qlge_mb_get_port_cfg(qdev); 686 686 if (qdev->link_config & CFG_PAUSE_STD) { ··· 689 689 } 690 690 } 691 691 692 - static int qlge_set_pauseparam(struct net_device *netdev, 692 + static int qlge_set_pauseparam(struct net_device *ndev, 693 693 struct ethtool_pauseparam *pause) 694 694 { 695 - struct qlge_adapter *qdev = netdev_priv(netdev); 695 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 696 696 697 697 if ((pause->rx_pause) && (pause->tx_pause)) 698 698 qdev->link_config |= CFG_PAUSE_STD; ··· 706 706 707 707 static u32 qlge_get_msglevel(struct net_device *ndev) 708 708 { 709 - struct qlge_adapter *qdev = netdev_priv(ndev); 709 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 710 710 711 711 return qdev->msg_enable; 712 712 } 713 713 714 714 static void qlge_set_msglevel(struct net_device *ndev, u32 value) 715 715 { 716 - struct qlge_adapter *qdev = netdev_priv(ndev); 716 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 717 717 718 718 qdev->msg_enable = value; 719 719 }
+78 -47
drivers/staging/qlge/qlge_main.c
··· 42 42 #include <net/ip6_checksum.h> 43 43 44 44 #include "qlge.h" 45 + #include "qlge_devlink.h" 45 46 46 47 char qlge_driver_name[] = DRV_NAME; 47 48 const char qlge_driver_version[] = DRV_VERSION; ··· 2230 2229 2231 2230 static void qlge_vlan_mode(struct net_device *ndev, netdev_features_t features) 2232 2231 { 2233 - struct qlge_adapter *qdev = netdev_priv(ndev); 2232 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 2234 2233 2235 2234 if (features & NETIF_F_HW_VLAN_CTAG_RX) { 2236 2235 qlge_write32(qdev, NIC_RCV_CFG, NIC_RCV_CFG_VLAN_MASK | ··· 2247 2246 static int qlge_update_hw_vlan_features(struct net_device *ndev, 2248 2247 netdev_features_t features) 2249 2248 { 2250 - struct qlge_adapter *qdev = netdev_priv(ndev); 2251 - int status = 0; 2249 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 2252 2250 bool need_restart = netif_running(ndev); 2251 + int status = 0; 2253 2252 2254 2253 if (need_restart) { 2255 2254 status = qlge_adapter_down(qdev); ··· 2308 2307 2309 2308 static int qlge_vlan_rx_add_vid(struct net_device *ndev, __be16 proto, u16 vid) 2310 2309 { 2311 - struct qlge_adapter *qdev = netdev_priv(ndev); 2310 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 2312 2311 int status; 2313 2312 int err; 2314 2313 ··· 2339 2338 2340 2339 static int qlge_vlan_rx_kill_vid(struct net_device *ndev, __be16 proto, u16 vid) 2341 2340 { 2342 - struct qlge_adapter *qdev = netdev_priv(ndev); 2341 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 2343 2342 int status; 2344 2343 int err; 2345 2344 ··· 2532 2531 2533 2532 static netdev_tx_t qlge_send(struct sk_buff *skb, struct net_device *ndev) 2534 2533 { 2535 - struct tx_ring_desc *tx_ring_desc; 2534 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 2536 2535 struct qlge_ob_mac_iocb_req *mac_iocb_ptr; 2537 - struct qlge_adapter *qdev = netdev_priv(ndev); 2536 + struct tx_ring_desc *tx_ring_desc; 2538 2537 int tso; 2539 2538 struct tx_ring *tx_ring; 2540 2539 u32 tx_ring_idx = (u32)skb->queue_mapping; ··· 3729 3728 3730 3729 static void qlge_display_dev_info(struct net_device *ndev) 3731 3730 { 3732 - struct qlge_adapter *qdev = netdev_priv(ndev); 3731 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 3733 3732 3734 3733 netif_info(qdev, probe, qdev->ndev, 3735 3734 "Function #%d, Port %d, NIC Roll %d, NIC Rev = %d, XG Roll = %d, XG Rev = %d.\n", ··· 3887 3886 3888 3887 static int qlge_close(struct net_device *ndev) 3889 3888 { 3890 - struct qlge_adapter *qdev = netdev_priv(ndev); 3889 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 3891 3890 int i; 3892 3891 3893 3892 /* If we hit pci_channel_io_perm_failure ··· 3994 3993 3995 3994 static int qlge_open(struct net_device *ndev) 3996 3995 { 3996 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 3997 3997 int err = 0; 3998 - struct qlge_adapter *qdev = netdev_priv(ndev); 3999 3998 4000 3999 err = qlge_adapter_reset(qdev); 4001 4000 if (err) ··· 4063 4062 4064 4063 static int qlge_change_mtu(struct net_device *ndev, int new_mtu) 4065 4064 { 4066 - struct qlge_adapter *qdev = netdev_priv(ndev); 4065 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 4067 4066 int status; 4068 4067 4069 4068 if (ndev->mtu == 1500 && new_mtu == 9000) ··· 4093 4092 static struct net_device_stats *qlge_get_stats(struct net_device 4094 4093 *ndev) 4095 4094 { 4096 - struct qlge_adapter *qdev = netdev_priv(ndev); 4095 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 4097 4096 struct rx_ring *rx_ring = &qdev->rx_ring[0]; 4098 4097 struct tx_ring *tx_ring = &qdev->tx_ring[0]; 4099 4098 unsigned long pkts, mcast, dropped, errors, bytes; ··· 4129 4128 4130 4129 static void qlge_set_multicast_list(struct net_device *ndev) 4131 4130 { 4132 - struct qlge_adapter *qdev = netdev_priv(ndev); 4131 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 4133 4132 struct netdev_hw_addr *ha; 4134 4133 int i, status; 4135 4134 ··· 4219 4218 4220 4219 static int qlge_set_mac_address(struct net_device *ndev, void *p) 4221 4220 { 4222 - struct qlge_adapter *qdev = netdev_priv(ndev); 4221 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 4223 4222 struct sockaddr *addr = p; 4224 4223 int status; 4225 4224 ··· 4243 4242 4244 4243 static void qlge_tx_timeout(struct net_device *ndev, unsigned int txqueue) 4245 4244 { 4246 - struct qlge_adapter *qdev = netdev_priv(ndev); 4245 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 4247 4246 4248 4247 qlge_queue_asic_error(qdev); 4249 4248 } ··· 4360 4359 4361 4360 static void qlge_release_all(struct pci_dev *pdev) 4362 4361 { 4363 - struct net_device *ndev = pci_get_drvdata(pdev); 4364 - struct qlge_adapter *qdev = netdev_priv(ndev); 4362 + struct qlge_adapter *qdev = pci_get_drvdata(pdev); 4365 4363 4366 4364 if (qdev->workqueue) { 4367 4365 destroy_workqueue(qdev->workqueue); ··· 4375 4375 pci_release_regions(pdev); 4376 4376 } 4377 4377 4378 - static int qlge_init_device(struct pci_dev *pdev, struct net_device *ndev, 4378 + static int qlge_init_device(struct pci_dev *pdev, struct qlge_adapter *qdev, 4379 4379 int cards_found) 4380 4380 { 4381 - struct qlge_adapter *qdev = netdev_priv(ndev); 4381 + struct net_device *ndev = qdev->ndev; 4382 4382 int err = 0; 4383 4383 4384 - memset((void *)qdev, 0, sizeof(*qdev)); 4385 4384 err = pci_enable_device(pdev); 4386 4385 if (err) { 4387 4386 dev_err(&pdev->dev, "PCI device enable failed.\n"); 4388 4387 return err; 4389 4388 } 4390 4389 4391 - qdev->ndev = ndev; 4392 4390 qdev->pdev = pdev; 4393 - pci_set_drvdata(pdev, ndev); 4391 + pci_set_drvdata(pdev, qdev); 4394 4392 4395 4393 /* Set PCIe read request size */ 4396 4394 err = pcie_set_readrq(pdev, 4096); ··· 4539 4541 mod_timer(&qdev->timer, jiffies + (5 * HZ)); 4540 4542 } 4541 4543 4544 + static const struct devlink_ops qlge_devlink_ops; 4545 + 4542 4546 static int qlge_probe(struct pci_dev *pdev, 4543 4547 const struct pci_device_id *pci_entry) 4544 4548 { 4545 - struct net_device *ndev = NULL; 4549 + struct qlge_netdev_priv *ndev_priv; 4546 4550 struct qlge_adapter *qdev = NULL; 4551 + struct net_device *ndev = NULL; 4552 + struct devlink *devlink; 4547 4553 static int cards_found; 4548 4554 int err = 0; 4549 4555 4550 - ndev = alloc_etherdev_mq(sizeof(struct qlge_adapter), 4556 + devlink = devlink_alloc(&qlge_devlink_ops, sizeof(struct qlge_adapter)); 4557 + if (!devlink) 4558 + return -ENOMEM; 4559 + 4560 + qdev = devlink_priv(devlink); 4561 + 4562 + ndev = alloc_etherdev_mq(sizeof(struct qlge_netdev_priv), 4551 4563 min(MAX_CPUS, 4552 4564 netif_get_num_default_rss_queues())); 4553 4565 if (!ndev) 4554 - return -ENOMEM; 4566 + goto devlink_free; 4555 4567 4556 - err = qlge_init_device(pdev, ndev, cards_found); 4557 - if (err < 0) { 4558 - free_netdev(ndev); 4559 - return err; 4560 - } 4568 + ndev_priv = netdev_priv(ndev); 4569 + ndev_priv->qdev = qdev; 4570 + ndev_priv->ndev = ndev; 4571 + qdev->ndev = ndev; 4572 + err = qlge_init_device(pdev, qdev, cards_found); 4573 + if (err < 0) 4574 + goto netdev_free; 4561 4575 4562 - qdev = netdev_priv(ndev); 4563 4576 SET_NETDEV_DEV(ndev, &pdev->dev); 4564 4577 ndev->hw_features = NETIF_F_SG | 4565 4578 NETIF_F_IP_CSUM | ··· 4612 4603 dev_err(&pdev->dev, "net device registration failed.\n"); 4613 4604 qlge_release_all(pdev); 4614 4605 pci_disable_device(pdev); 4615 - free_netdev(ndev); 4616 - return err; 4606 + goto netdev_free; 4617 4607 } 4608 + 4609 + err = devlink_register(devlink, &pdev->dev); 4610 + if (err) 4611 + goto netdev_free; 4612 + 4613 + qlge_health_create_reporters(qdev); 4618 4614 /* Start up the timer to trigger EEH if 4619 4615 * the bus goes dead 4620 4616 */ ··· 4630 4616 atomic_set(&qdev->lb_count, 0); 4631 4617 cards_found++; 4632 4618 return 0; 4619 + 4620 + netdev_free: 4621 + free_netdev(ndev); 4622 + devlink_free: 4623 + devlink_free(devlink); 4624 + 4625 + return err; 4633 4626 } 4634 4627 4635 4628 netdev_tx_t qlge_lb_send(struct sk_buff *skb, struct net_device *ndev) ··· 4651 4630 4652 4631 static void qlge_remove(struct pci_dev *pdev) 4653 4632 { 4654 - struct net_device *ndev = pci_get_drvdata(pdev); 4655 - struct qlge_adapter *qdev = netdev_priv(ndev); 4633 + struct qlge_adapter *qdev = pci_get_drvdata(pdev); 4634 + struct net_device *ndev = qdev->ndev; 4635 + struct devlink *devlink = priv_to_devlink(qdev); 4656 4636 4657 4637 del_timer_sync(&qdev->timer); 4658 4638 qlge_cancel_all_work_sync(qdev); 4659 4639 unregister_netdev(ndev); 4660 4640 qlge_release_all(pdev); 4661 4641 pci_disable_device(pdev); 4642 + devlink_health_reporter_destroy(qdev->reporter); 4643 + devlink_unregister(devlink); 4644 + devlink_free(devlink); 4662 4645 free_netdev(ndev); 4663 4646 } 4664 4647 4665 4648 /* Clean up resources without touching hardware. */ 4666 4649 static void qlge_eeh_close(struct net_device *ndev) 4667 4650 { 4651 + struct qlge_adapter *qdev = netdev_to_qdev(ndev); 4668 4652 int i; 4669 - struct qlge_adapter *qdev = netdev_priv(ndev); 4670 4653 4671 4654 if (netif_carrier_ok(ndev)) { 4672 4655 netif_carrier_off(ndev); ··· 4696 4671 static pci_ers_result_t qlge_io_error_detected(struct pci_dev *pdev, 4697 4672 pci_channel_state_t state) 4698 4673 { 4699 - struct net_device *ndev = pci_get_drvdata(pdev); 4700 - struct qlge_adapter *qdev = netdev_priv(ndev); 4674 + struct qlge_adapter *qdev = pci_get_drvdata(pdev); 4675 + struct net_device *ndev = qdev->ndev; 4701 4676 4702 4677 switch (state) { 4703 4678 case pci_channel_io_normal: ··· 4730 4705 */ 4731 4706 static pci_ers_result_t qlge_io_slot_reset(struct pci_dev *pdev) 4732 4707 { 4733 - struct net_device *ndev = pci_get_drvdata(pdev); 4734 - struct qlge_adapter *qdev = netdev_priv(ndev); 4708 + struct qlge_adapter *qdev = pci_get_drvdata(pdev); 4735 4709 4736 4710 pdev->error_state = pci_channel_io_normal; 4737 4711 ··· 4753 4729 4754 4730 static void qlge_io_resume(struct pci_dev *pdev) 4755 4731 { 4756 - struct net_device *ndev = pci_get_drvdata(pdev); 4757 - struct qlge_adapter *qdev = netdev_priv(ndev); 4732 + struct qlge_adapter *qdev = pci_get_drvdata(pdev); 4733 + struct net_device *ndev = qdev->ndev; 4758 4734 int err = 0; 4759 4735 4760 4736 if (netif_running(ndev)) { ··· 4780 4756 4781 4757 static int __maybe_unused qlge_suspend(struct device *dev_d) 4782 4758 { 4783 - struct net_device *ndev = dev_get_drvdata(dev_d); 4784 - struct qlge_adapter *qdev = netdev_priv(ndev); 4759 + struct pci_dev *pdev = to_pci_dev(dev_d); 4760 + struct qlge_adapter *qdev; 4761 + struct net_device *ndev; 4785 4762 int err; 4786 4763 4764 + qdev = pci_get_drvdata(pdev); 4765 + ndev = qdev->ndev; 4787 4766 netif_device_detach(ndev); 4788 4767 del_timer_sync(&qdev->timer); 4789 4768 ··· 4803 4776 4804 4777 static int __maybe_unused qlge_resume(struct device *dev_d) 4805 4778 { 4806 - struct net_device *ndev = dev_get_drvdata(dev_d); 4807 - struct qlge_adapter *qdev = netdev_priv(ndev); 4779 + struct pci_dev *pdev = to_pci_dev(dev_d); 4780 + struct qlge_adapter *qdev; 4781 + struct net_device *ndev; 4808 4782 int err; 4809 4783 4810 - pci_set_master(to_pci_dev(dev_d)); 4784 + qdev = pci_get_drvdata(pdev); 4785 + ndev = qdev->ndev; 4786 + 4787 + pci_set_master(pdev); 4811 4788 4812 4789 device_wakeup_disable(dev_d); 4813 4790