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