Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  1/*** -*- linux-c -*- **********************************************************
  2
  3     Driver for Atmel at76c502 at76c504 and at76c506 wireless cards.
  4
  5        Copyright 2000-2001 ATMEL Corporation.
  6        Copyright 2003 Simon Kelley.
  7
  8    This code was developed from version 2.1.1 of the Atmel drivers,
  9    released by Atmel corp. under the GPL in December 2002. It also
 10    includes code from the Linux aironet drivers (C) Benjamin Reed,
 11    and the Linux PCMCIA package, (C) David Hinds.
 12
 13    For all queries about this code, please contact the current author,
 14    Simon Kelley <simon@thekelleys.org.uk> and not Atmel Corporation.
 15
 16    This program is free software; you can redistribute it and/or modify
 17    it under the terms of the GNU General Public License as published by
 18    the Free Software Foundation; either version 2 of the License, or
 19    (at your option) any later version.
 20
 21    This software is distributed in the hope that it will be useful,
 22    but WITHOUT ANY WARRANTY; without even the implied warranty of
 23    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 24    GNU General Public License for more details.
 25
 26    You should have received a copy of the GNU General Public License
 27    along with Atmel wireless lan drivers; if not, see
 28    <http://www.gnu.org/licenses/>.
 29
 30******************************************************************************/
 31
 32#ifdef __IN_PCMCIA_PACKAGE__
 33#include <pcmcia/k_compat.h>
 34#endif
 35#include <linux/kernel.h>
 36#include <linux/module.h>
 37#include <linux/ptrace.h>
 38#include <linux/slab.h>
 39#include <linux/string.h>
 40#include <linux/netdevice.h>
 41#include <linux/moduleparam.h>
 42#include <linux/device.h>
 43
 44#include <pcmcia/cistpl.h>
 45#include <pcmcia/cisreg.h>
 46#include <pcmcia/ds.h>
 47#include <pcmcia/ciscode.h>
 48
 49#include <asm/io.h>
 50#include <linux/wireless.h>
 51
 52#include "atmel.h"
 53
 54
 55/*====================================================================*/
 56
 57MODULE_AUTHOR("Simon Kelley");
 58MODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards.");
 59MODULE_LICENSE("GPL");
 60MODULE_SUPPORTED_DEVICE("Atmel at76c50x PCMCIA cards");
 61
 62/*====================================================================*/
 63
 64static int atmel_config(struct pcmcia_device *link);
 65static void atmel_release(struct pcmcia_device *link);
 66
 67static void atmel_detach(struct pcmcia_device *p_dev);
 68
 69typedef struct local_info_t {
 70	struct net_device *eth_dev;
 71} local_info_t;
 72
 73static int atmel_probe(struct pcmcia_device *p_dev)
 74{
 75	local_info_t *local;
 76
 77	dev_dbg(&p_dev->dev, "atmel_attach()\n");
 78
 79	/* Allocate space for private device-specific data */
 80	local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
 81	if (!local)
 82		return -ENOMEM;
 83
 84	p_dev->priv = local;
 85
 86	return atmel_config(p_dev);
 87} /* atmel_attach */
 88
 89static void atmel_detach(struct pcmcia_device *link)
 90{
 91	dev_dbg(&link->dev, "atmel_detach\n");
 92
 93	atmel_release(link);
 94
 95	kfree(link->priv);
 96}
 97
 98/* Call-back function to interrogate PCMCIA-specific information
 99   about the current existence of the card */
