11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*** -*- linux-c -*- ********************************************************** 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Driver for Atmel at76c502 at76c504 and at76c506 wireless cards. 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Copyright 2004 Simon Kelley. 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds This program is free software; you can redistribute it and/or modify 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds it under the terms of the GNU General Public License as published by 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds the Free Software Foundation; either version 2 of the License, or 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (at your option) any later version. 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds This software is distributed in the hope that it will be useful, 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds but WITHOUT ANY WARRANTY; without even the implied warranty of 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GNU General Public License for more details. 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds You should have received a copy of the GNU General Public License 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds along with Atmel wireless lan drivers; if not, write to the Free Software 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds******************************************************************************/ 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h> 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h> 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/netdevice.h> 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "atmel.h" 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Simon Kelley"); 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards."); 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_SUPPORTED_DEVICE("Atmel at76c506 PCI wireless cards"); 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 34a3aa18842a5303fc28fcc4d57dbd16618bd830a0Alexey Dobriyanstatic DEFINE_PCI_DEVICE_TABLE(card_ids) = { 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0x1114, 0x0506, PCI_ANY_ID, PCI_ANY_ID }, 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 0, } 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(pci, card_ids); 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int atmel_pci_probe(struct pci_dev *, const struct pci_device_id *); 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void atmel_pci_remove(struct pci_dev *); 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct pci_driver atmel_driver = { 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "atmel", 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id_table = card_ids, 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .probe = atmel_pci_probe, 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .remove = __devexit_p(atmel_pci_remove), 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit atmel_pci_probe(struct pci_dev *pdev, 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const struct pci_device_id *pent) 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct net_device *dev; 565c877fe58c5df19646204b144b978b99c2ef074fDmitry Torokhov 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (pci_enable_device(pdev)) 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENODEV; 595c877fe58c5df19646204b144b978b99c2ef074fDmitry Torokhov 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_set_master(pdev); 615c877fe58c5df19646204b144b978b99c2ef074fDmitry Torokhov 625c877fe58c5df19646204b144b978b99c2ef074fDmitry Torokhov dev = init_atmel_card(pdev->irq, pdev->resource[1].start, 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ATMEL_FW_TYPE_506, 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds &pdev->dev, NULL, NULL); 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!dev) 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENODEV; 675c877fe58c5df19646204b144b978b99c2ef074fDmitry Torokhov 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_set_drvdata(pdev, dev); 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __devexit atmel_pci_remove(struct pci_dev *pdev) 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 74b16a228d05a95b27d77d07a91688382f68ece8a7Simon Kelley stop_atmel_card(pci_get_drvdata(pdev)); 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init atmel_init_module(void) 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 79299176206b266f204be859adf9e66efd06628ab2Jeff Garzik return pci_register_driver(&atmel_driver); 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit atmel_cleanup_module(void) 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pci_unregister_driver(&atmel_driver); 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(atmel_init_module); 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(atmel_cleanup_module); 89