18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/*** -*- linux-c -*- ********************************************************** 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci Driver for Atmel at76c502 at76c504 and at76c506 wireless cards. 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci Copyright 2004 Simon Kelley. 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci******************************************************************************/ 108c2ecf20Sopenharmony_ci#include <linux/pci.h> 118c2ecf20Sopenharmony_ci#include <linux/kernel.h> 128c2ecf20Sopenharmony_ci#include <linux/module.h> 138c2ecf20Sopenharmony_ci#include <linux/netdevice.h> 148c2ecf20Sopenharmony_ci#include "atmel.h" 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ciMODULE_AUTHOR("Simon Kelley"); 178c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards."); 188c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 198c2ecf20Sopenharmony_ciMODULE_SUPPORTED_DEVICE("Atmel at76c506 PCI wireless cards"); 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cistatic const struct pci_device_id card_ids[] = { 228c2ecf20Sopenharmony_ci { 0x1114, 0x0506, PCI_ANY_ID, PCI_ANY_ID }, 238c2ecf20Sopenharmony_ci { 0, } 248c2ecf20Sopenharmony_ci}; 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(pci, card_ids); 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistatic int atmel_pci_probe(struct pci_dev *, const struct pci_device_id *); 298c2ecf20Sopenharmony_cistatic void atmel_pci_remove(struct pci_dev *); 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic struct pci_driver atmel_driver = { 328c2ecf20Sopenharmony_ci .name = "atmel", 338c2ecf20Sopenharmony_ci .id_table = card_ids, 348c2ecf20Sopenharmony_ci .probe = atmel_pci_probe, 358c2ecf20Sopenharmony_ci .remove = atmel_pci_remove, 368c2ecf20Sopenharmony_ci}; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cistatic int atmel_pci_probe(struct pci_dev *pdev, 408c2ecf20Sopenharmony_ci const struct pci_device_id *pent) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci struct net_device *dev; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci if (pci_enable_device(pdev)) 458c2ecf20Sopenharmony_ci return -ENODEV; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci pci_set_master(pdev); 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci dev = init_atmel_card(pdev->irq, pdev->resource[1].start, 508c2ecf20Sopenharmony_ci ATMEL_FW_TYPE_506, 518c2ecf20Sopenharmony_ci &pdev->dev, NULL, NULL); 528c2ecf20Sopenharmony_ci if (!dev) { 538c2ecf20Sopenharmony_ci pci_disable_device(pdev); 548c2ecf20Sopenharmony_ci return -ENODEV; 558c2ecf20Sopenharmony_ci } 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci pci_set_drvdata(pdev, dev); 588c2ecf20Sopenharmony_ci return 0; 598c2ecf20Sopenharmony_ci} 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cistatic void atmel_pci_remove(struct pci_dev *pdev) 628c2ecf20Sopenharmony_ci{ 638c2ecf20Sopenharmony_ci stop_atmel_card(pci_get_drvdata(pdev)); 648c2ecf20Sopenharmony_ci} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_cimodule_pci_driver(atmel_driver); 67