100static int card_present(void *arg)
101{
102	struct pcmcia_device *link = (struct pcmcia_device *)arg;
103
104	if (pcmcia_dev_present(link))
105		return 1;
106
107	return 0;
108}
109
110static int atmel_config_check(struct pcmcia_device *p_dev, void *priv_data)
111{
112	if (p_dev->config_index == 0)
113		return -EINVAL;
114
115	return pcmcia_request_io(p_dev);
116}
117
118static int atmel_config(struct pcmcia_device *link)
119{
120	local_info_t *dev;
121	int ret;
122	const struct pcmcia_device_id *did;
123
124	dev = link->priv;
125	did = dev_get_drvdata(&link->dev);
126
127	dev_dbg(&link->dev, "atmel_config\n");
128
129	link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP |
130		CONF_AUTO_AUDIO | CONF_AUTO_SET_IO;
131
132	if (pcmcia_loop_config(link, atmel_config_check, NULL))
133		goto failed;
134
135	if (!link->irq) {
136		dev_err(&link->dev, "atmel: cannot assign IRQ: check that CONFIG_ISA is set in kernel config.");
137		goto failed;
138	}
139
140	ret = pcmcia_enable_device(link);
141	if (ret)
142		goto failed;
143
144	((local_info_t*)link->priv)->eth_dev =
145		init_atmel_card(link->irq,
146				link->resource[0]->start,
147				did ? did->driver_info : ATMEL_FW_TYPE_NONE,
148				&link->dev,
149				card_present,
150				link);
151	if (!((local_info_t*)link->priv)->eth_dev)
152			goto failed;
153
154
155	return 0;
156
157 failed:
158	atmel_release(link);
159	return -ENODEV;
160}
161
162static void atmel_release(struct pcmcia_device *link)
163{
164	struct net_device *dev = ((local_info_t*)link->priv)->eth_dev;
165
166	dev_dbg(&link->dev, "atmel_release\n");
167
168	if (dev)
169		stop_atmel_card(dev);
170	((local_info_t*)link->priv)->eth_dev = NULL;
171
172	pcmcia_disable_device(link);
173}
174
175static int atmel_suspend(struct pcmcia_device *link)
176{
177	local_info_t *local = link->priv;
178
179	netif_device_detach(local->eth_dev);
180
181	return 0;
182}
183
184static int atmel_resume(struct pcmcia_device *link)
185{
186	local_info_t *local = link->priv;
187
188	atmel_open(local->eth_dev);
189	netif_device_attach(local->eth_dev);
190
191	return 0;
192}
193
194/*====================================================================*/
195/* We use the driver_info field to store the correct firmware type for a card. */
196
197#define PCMCIA_DEVICE_MANF_CARD_INFO(manf, card, info) { \
198	.match_flags = PCMCIA_DEV_ID_MATCH_MANF_ID| \
199			PCMCIA_DEV_ID_MATCH_CARD_ID, \
200	.manf_id = (manf), \
201	.card_id = (card), \
202        .driver_info = (kernel_ulong_t)(info), }
203
204#define PCMCIA_DEVICE_PROD_ID12_INFO(v1, v2, vh1, vh2, info) { \
205	.match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \
206			PCMCIA_DEV_ID_MATCH_PROD_ID2, \
207	.prod_id = { (v1), (v2), NULL, NULL }, \
208	.prod_id_hash = { (vh1), (vh2), 0, 0 }, \
209        .driver_info = (kernel_ulong_t)(info), }
210
211static const struct pcmcia_device_id atmel_ids[] = {
212	PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0620, ATMEL_FW_TYPE_502_3COM),
213	PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0696, ATMEL_FW_TYPE_502_3COM),
214	PCMCIA_DEVICE_MANF_CARD_INFO(0x01bf, 0x3302, ATMEL_FW_TYPE_502E),
215	PCMCIA_DEVICE_MANF_CARD_INFO(0xd601, 0x0007, ATMEL_FW_TYPE_502),
216	PCMCIA_DEVICE_PROD_ID12_INFO("11WAVE", "11WP611AL-E", 0x9eb2da1f, 0xc9a0d3f9, ATMEL_FW_TYPE_502E),
217	PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR", 0xabda4164, 0x41b37e1f, ATMEL_FW_TYPE_502),
218	PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR_D", 0xabda4164, 0x3675d704, ATMEL_FW_TYPE_502D),
219	PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR_E", 0xabda4164, 0x4172e792, ATMEL_FW_TYPE_502E),
220	PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504_R", 0xabda4164, 0x917f3d72, ATMEL_FW_TYPE_504_2958),
221	PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504", 0xabda4164, 0x5040670a, ATMEL_FW_TYPE_504),
222	PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504A", 0xabda4164, 0xe15ed87f, ATMEL_FW_TYPE_504A_2958),
223	PCMCIA_DEVICE_PROD_ID12_INFO("BT", "Voyager 1020 Laptop Adapter", 0xae49b86a, 0x1e957cd5, ATMEL_FW_TYPE_502),
224	PCMCIA_DEVICE_PROD_ID12_INFO("CNet", "CNWLC 11Mbps Wireless PC Card V-5", 0xbc477dde, 0x502fae6b, ATMEL_FW_TYPE_502E),
225	PCMCIA_DEVICE_PROD_ID12_INFO("IEEE 802.11b", "Wireless LAN PC Card", 0x5b878724, 0x122f1df6, ATMEL_FW_TYPE_502),
226	PCMCIA_DEVICE_PROD_ID12_INFO("IEEE 802.11b", "Wireless LAN Card S", 0x5b878724, 0x5fba533a, ATMEL_FW_TYPE_504_2958),
227	PCMCIA_DEVICE_PROD_ID12_INFO("OEM", "11Mbps Wireless LAN PC Card V-3", 0xfea54c90, 0x1c5b0f68, ATMEL_FW_TYPE_502),
228	PCMCIA_DEVICE_PROD_ID12_INFO("SMC", "2632W", 0xc4f8b18b, 0x30f38774, ATMEL_FW_TYPE_502D),
229	PCMCIA_DEVICE_PROD_ID12_INFO("SMC", "2632W-V2", 0xc4f8b18b, 0x172d1377, ATMEL_FW_TYPE_502),
230	PCMCIA_DEVICE_PROD_ID12_INFO("Wireless", "PC_CARD", 0xa407ecdd, 0x119f6314, ATMEL_FW_TYPE_502D),
231	PCMCIA_DEVICE_PROD_ID12_INFO("WLAN", "802.11b PC CARD", 0x575c516c, 0xb1f6dbc4, ATMEL_FW_TYPE_502D),
232	PCMCIA_DEVICE_PROD_ID12_INFO("LG", "LW2100N", 0xb474d43a, 0x6b1fec94, ATMEL_FW_TYPE_502E),
233	PCMCIA_DEVICE_NULL
234};
235
236MODULE_DEVICE_TABLE(pcmcia, atmel_ids);
237
238static struct pcmcia_driver atmel_driver = {
239	.owner		= THIS_MODULE,
240	.name		= "atmel_cs",
241	.probe          = atmel_probe,
242	.remove		= atmel_detach,
243	.id_table	= atmel_ids,
244	.suspend	= atmel_suspend,
245	.resume		= atmel_resume,
246};
247module_pcmcia_driver(atmel_driver);
248
249/*
250    This program is free software; you can redistribute it and/or
251    modify it under the terms of the GNU General Public License
252    as published by the Free Software Foundation; either version 2
253    of the License, or (at your option) any later version.
254
255    This program is distributed in the hope that it will be useful,
256    but WITHOUT ANY WARRANTY; without even the implied warranty of
257    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
258    GNU General Public License for more details.
259
260    In addition:
261
262    Redistribution and use in source and binary forms, with or without
263    modification, are permitted provided that the following conditions
264    are met:
265
266    1. Redistributions of source code must retain the above copyright
267       notice, this list of conditions and the following disclaimer.
268    2. Redistributions in binary form must reproduce the above copyright
269       notice, this list of conditions and the following disclaimer in the
270       documentation and/or other materials provided with the distribution.
271    3. The name of the author may not be used to endorse or promote
272       products derived from this software without specific prior written
273       permission.
274
275    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
276    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
277    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
278    ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
279    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
280    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
281    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
282    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
283    STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
284    IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
285    POSSIBILITY OF SUCH DAMAGE.
286*/