1 /*=============================================================================
3 * A PCMCIA client driver for the Raylink wireless LAN card.
4 * The starting point for this module was the skeleton.c in the
5 * PCMCIA 2.9.12 package written by David Hinds, dahinds@users.sourceforge.net
8 * Copyright (c) 1998 Corey Thomas (corey@world.std.com)
10 * This driver is free software; you can redistribute it and/or modify
11 * it under the terms of version 2 only of the GNU General Public License as
12 * published by the Free Software Foundation.
14 * It is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
24 * Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 08/08/2000
25 * - reorganize kmallocs in ray_attach, checking all for failure
26 * and releasing the previous allocations if one fails
28 * Daniele Bellucci <bellucda@tiscali.it> - 07/10/2003
29 * - Audit copy_to_user in ioctl(SIOCGIWESSID)
31 =============================================================================*/
33 #include <linux/config.h>
34 #include <linux/module.h>
35 #include <linux/kernel.h>
36 #include <linux/proc_fs.h>
37 #include <linux/ptrace.h>
38 #include <linux/slab.h>
39 #include <linux/string.h>
40 #include <linux/timer.h>
41 #include <linux/init.h>
42 #include <linux/netdevice.h>
43 #include <linux/etherdevice.h>
44 #include <linux/if_arp.h>
45 #include <linux/ioport.h>
46 #include <linux/skbuff.h>
47 #include <linux/ethtool.h>
49 #include <pcmcia/version.h>
50 #include <pcmcia/cs_types.h>
51 #include <pcmcia/cs.h>
52 #include <pcmcia/cistpl.h>
53 #include <pcmcia/cisreg.h>
54 #include <pcmcia/ds.h>
55 #include <pcmcia/mem_op.h>
57 #include <linux/wireless.h>
60 #include <asm/system.h>
61 #include <asm/byteorder.h>
62 #include <asm/uaccess.h>
64 /* Warning : these stuff will slow down the driver... */
65 #define WIRELESS_SPY /* Enable spying addresses */
66 /* Definitions we need for spy */
67 typedef struct iw_statistics iw_stats
;
68 typedef struct iw_quality iw_qual
;
69 typedef u_char mac_addr
[ETH_ALEN
]; /* Hardware address */
74 /* All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If
75 you do not define PCMCIA_DEBUG at all, all the debug code will be
76 left out. If you compile with PCMCIA_DEBUG=0, the debug code will
77 be present but disabled -- but it can then be enabled for specific
78 modules at load time with a 'pc_debug=#' option to insmod.
82 #define PCMCIA_DEBUG RAYLINK_DEBUG
86 static int pc_debug
= PCMCIA_DEBUG
;
87 MODULE_PARM(pc_debug
, "i");
88 /* #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args); */
89 #define DEBUG(n, args...) if (pc_debug>(n)) printk(args);
91 #define DEBUG(n, args...)
93 /** Prototypes based on PCMCIA skeleton driver *******************************/
94 static void ray_config(dev_link_t
*link
);
95 static void ray_release(dev_link_t
*link
);
96 static int ray_event(event_t event
, int priority
, event_callback_args_t
*args
);
97 static dev_link_t
*ray_attach(void);
98 static void ray_detach(dev_link_t
*);
100 /***** Prototypes indicated by device structure ******************************/
101 static int ray_dev_close(struct net_device
*dev
);
102 static int ray_dev_config(struct net_device
*dev
, struct ifmap
*map
);
103 static struct net_device_stats
*ray_get_stats(struct net_device
*dev
);
104 static int ray_dev_init(struct net_device
*dev
);
105 static int ray_dev_ioctl(struct net_device
*dev
, struct ifreq
*ifr
, int cmd
);
107 static struct ethtool_ops netdev_ethtool_ops
;
109 static int ray_open(struct net_device
*dev
);
110 static int ray_dev_start_xmit(struct sk_buff
*skb
, struct net_device
*dev
);
111 static void set_multicast_list(struct net_device
*dev
);
112 static void ray_update_multi_list(struct net_device
*dev
, int all
);
113 static int translate_frame(ray_dev_t
*local
, struct tx_msg __iomem
*ptx
,
114 unsigned char *data
, int len
);
115 static void ray_build_header(ray_dev_t
*local
, struct tx_msg __iomem
*ptx
, UCHAR msg_type
,
116 unsigned char *data
);
117 static void untranslate(ray_dev_t
*local
, struct sk_buff
*skb
, int len
);
118 #if WIRELESS_EXT > 7 /* If wireless extension exist in the kernel */
119 static iw_stats
* ray_get_wireless_stats(struct net_device
* dev
);
120 #endif /* WIRELESS_EXT > 7 */
122 /***** Prototypes for raylink functions **************************************/
123 static int asc_to_int(char a
);
124 static void authenticate(ray_dev_t
*local
);
125 static int build_auth_frame(ray_dev_t
*local
, UCHAR
*dest
, int auth_type
);
126 static void authenticate_timeout(u_long
);
127 static int get_free_ccs(ray_dev_t
*local
);
128 static int get_free_tx_ccs(ray_dev_t
*local
);
129 static void init_startup_params(ray_dev_t
*local
);
130 static int parse_addr(char *in_str
, UCHAR
*out
);
131 static int ray_hw_xmit(unsigned char* data
, int len
, struct net_device
* dev
, UCHAR type
);
132 static int ray_init(struct net_device
*dev
);
133 static int interrupt_ecf(ray_dev_t
*local
, int ccs
);
134 static void ray_reset(struct net_device
*dev
);
135 static void ray_update_parm(struct net_device
*dev
, UCHAR objid
, UCHAR
*value
, int len
);
136 static void verify_dl_startup(u_long
);
138 /* Prototypes for interrpt time functions **********************************/
139 static irqreturn_t
ray_interrupt (int reg
, void *dev_id
, struct pt_regs
*regs
);
140 static void clear_interrupt(ray_dev_t
*local
);
141 static void rx_deauthenticate(ray_dev_t
*local
, struct rcs __iomem
*prcs
,
142 unsigned int pkt_addr
, int rx_len
);
143 static int copy_from_rx_buff(ray_dev_t
*local
, UCHAR
*dest
, int pkt_addr
, int len
);
144 static void ray_rx(struct net_device
*dev
, ray_dev_t
*local
, struct rcs __iomem
*prcs
);
145 static void release_frag_chain(ray_dev_t
*local
, struct rcs __iomem
*prcs
);
146 static void rx_authenticate(ray_dev_t
*local
, struct rcs __iomem
*prcs
,
147 unsigned int pkt_addr
, int rx_len
);
148 static void rx_data(struct net_device
*dev
, struct rcs __iomem
*prcs
, unsigned int pkt_addr
,
150 static void associate(ray_dev_t
*local
);
152 /* Card command functions */
153 static int dl_startup_params(struct net_device
*dev
);
154 static void join_net(u_long local
);
155 static void start_net(u_long local
);
156 /* void start_net(ray_dev_t *local); */
158 /* Create symbol table for registering with kernel in init_module */
159 EXPORT_SYMBOL(ray_dev_ioctl
);
160 EXPORT_SYMBOL(ray_rx
);
162 /*===========================================================================*/
163 /* Parameters that can be set with 'insmod' */
164 /* Bit map of interrupts to choose from */
165 /* This means pick from 15, 14, 12, 11, 10, 9, 7, 5, 4, and 3 */
166 static u_long irq_mask
= 0xdeb8;
168 /* ADHOC=0, Infrastructure=1 */
169 static int net_type
= ADHOC
;
171 /* Hop dwell time in Kus (1024 us units defined by 802.11) */
172 static int hop_dwell
= 128;
174 /* Beacon period in Kus */
175 static int beacon_period
= 256;
177 /* power save mode (0 = off, 1 = save power) */
180 /* String for network's Extended Service Set ID. 32 Characters max */
183 /* Default to encapsulation unless translation requested */
184 static int translate
= 1;
186 static int country
= USA
;
192 /* 48 bit physical card address if overriding card's real physical
193 * address is required. Since IEEE 802.11 addresses are 48 bits
194 * like ethernet, an int can't be used, so a string is used. To
195 * allow use of addresses starting with a decimal digit, the first
196 * character must be a letter and will be ignored. This letter is
197 * followed by up to 12 hex digits which are the address. If less
198 * than 12 digits are used, the address will be left filled with 0's.
199 * Note that bit 0 of the first byte is the broadcast bit, and evil
200 * things will happen if it is not 0 in a card address.
202 static char *phy_addr
= NULL
;
205 /* The dev_info variable is the "key" that is used to match up this
206 device driver with appropriate cards, through the card configuration
209 static dev_info_t dev_info
= "ray_cs";
211 /* A linked list of "instances" of the ray device. Each actual
212 PCMCIA card corresponds to one device instance, and is described
213 by one dev_link_t structure (defined in ds.h).
215 static dev_link_t
*dev_list
= NULL
;
217 /* A dev_link_t structure has fields for most things that are needed
218 to keep track of a socket, but there will usually be some device
219 specific information that also needs to be kept track of. The
220 'priv' pointer in a dev_link_t structure can be used to point to
221 a device-specific private data structure, like this.
223 static unsigned int ray_mem_speed
= 500;
225 MODULE_AUTHOR("Corey Thomas <corey@world.std.com>");
226 MODULE_DESCRIPTION("Raylink/WebGear wireless LAN driver");
227 MODULE_LICENSE("GPL");
229 MODULE_PARM(irq_mask
,"i");
230 MODULE_PARM(net_type
,"i");
231 MODULE_PARM(hop_dwell
,"i");
232 MODULE_PARM(beacon_period
,"i");
233 MODULE_PARM(psm
,"i");
234 MODULE_PARM(essid
,"s");
235 MODULE_PARM(translate
,"i");
236 MODULE_PARM(country
,"i");
237 MODULE_PARM(sniffer
,"i");
239 MODULE_PARM(phy_addr
,"s");
240 MODULE_PARM(ray_mem_speed
, "i");
242 static UCHAR b5_default_startup_parms
[] = {
243 0, 0, /* Adhoc station */
244 'L','I','N','U','X', 0, 0, 0, /* 32 char ESSID */
245 0, 0, 0, 0, 0, 0, 0, 0,
246 0, 0, 0, 0, 0, 0, 0, 0,
247 0, 0, 0, 0, 0, 0, 0, 0,
248 1, 0, /* Active scan, CA Mode */
249 0, 0, 0, 0, 0, 0, /* No default MAC addr */
250 0x7f, 0xff, /* Frag threshold */
251 0x00, 0x80, /* Hop time 128 Kus*/
252 0x01, 0x00, /* Beacon period 256 Kus */
253 0x01, 0x07, 0xa3, /* DTIM, retries, ack timeout*/
254 0x1d, 0x82, 0x4e, /* SIFS, DIFS, PIFS */
255 0x7f, 0xff, /* RTS threshold */
256 0x04, 0xe2, 0x38, 0xA4, /* scan_dwell, max_scan_dwell */
257 0x05, /* assoc resp timeout thresh */
258 0x08, 0x02, 0x08, /* adhoc, infra, super cycle max*/
259 0, /* Promiscuous mode */
260 0x0c, 0x0bd, /* Unique word */
261 0x32, /* Slot time */
262 0xff, 0xff, /* roam-low snr, low snr count */
263 0x05, 0xff, /* Infra, adhoc missed bcn thresh */
264 0x01, 0x0b, 0x4f, /* USA, hop pattern, hop pat length */
265 /* b4 - b5 differences start here */
266 0x00, 0x3f, /* CW max */
267 0x00, 0x0f, /* CW min */
268 0x04, 0x08, /* Noise gain, limit offset */
269 0x28, 0x28, /* det rssi, med busy offsets */
270 7, /* det sync thresh */
271 0, 2, 2, /* test mode, min, max */
272 0, /* allow broadcast SSID probe resp */
273 0, 0, /* privacy must start, can join */
274 2, 0, 0, 0, 0, 0, 0, 0 /* basic rate set */
277 static UCHAR b4_default_startup_parms
[] = {
278 0, 0, /* Adhoc station */
279 'L','I','N','U','X', 0, 0, 0, /* 32 char ESSID */
280 0, 0, 0, 0, 0, 0, 0, 0,
281 0, 0, 0, 0, 0, 0, 0, 0,
282 0, 0, 0, 0, 0, 0, 0, 0,
283 1, 0, /* Active scan, CA Mode */
284 0, 0, 0, 0, 0, 0, /* No default MAC addr */
285 0x7f, 0xff, /* Frag threshold */
286 0x02, 0x00, /* Hop time */
287 0x00, 0x01, /* Beacon period */
288 0x01, 0x07, 0xa3, /* DTIM, retries, ack timeout*/
289 0x1d, 0x82, 0xce, /* SIFS, DIFS, PIFS */
290 0x7f, 0xff, /* RTS threshold */
291 0xfb, 0x1e, 0xc7, 0x5c, /* scan_dwell, max_scan_dwell */
292 0x05, /* assoc resp timeout thresh */
293 0x04, 0x02, 0x4, /* adhoc, infra, super cycle max*/
294 0, /* Promiscuous mode */
295 0x0c, 0x0bd, /* Unique word */
296 0x4e, /* Slot time (TBD seems wrong)*/
297 0xff, 0xff, /* roam-low snr, low snr count */
298 0x05, 0xff, /* Infra, adhoc missed bcn thresh */
299 0x01, 0x0b, 0x4e, /* USA, hop pattern, hop pat length */
300 /* b4 - b5 differences start here */
301 0x3f, 0x0f, /* CW max, min */
302 0x04, 0x08, /* Noise gain, limit offset */
303 0x28, 0x28, /* det rssi, med busy offsets */
304 7, /* det sync thresh */
305 0, 2, 2 /* test mode, min, max*/
307 /*===========================================================================*/
308 static unsigned char eth2_llc
[] = {0xaa, 0xaa, 3, 0, 0, 0};
310 static char hop_pattern_length
[] = { 1,
311 USA_HOP_MOD
, EUROPE_HOP_MOD
,
312 JAPAN_HOP_MOD
, KOREA_HOP_MOD
,
313 SPAIN_HOP_MOD
, FRANCE_HOP_MOD
,
314 ISRAEL_HOP_MOD
, AUSTRALIA_HOP_MOD
,
318 static char rcsid
[] = "Raylink/WebGear wireless LAN - Corey <Thomas corey@world.std.com>";
320 /*=============================================================================
321 ray_attach() creates an "instance" of the driver, allocating
322 local data structures for one device. The device is registered
324 The dev_link structure is initialized, but we don't actually
325 configure the card at this point -- we wait until we receive a
326 card insertion event.
327 =============================================================================*/
328 static dev_link_t
*ray_attach(void)
330 client_reg_t client_reg
;
334 struct net_device
*dev
;
336 DEBUG(1, "ray_attach()\n");
338 /* Initialize the dev_link_t structure */
339 link
= kmalloc(sizeof(struct dev_link_t
), GFP_KERNEL
);
344 /* Allocate space for private device-specific data */
345 dev
= alloc_etherdev(sizeof(ray_dev_t
));
352 memset(link
, 0, sizeof(struct dev_link_t
));
354 /* The io structure describes IO port mapping. None used here */
355 link
->io
.NumPorts1
= 0;
356 link
->io
.Attributes1
= IO_DATA_PATH_WIDTH_8
;
357 link
->io
.IOAddrLines
= 5;
359 /* Interrupt setup. For PCMCIA, driver takes what's given */
360 link
->irq
.Attributes
= IRQ_TYPE_EXCLUSIVE
| IRQ_HANDLE_PRESENT
;
361 link
->irq
.IRQInfo1
= IRQ_INFO2_VALID
| IRQ_LEVEL_ID
;
362 link
->irq
.IRQInfo2
= irq_mask
;
363 link
->irq
.Handler
= &ray_interrupt
;
365 /* General socket configuration */
366 link
->conf
.Attributes
= CONF_ENABLE_IRQ
;
368 link
->conf
.IntType
= INT_MEMORY_AND_IO
;
369 link
->conf
.ConfigIndex
= 1;
370 link
->conf
.Present
= PRESENT_OPTION
;
373 link
->irq
.Instance
= dev
;
375 local
->finder
= link
;
376 local
->card_status
= CARD_INSERTED
;
377 local
->authentication_state
= UNAUTHENTICATED
;
378 local
->num_multi
= 0;
379 DEBUG(2,"ray_attach link = %p, dev = %p, local = %p, intr = %p\n",
380 link
,dev
,local
,&ray_interrupt
);
382 /* Raylink entries in the device structure */
383 dev
->hard_start_xmit
= &ray_dev_start_xmit
;
384 dev
->set_config
= &ray_dev_config
;
385 dev
->get_stats
= &ray_get_stats
;
386 dev
->do_ioctl
= &ray_dev_ioctl
;
387 SET_ETHTOOL_OPS(dev
, &netdev_ethtool_ops
);
388 #if WIRELESS_EXT > 7 /* If wireless extension exist in the kernel */
389 dev
->get_wireless_stats
= ray_get_wireless_stats
;
392 dev
->set_multicast_list
= &set_multicast_list
;
394 DEBUG(2,"ray_cs ray_attach calling ether_setup.)\n");
395 SET_MODULE_OWNER(dev
);
396 dev
->init
= &ray_dev_init
;
397 dev
->open
= &ray_open
;
398 dev
->stop
= &ray_dev_close
;
399 netif_stop_queue(dev
);
401 /* Register with Card Services */
402 link
->next
= dev_list
;
404 client_reg
.dev_info
= &dev_info
;
405 client_reg
.Attributes
= INFO_IO_CLIENT
| INFO_CARD_SHARE
;
406 client_reg
.EventMask
=
407 CS_EVENT_CARD_INSERTION
| CS_EVENT_CARD_REMOVAL
|
408 CS_EVENT_RESET_PHYSICAL
| CS_EVENT_CARD_RESET
|
409 CS_EVENT_PM_SUSPEND
| CS_EVENT_PM_RESUME
;
410 client_reg
.event_handler
= &ray_event
;
411 client_reg
.Version
= 0x0210;
412 client_reg
.event_callback_args
.client_data
= link
;
414 DEBUG(2,"ray_cs ray_attach calling pcmcia_register_client(...)\n");
416 init_timer(&local
->timer
);
418 ret
= pcmcia_register_client(&link
->handle
, &client_reg
);
420 printk("ray_cs ray_attach RegisterClient unhappy - detaching\n");
421 cs_error(link
->handle
, RegisterClient
, ret
);
425 DEBUG(2,"ray_cs ray_attach ending\n");
432 /*=============================================================================
433 This deletes a driver "instance". The device is de-registered
434 with Card Services. If it has been released, all local data
435 structures are freed. Otherwise, the structures will be freed
436 when the device is released.
437 =============================================================================*/
438 static void ray_detach(dev_link_t
*link
)
442 DEBUG(1, "ray_detach(0x%p)\n", link
);
444 /* Locate device structure */
445 for (linkp
= &dev_list
; *linkp
; linkp
= &(*linkp
)->next
)
446 if (*linkp
== link
) break;
450 /* If the device is currently configured and active, we won't
451 actually delete it yet. Instead, it is marked so that when
452 the release() function is called, that will trigger a proper
455 if (link
->state
& DEV_CONFIG
)
458 /* Break the link with Card Services */
460 pcmcia_deregister_client(link
->handle
);
462 /* Unlink device structure, free pieces */
465 struct net_device
*dev
= link
->priv
;
466 if (link
->dev
) unregister_netdev(dev
);
470 DEBUG(2,"ray_cs ray_detach ending\n");
472 /*=============================================================================
473 ray_config() is run after a CARD_INSERTION event
474 is received, to configure the PCMCIA socket, and to make the
475 ethernet device available to the system.
476 =============================================================================*/
477 #define CS_CHECK(fn, ret) \
478 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
479 #define MAX_TUPLE_SIZE 128
480 static void ray_config(dev_link_t
*link
)
482 client_handle_t handle
= link
->handle
;
485 int last_fn
= 0, last_ret
= 0;
487 u_char buf
[MAX_TUPLE_SIZE
];
490 struct net_device
*dev
= (struct net_device
*)link
->priv
;
491 ray_dev_t
*local
= (ray_dev_t
*)dev
->priv
;
493 DEBUG(1, "ray_config(0x%p)\n", link
);
495 /* This reads the card's CONFIG tuple to find its configuration regs */
496 tuple
.DesiredTuple
= CISTPL_CONFIG
;
497 CS_CHECK(GetFirstTuple
, pcmcia_get_first_tuple(handle
, &tuple
));
498 tuple
.TupleData
= buf
;
499 tuple
.TupleDataMax
= MAX_TUPLE_SIZE
;
500 tuple
.TupleOffset
= 0;
501 CS_CHECK(GetTupleData
, pcmcia_get_tuple_data(handle
, &tuple
));
502 CS_CHECK(ParseTuple
, pcmcia_parse_tuple(handle
, &tuple
, &parse
));
503 link
->conf
.ConfigBase
= parse
.config
.base
;
504 link
->conf
.Present
= parse
.config
.rmask
[0];
506 /* Determine card type and firmware version */
507 buf
[0] = buf
[MAX_TUPLE_SIZE
- 1] = 0;
508 tuple
.DesiredTuple
= CISTPL_VERS_1
;
509 CS_CHECK(GetFirstTuple
, pcmcia_get_first_tuple(handle
, &tuple
));
510 tuple
.TupleData
= buf
;
511 tuple
.TupleDataMax
= MAX_TUPLE_SIZE
;
512 tuple
.TupleOffset
= 2;
513 CS_CHECK(GetTupleData
, pcmcia_get_tuple_data(handle
, &tuple
));
515 for (i
=0; i
<tuple
.TupleDataLen
- 4; i
++)
516 if (buf
[i
] == 0) buf
[i
] = ' ';
517 printk(KERN_INFO
"ray_cs Detected: %s\n",buf
);
520 link
->state
|= DEV_CONFIG
;
522 /* Now allocate an interrupt line. Note that this does not
523 actually assign a handler to the interrupt.
525 CS_CHECK(RequestIRQ
, pcmcia_request_irq(link
->handle
, &link
->irq
));
526 dev
->irq
= link
->irq
.AssignedIRQ
;
528 /* This actually configures the PCMCIA socket -- setting up
529 the I/O windows and the interrupt mapping.
531 CS_CHECK(RequestConfiguration
, pcmcia_request_configuration(link
->handle
, &link
->conf
));
533 /*** Set up 32k window for shared memory (transmit and control) ************/
534 req
.Attributes
= WIN_DATA_WIDTH_8
| WIN_MEMORY_TYPE_CM
| WIN_ENABLE
| WIN_USE_WAIT
;
537 req
.AccessSpeed
= ray_mem_speed
;
538 CS_CHECK(RequestWindow
, pcmcia_request_window(&link
->handle
, &req
, &link
->win
));
539 mem
.CardOffset
= 0x0000; mem
.Page
= 0;
540 CS_CHECK(MapMemPage
, pcmcia_map_mem_page(link
->win
, &mem
));
541 local
->sram
= ioremap(req
.Base
,req
.Size
);
543 /*** Set up 16k window for shared memory (receive buffer) ***************/
544 req
.Attributes
= WIN_DATA_WIDTH_8
| WIN_MEMORY_TYPE_CM
| WIN_ENABLE
| WIN_USE_WAIT
;
547 req
.AccessSpeed
= ray_mem_speed
;
548 CS_CHECK(RequestWindow
, pcmcia_request_window(&link
->handle
, &req
, &local
->rmem_handle
));
549 mem
.CardOffset
= 0x8000; mem
.Page
= 0;
550 CS_CHECK(MapMemPage
, pcmcia_map_mem_page(local
->rmem_handle
, &mem
));
551 local
->rmem
= ioremap(req
.Base
,req
.Size
);
553 /*** Set up window for attribute memory ***********************************/
554 req
.Attributes
= WIN_DATA_WIDTH_8
| WIN_MEMORY_TYPE_AM
| WIN_ENABLE
| WIN_USE_WAIT
;
557 req
.AccessSpeed
= ray_mem_speed
;
558 CS_CHECK(RequestWindow
, pcmcia_request_window(&link
->handle
, &req
, &local
->amem_handle
));
559 mem
.CardOffset
= 0x0000; mem
.Page
= 0;
560 CS_CHECK(MapMemPage
, pcmcia_map_mem_page(local
->amem_handle
, &mem
));
561 local
->amem
= ioremap(req
.Base
,req
.Size
);
563 DEBUG(3,"ray_config sram=%p\n",local
->sram
);
564 DEBUG(3,"ray_config rmem=%p\n",local
->rmem
);
565 DEBUG(3,"ray_config amem=%p\n",local
->amem
);
566 if (ray_init(dev
) < 0) {
571 i
= register_netdev(dev
);
573 printk("ray_config register_netdev() failed\n");
578 strcpy(local
->node
.dev_name
, dev
->name
);
579 link
->dev
= &local
->node
;
581 link
->state
&= ~DEV_CONFIG_PENDING
;
582 printk(KERN_INFO
"%s: RayLink, irq %d, hw_addr ",
583 dev
->name
, dev
->irq
);
584 for (i
= 0; i
< 6; i
++)
585 printk("%02X%s", dev
->dev_addr
[i
], ((i
<5) ? ":" : "\n"));
590 cs_error(link
->handle
, last_fn
, last_ret
);
595 static inline struct ccs __iomem
*ccs_base(ray_dev_t
*dev
)
597 return dev
->sram
+ CCS_BASE
;
600 static inline struct rcs __iomem
*rcs_base(ray_dev_t
*dev
)
603 * This looks nonsensical, since there is a separate
604 * RCS_BASE. But the difference between a "struct rcs"
605 * and a "struct ccs" ends up being in the _index_ off
606 * the base, so the base pointer is the same for both
609 return dev
->sram
+ CCS_BASE
;
612 /*===========================================================================*/
613 static int ray_init(struct net_device
*dev
)
617 struct ccs __iomem
*pccs
;
618 ray_dev_t
*local
= (ray_dev_t
*)dev
->priv
;
619 dev_link_t
*link
= local
->finder
;
620 DEBUG(1, "ray_init(0x%p)\n", dev
);
621 if (!(link
->state
& DEV_PRESENT
)) {
622 DEBUG(0,"ray_init - device not present\n");
626 local
->net_type
= net_type
;
627 local
->sta_type
= TYPE_STA
;
629 /* Copy the startup results to local memory */
630 memcpy_fromio(&local
->startup_res
, local
->sram
+ ECF_TO_HOST_BASE
,\
631 sizeof(struct startup_res_6
));
633 /* Check Power up test status and get mac address from card */
634 if (local
->startup_res
.startup_word
!= 0x80) {
635 printk(KERN_INFO
"ray_init ERROR card status = %2x\n",
636 local
->startup_res
.startup_word
);
637 local
->card_status
= CARD_INIT_ERROR
;
641 local
->fw_ver
= local
->startup_res
.firmware_version
[0];
642 local
->fw_bld
= local
->startup_res
.firmware_version
[1];
643 local
->fw_var
= local
->startup_res
.firmware_version
[2];
644 DEBUG(1,"ray_init firmware version %d.%d \n",local
->fw_ver
, local
->fw_bld
);
646 local
->tib_length
= 0x20;
647 if ((local
->fw_ver
== 5) && (local
->fw_bld
>= 30))
648 local
->tib_length
= local
->startup_res
.tib_length
;
649 DEBUG(2,"ray_init tib_length = 0x%02x\n", local
->tib_length
);
650 /* Initialize CCS's to buffer free state */
651 pccs
= ccs_base(local
);
652 for (i
=0; i
<NUMBER_OF_CCS
; i
++) {
653 writeb(CCS_BUFFER_FREE
, &(pccs
++)->buffer_status
);
655 init_startup_params(local
);
657 /* copy mac address to startup parameters */
658 if (parse_addr(phy_addr
, local
->sparm
.b4
.a_mac_addr
))
660 p
= local
->sparm
.b4
.a_mac_addr
;
664 memcpy(&local
->sparm
.b4
.a_mac_addr
,
665 &local
->startup_res
.station_addr
, ADDRLEN
);
666 p
= local
->sparm
.b4
.a_mac_addr
;
669 clear_interrupt(local
); /* Clear any interrupt from the card */
670 local
->card_status
= CARD_AWAITING_PARAM
;
671 DEBUG(2,"ray_init ending\n");
674 /*===========================================================================*/
675 /* Download startup parameters to the card and command it to read them */
676 static int dl_startup_params(struct net_device
*dev
)
679 ray_dev_t
*local
= (ray_dev_t
*)dev
->priv
;
680 struct ccs __iomem
*pccs
;
681 dev_link_t
*link
= local
->finder
;
683 DEBUG(1,"dl_startup_params entered\n");
684 if (!(link
->state
& DEV_PRESENT
)) {
685 DEBUG(2,"ray_cs dl_startup_params - device not present\n");
689 /* Copy parameters to host to ECF area */
690 if (local
->fw_ver
== 0x55)
691 memcpy_toio(local
->sram
+ HOST_TO_ECF_BASE
, &local
->sparm
.b4
,
692 sizeof(struct b4_startup_params
));
694 memcpy_toio(local
->sram
+ HOST_TO_ECF_BASE
, &local
->sparm
.b5
,
695 sizeof(struct b5_startup_params
));
698 /* Fill in the CCS fields for the ECF */
699 if ((ccsindex
= get_free_ccs(local
)) < 0) return -1;
700 local
->dl_param_ccs
= ccsindex
;
701 pccs
= ccs_base(local
) + ccsindex
;
702 writeb(CCS_DOWNLOAD_STARTUP_PARAMS
, &pccs
->cmd
);
703 DEBUG(2,"dl_startup_params start ccsindex = %d\n", local
->dl_param_ccs
);
704 /* Interrupt the firmware to process the command */
705 if (interrupt_ecf(local
, ccsindex
)) {
706 printk(KERN_INFO
"ray dl_startup_params failed - "
707 "ECF not ready for intr\n");
708 local
->card_status
= CARD_DL_PARAM_ERROR
;
709 writeb(CCS_BUFFER_FREE
, &(pccs
++)->buffer_status
);
712 local
->card_status
= CARD_DL_PARAM
;
713 /* Start kernel timer to wait for dl startup to complete. */
714 local
->timer
.expires
= jiffies
+ HZ
/2;
715 local
->timer
.data
= (long)local
;
716 local
->timer
.function
= &verify_dl_startup
;
717 add_timer(&local
->timer
);
718 DEBUG(2,"ray_cs dl_startup_params started timer for verify_dl_startup\n");
720 } /* dl_startup_params */
721 /*===========================================================================*/
722 static void init_startup_params(ray_dev_t
*local
)
726 if (country
> JAPAN_TEST
) country
= USA
;
728 if (country
< USA
) country
= USA
;
729 /* structure for hop time and beacon period is defined here using
730 * New 802.11D6.1 format. Card firmware is still using old format
733 * a_hop_time ms byte a_hop_time ms byte
734 * a_hop_time 2s byte a_hop_time ls byte
735 * a_hop_time ls byte a_beacon_period ms byte
736 * a_beacon_period a_beacon_period ls byte
738 * a_hop_time = uS a_hop_time = KuS
739 * a_beacon_period = hops a_beacon_period = KuS
740 */ /* 64ms = 010000 */
741 if (local
->fw_ver
== 0x55) {
742 memcpy((UCHAR
*)&local
->sparm
.b4
, b4_default_startup_parms
,
743 sizeof(struct b4_startup_params
));
744 /* Translate sane kus input values to old build 4/5 format */
745 /* i = hop time in uS truncated to 3 bytes */
746 i
= (hop_dwell
* 1024) & 0xffffff;
747 local
->sparm
.b4
.a_hop_time
[0] = (i
>> 16) & 0xff;
748 local
->sparm
.b4
.a_hop_time
[1] = (i
>> 8) & 0xff;
749 local
->sparm
.b4
.a_beacon_period
[0] = 0;
750 local
->sparm
.b4
.a_beacon_period
[1] =
751 ((beacon_period
/hop_dwell
) - 1) & 0xff;
752 local
->sparm
.b4
.a_curr_country_code
= country
;
753 local
->sparm
.b4
.a_hop_pattern_length
=
754 hop_pattern_length
[(int)country
] - 1;
757 local
->sparm
.b4
.a_ack_timeout
= 0x50;
758 local
->sparm
.b4
.a_sifs
= 0x3f;
761 else { /* Version 5 uses real kus values */
762 memcpy((UCHAR
*)&local
->sparm
.b5
, b5_default_startup_parms
,
763 sizeof(struct b5_startup_params
));
765 local
->sparm
.b5
.a_hop_time
[0] = (hop_dwell
>> 8) & 0xff;
766 local
->sparm
.b5
.a_hop_time
[1] = hop_dwell
& 0xff;
767 local
->sparm
.b5
.a_beacon_period
[0] = (beacon_period
>> 8) & 0xff;
768 local
->sparm
.b5
.a_beacon_period
[1] = beacon_period
& 0xff;
770 local
->sparm
.b5
.a_power_mgt_state
= 1;
771 local
->sparm
.b5
.a_curr_country_code
= country
;
772 local
->sparm
.b5
.a_hop_pattern_length
=
773 hop_pattern_length
[(int)country
];
776 local
->sparm
.b4
.a_network_type
= net_type
& 0x01;
777 local
->sparm
.b4
.a_acting_as_ap_status
= TYPE_STA
;
780 strncpy(local
->sparm
.b4
.a_current_ess_id
, essid
, ESSID_SIZE
);
781 } /* init_startup_params */
782 /*===========================================================================*/
783 static void verify_dl_startup(u_long data
)
785 ray_dev_t
*local
= (ray_dev_t
*)data
;
786 struct ccs __iomem
*pccs
= ccs_base(local
) + local
->dl_param_ccs
;
788 dev_link_t
*link
= local
->finder
;
790 if (!(link
->state
& DEV_PRESENT
)) {
791 DEBUG(2,"ray_cs verify_dl_startup - device not present\n");
797 printk(KERN_DEBUG
"verify_dl_startup parameters sent via ccs %d:\n",
798 local
->dl_param_ccs
);
799 for (i
=0; i
<sizeof(struct b5_startup_params
); i
++) {
800 printk(" %2x", (unsigned int) readb(local
->sram
+ HOST_TO_ECF_BASE
+ i
));
806 status
= readb(&pccs
->buffer_status
);
807 if (status
!= CCS_BUFFER_FREE
)
809 printk(KERN_INFO
"Download startup params failed. Status = %d\n",
811 local
->card_status
= CARD_DL_PARAM_ERROR
;
814 if (local
->sparm
.b4
.a_network_type
== ADHOC
)
815 start_net((u_long
)local
);
817 join_net((u_long
)local
);
820 } /* end verify_dl_startup */
821 /*===========================================================================*/
822 /* Command card to start a network */
823 static void start_net(u_long data
)
825 ray_dev_t
*local
= (ray_dev_t
*)data
;
826 struct ccs __iomem
*pccs
;
828 dev_link_t
*link
= local
->finder
;
829 if (!(link
->state
& DEV_PRESENT
)) {
830 DEBUG(2,"ray_cs start_net - device not present\n");
833 /* Fill in the CCS fields for the ECF */
834 if ((ccsindex
= get_free_ccs(local
)) < 0) return;
835 pccs
= ccs_base(local
) + ccsindex
;
836 writeb(CCS_START_NETWORK
, &pccs
->cmd
);
837 writeb(0, &pccs
->var
.start_network
.update_param
);
838 /* Interrupt the firmware to process the command */
839 if (interrupt_ecf(local
, ccsindex
)) {
840 DEBUG(1,"ray start net failed - card not ready for intr\n");
841 writeb(CCS_BUFFER_FREE
, &(pccs
++)->buffer_status
);
844 local
->card_status
= CARD_DOING_ACQ
;
846 } /* end start_net */
847 /*===========================================================================*/
848 /* Command card to join a network */
849 static void join_net(u_long data
)
851 ray_dev_t
*local
= (ray_dev_t
*)data
;
853 struct ccs __iomem
*pccs
;
855 dev_link_t
*link
= local
->finder
;
857 if (!(link
->state
& DEV_PRESENT
)) {
858 DEBUG(2,"ray_cs join_net - device not present\n");
861 /* Fill in the CCS fields for the ECF */
862 if ((ccsindex
= get_free_ccs(local
)) < 0) return;
863 pccs
= ccs_base(local
) + ccsindex
;
864 writeb(CCS_JOIN_NETWORK
, &pccs
->cmd
);
865 writeb(0, &pccs
->var
.join_network
.update_param
);
866 writeb(0, &pccs
->var
.join_network
.net_initiated
);
867 /* Interrupt the firmware to process the command */
868 if (interrupt_ecf(local
, ccsindex
)) {
869 DEBUG(1,"ray join net failed - card not ready for intr\n");
870 writeb(CCS_BUFFER_FREE
, &(pccs
++)->buffer_status
);
873 local
->card_status
= CARD_DOING_ACQ
;
876 /*============================================================================
877 After a card is removed, ray_release() will unregister the net
878 device, and release the PCMCIA configuration. If the device is
879 still open, this will be postponed until it is closed.
880 =============================================================================*/
881 static void ray_release(dev_link_t
*link
)
883 struct net_device
*dev
= link
->priv
;
884 ray_dev_t
*local
= dev
->priv
;
887 DEBUG(1, "ray_release(0x%p)\n", link
);
889 del_timer(&local
->timer
);
890 link
->state
&= ~DEV_CONFIG
;
892 iounmap(local
->sram
);
893 iounmap(local
->rmem
);
894 iounmap(local
->amem
);
895 /* Do bother checking to see if these succeed or not */
896 i
= pcmcia_release_window(link
->win
);
897 if ( i
!= CS_SUCCESS
) DEBUG(0,"ReleaseWindow(link->win) ret = %x\n",i
);
898 i
= pcmcia_release_window(local
->amem_handle
);
899 if ( i
!= CS_SUCCESS
) DEBUG(0,"ReleaseWindow(local->amem) ret = %x\n",i
);
900 i
= pcmcia_release_window(local
->rmem_handle
);
901 if ( i
!= CS_SUCCESS
) DEBUG(0,"ReleaseWindow(local->rmem) ret = %x\n",i
);
902 i
= pcmcia_release_configuration(link
->handle
);
903 if ( i
!= CS_SUCCESS
) DEBUG(0,"ReleaseConfiguration ret = %x\n",i
);
904 i
= pcmcia_release_irq(link
->handle
, &link
->irq
);
905 if ( i
!= CS_SUCCESS
) DEBUG(0,"ReleaseIRQ ret = %x\n",i
);
907 DEBUG(2,"ray_release ending\n");
910 /*=============================================================================
911 The card status event handler. Mostly, this schedules other
912 stuff to run after an event is received. A CARD_REMOVAL event
913 also sets some flags to discourage the net drivers from trying
914 to talk to the card any more.
916 When a CARD_REMOVAL event is received, we immediately set a flag
917 to block future accesses to this device. All the functions that
918 actually access the device should check this flag to make sure
919 the card is still present.
920 =============================================================================*/
921 static int ray_event(event_t event
, int priority
,
922 event_callback_args_t
*args
)
924 dev_link_t
*link
= args
->client_data
;
925 struct net_device
*dev
= link
->priv
;
926 ray_dev_t
*local
= (ray_dev_t
*)dev
->priv
;
927 DEBUG(1, "ray_event(0x%06x)\n", event
);
930 case CS_EVENT_CARD_REMOVAL
:
931 link
->state
&= ~DEV_PRESENT
;
932 netif_device_detach(dev
);
933 if (link
->state
& DEV_CONFIG
) {
935 del_timer(&local
->timer
);
938 case CS_EVENT_CARD_INSERTION
:
939 link
->state
|= DEV_PRESENT
| DEV_CONFIG_PENDING
;
942 case CS_EVENT_PM_SUSPEND
:
943 link
->state
|= DEV_SUSPEND
;
944 /* Fall through... */
945 case CS_EVENT_RESET_PHYSICAL
:
946 if (link
->state
& DEV_CONFIG
) {
948 netif_device_detach(dev
);
950 pcmcia_release_configuration(link
->handle
);
953 case CS_EVENT_PM_RESUME
:
954 link
->state
&= ~DEV_SUSPEND
;
955 /* Fall through... */
956 case CS_EVENT_CARD_RESET
:
957 if (link
->state
& DEV_CONFIG
) {
958 pcmcia_request_configuration(link
->handle
, &link
->conf
);
961 netif_device_attach(dev
);
967 DEBUG(2,"ray_event ending\n");
969 /*===========================================================================*/
970 int ray_dev_init(struct net_device
*dev
)
972 #ifdef RAY_IMMEDIATE_INIT
974 #endif /* RAY_IMMEDIATE_INIT */
975 ray_dev_t
*local
= dev
->priv
;
976 dev_link_t
*link
= local
->finder
;
978 DEBUG(1,"ray_dev_init(dev=%p)\n",dev
);
979 if (!(link
->state
& DEV_PRESENT
)) {
980 DEBUG(2,"ray_dev_init - device not present\n");
983 #ifdef RAY_IMMEDIATE_INIT
984 /* Download startup parameters */
985 if ( (i
= dl_startup_params(dev
)) < 0)
987 printk(KERN_INFO
"ray_dev_init dl_startup_params failed - "
991 #else /* RAY_IMMEDIATE_INIT */
992 /* Postpone the card init so that we can still configure the card,
993 * for example using the Wireless Extensions. The init will happen
994 * in ray_open() - Jean II */
995 DEBUG(1,"ray_dev_init: postponing card init to ray_open() ; Status = %d\n",
997 #endif /* RAY_IMMEDIATE_INIT */
999 /* copy mac and broadcast addresses to linux device */
1000 memcpy(&dev
->dev_addr
, &local
->sparm
.b4
.a_mac_addr
, ADDRLEN
);
1001 memset(dev
->broadcast
, 0xff, ETH_ALEN
);
1003 DEBUG(2,"ray_dev_init ending\n");
1006 /*===========================================================================*/
1007 static int ray_dev_config(struct net_device
*dev
, struct ifmap
*map
)
1009 ray_dev_t
*local
= dev
->priv
;
1010 dev_link_t
*link
= local
->finder
;
1011 /* Dummy routine to satisfy device structure */
1012 DEBUG(1,"ray_dev_config(dev=%p,ifmap=%p)\n",dev
,map
);
1013 if (!(link
->state
& DEV_PRESENT
)) {
1014 DEBUG(2,"ray_dev_config - device not present\n");
1020 /*===========================================================================*/
1021 static int ray_dev_start_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
1023 ray_dev_t
*local
= dev
->priv
;
1024 dev_link_t
*link
= local
->finder
;
1025 short length
= skb
->len
;
1027 if (!(link
->state
& DEV_PRESENT
)) {
1028 DEBUG(2,"ray_dev_start_xmit - device not present\n");
1031 DEBUG(3,"ray_dev_start_xmit(skb=%p, dev=%p)\n",skb
,dev
);
1032 if (local
->authentication_state
== NEED_TO_AUTH
) {
1033 DEBUG(0,"ray_cs Sending authentication request.\n");
1034 if (!build_auth_frame (local
, local
->auth_id
, OPEN_AUTH_REQUEST
)) {
1035 local
->authentication_state
= AUTHENTICATED
;
1036 netif_stop_queue(dev
);
1041 if (length
< ETH_ZLEN
)
1043 skb
= skb_padto(skb
, ETH_ZLEN
);
1048 switch (ray_hw_xmit( skb
->data
, length
, dev
, DATA_TYPE
)) {
1050 case XMIT_NEED_AUTH
:
1051 netif_stop_queue(dev
);
1057 dev
->trans_start
= jiffies
;
1062 } /* ray_dev_start_xmit */
1063 /*===========================================================================*/
1064 static int ray_hw_xmit(unsigned char* data
, int len
, struct net_device
* dev
,
1067 ray_dev_t
*local
= (ray_dev_t
*)dev
->priv
;
1068 struct ccs __iomem
*pccs
;
1071 struct tx_msg __iomem
*ptx
; /* Address of xmit buffer in PC space */
1072 short int addr
; /* Address of xmit buffer in card space */
1074 DEBUG(3,"ray_hw_xmit(data=%p, len=%d, dev=%p)\n",data
,len
,dev
);
1075 if (len
+ TX_HEADER_LENGTH
> TX_BUF_SIZE
)
1077 printk(KERN_INFO
"ray_hw_xmit packet too large: %d bytes\n",len
);
1078 return XMIT_MSG_BAD
;
1080 switch (ccsindex
= get_free_tx_ccs(local
)) {
1082 DEBUG(2,"ray_hw_xmit tx_ccs table busy\n");
1084 DEBUG(2,"ray_hw_xmit No free tx ccs\n");
1086 netif_stop_queue(dev
);
1091 addr
= TX_BUF_BASE
+ (ccsindex
<< 11);
1093 if (msg_type
== DATA_TYPE
) {
1094 local
->stats
.tx_bytes
+= len
;
1095 local
->stats
.tx_packets
++;
1098 ptx
= local
->sram
+ addr
;
1100 ray_build_header(local
, ptx
, msg_type
, data
);
1102 offset
= translate_frame(local
, ptx
, data
, len
);
1104 else { /* Encapsulate frame */
1105 /* TBD TIB length will move address of ptx->var */
1106 memcpy_toio(&ptx
->var
, data
, len
);
1110 /* fill in the CCS */
1111 pccs
= ccs_base(local
) + ccsindex
;
1112 len
+= TX_HEADER_LENGTH
+ offset
;
1113 writeb(CCS_TX_REQUEST
, &pccs
->cmd
);
1114 writeb(addr
>> 8, &pccs
->var
.tx_request
.tx_data_ptr
[0]);
1115 writeb(local
->tib_length
, &pccs
->var
.tx_request
.tx_data_ptr
[1]);
1116 writeb(len
>> 8, &pccs
->var
.tx_request
.tx_data_length
[0]);
1117 writeb(len
& 0xff, &pccs
->var
.tx_request
.tx_data_length
[1]);
1118 /* TBD still need psm_cam? */
1119 writeb(PSM_CAM
, &pccs
->var
.tx_request
.pow_sav_mode
);
1120 writeb(local
->net_default_tx_rate
, &pccs
->var
.tx_request
.tx_rate
);
1121 writeb(0, &pccs
->var
.tx_request
.antenna
);
1122 DEBUG(3,"ray_hw_xmit default_tx_rate = 0x%x\n",\
1123 local
->net_default_tx_rate
);
1125 /* Interrupt the firmware to process the command */
1126 if (interrupt_ecf(local
, ccsindex
)) {
1127 DEBUG(2,"ray_hw_xmit failed - ECF not ready for intr\n");
1128 /* TBD very inefficient to copy packet to buffer, and then not
1129 send it, but the alternative is to queue the messages and that
1130 won't be done for a while. Maybe set tbusy until a CCS is free?
1132 writeb(CCS_BUFFER_FREE
, &pccs
->buffer_status
);
1133 return XMIT_NO_INTR
;
1136 } /* end ray_hw_xmit */
1137 /*===========================================================================*/
1138 static int translate_frame(ray_dev_t
*local
, struct tx_msg __iomem
*ptx
, unsigned char *data
,
1141 unsigned short int proto
= ((struct ethhdr
*)data
)->h_proto
;
1142 if (ntohs(proto
) >= 1536) { /* DIX II ethernet frame */
1143 DEBUG(3,"ray_cs translate_frame DIX II\n");
1144 /* Copy LLC header to card buffer */
1145 memcpy_toio(&ptx
->var
, eth2_llc
, sizeof(eth2_llc
));
1146 memcpy_toio( ((void __iomem
*)&ptx
->var
) + sizeof(eth2_llc
), (UCHAR
*)&proto
, 2);
1147 if ((proto
== 0xf380) || (proto
== 0x3781)) {
1148 /* This is the selective translation table, only 2 entries */
1149 writeb(0xf8, &((struct snaphdr_t __iomem
*)ptx
->var
)->org
[3]);
1151 /* Copy body of ethernet packet without ethernet header */
1152 memcpy_toio((void __iomem
*)&ptx
->var
+ sizeof(struct snaphdr_t
), \
1153 data
+ ETH_HLEN
, len
- ETH_HLEN
);
1154 return (int) sizeof(struct snaphdr_t
) - ETH_HLEN
;
1156 else { /* already 802 type, and proto is length */
1157 DEBUG(3,"ray_cs translate_frame 802\n");
1158 if (proto
== 0xffff) { /* evil netware IPX 802.3 without LLC */
1159 DEBUG(3,"ray_cs translate_frame evil IPX\n");
1160 memcpy_toio(&ptx
->var
, data
+ ETH_HLEN
, len
- ETH_HLEN
);
1161 return 0 - ETH_HLEN
;
1163 memcpy_toio(&ptx
->var
, data
+ ETH_HLEN
, len
- ETH_HLEN
);
1164 return 0 - ETH_HLEN
;
1166 /* TBD do other frame types */
1167 } /* end translate_frame */
1168 /*===========================================================================*/
1169 static void ray_build_header(ray_dev_t
*local
, struct tx_msg __iomem
*ptx
, UCHAR msg_type
,
1170 unsigned char *data
)
1172 writeb(PROTOCOL_VER
| msg_type
, &ptx
->mac
.frame_ctl_1
);
1173 /*** IEEE 802.11 Address field assignments *************
1174 TODS FROMDS addr_1 addr_2 addr_3 addr_4
1175 Adhoc 0 0 dest src (terminal) BSSID N/A
1176 AP to Terminal 0 1 dest AP(BSSID) source N/A
1177 Terminal to AP 1 0 AP(BSSID) src (terminal) dest N/A
1178 AP to AP 1 1 dest AP src AP dest source
1179 *******************************************************/
1180 if (local
->net_type
== ADHOC
) {
1181 writeb(0, &ptx
->mac
.frame_ctl_2
);
1182 memcpy_toio(ptx
->mac
.addr_1
, ((struct ethhdr
*)data
)->h_dest
, 2 * ADDRLEN
);
1183 memcpy_toio(ptx
->mac
.addr_3
, local
->bss_id
, ADDRLEN
);
1185 else /* infrastructure */
1187 if (local
->sparm
.b4
.a_acting_as_ap_status
)
1189 writeb(FC2_FROM_DS
, &ptx
->mac
.frame_ctl_2
);
1190 memcpy_toio(ptx
->mac
.addr_1
, ((struct ethhdr
*)data
)->h_dest
, ADDRLEN
);
1191 memcpy_toio(ptx
->mac
.addr_2
, local
->bss_id
, 6);
1192 memcpy_toio(ptx
->mac
.addr_3
, ((struct ethhdr
*)data
)->h_source
, ADDRLEN
);
1196 writeb(FC2_TO_DS
, &ptx
->mac
.frame_ctl_2
);
1197 memcpy_toio(ptx
->mac
.addr_1
, local
->bss_id
, ADDRLEN
);
1198 memcpy_toio(ptx
->mac
.addr_2
, ((struct ethhdr
*)data
)->h_source
, ADDRLEN
);
1199 memcpy_toio(ptx
->mac
.addr_3
, ((struct ethhdr
*)data
)->h_dest
, ADDRLEN
);
1202 } /* end encapsulate_frame */
1205 /*===========================================================================*/
1207 static void netdev_get_drvinfo(struct net_device
*dev
,
1208 struct ethtool_drvinfo
*info
)
1210 strcpy(info
->driver
, "ray_cs");
1213 static struct ethtool_ops netdev_ethtool_ops
= {
1214 .get_drvinfo
= netdev_get_drvinfo
,
1217 /*====================================================================*/
1219 static int ray_dev_ioctl(struct net_device
*dev
, struct ifreq
*ifr
, int cmd
)
1221 ray_dev_t
*local
= (ray_dev_t
*)dev
->priv
;
1222 dev_link_t
*link
= local
->finder
;
1224 #if WIRELESS_EXT > 7
1225 struct iwreq
*wrq
= (struct iwreq
*) ifr
;
1226 #endif /* WIRELESS_EXT > 7 */
1228 if (!(link
->state
& DEV_PRESENT
)) {
1229 DEBUG(2,"ray_dev_ioctl - device not present\n");
1232 DEBUG(2,"ray_cs IOCTL dev=%p, ifr=%p, cmd = 0x%x\n",dev
,ifr
,cmd
);
1233 /* Validate the command */
1236 #if WIRELESS_EXT > 7
1237 /* --------------- WIRELESS EXTENSIONS --------------- */
1240 strcpy(wrq
->u
.name
, "IEEE 802.11-FH");
1243 /* Get frequency/channel */
1245 wrq
->u
.freq
.m
= local
->sparm
.b5
.a_hop_pattern
;
1249 /* Set frequency/channel */
1251 /* Reject if card is already initialised */
1252 if(local
->card_status
!= CARD_AWAITING_PARAM
)
1258 /* Setting by channel number */
1259 if ((wrq
->u
.freq
.m
> USA_HOP_MOD
) || (wrq
->u
.freq
.e
> 0))
1262 local
->sparm
.b5
.a_hop_pattern
= wrq
->u
.freq
.m
;
1265 /* Get current network name (ESSID) */
1267 if (wrq
->u
.data
.pointer
)
1269 char essid
[IW_ESSID_MAX_SIZE
+ 1];
1270 /* Get the essid that was set */
1271 memcpy(essid
, local
->sparm
.b5
.a_current_ess_id
,
1273 essid
[IW_ESSID_MAX_SIZE
] = '\0';
1276 wrq
->u
.data
.length
= strlen(essid
) + 1;
1277 wrq
->u
.data
.flags
= 1; /* active */
1278 if (copy_to_user(wrq
->u
.data
.pointer
, essid
, sizeof(essid
)))
1283 /* Set desired network name (ESSID) */
1285 /* Reject if card is already initialised */
1286 if(local
->card_status
!= CARD_AWAITING_PARAM
)
1292 if (wrq
->u
.data
.pointer
)
1294 char card_essid
[IW_ESSID_MAX_SIZE
+ 1];
1296 /* Check if we asked for `any' */
1297 if(wrq
->u
.data
.flags
== 0)
1299 /* Corey : can you do that ? */
1304 /* Check the size of the string */
1305 if(wrq
->u
.data
.length
>
1306 IW_ESSID_MAX_SIZE
+ 1)
1311 if (copy_from_user(card_essid
,
1312 wrq
->u
.data
.pointer
,
1313 wrq
->u
.data
.length
)) {
1317 card_essid
[IW_ESSID_MAX_SIZE
] = '\0';
1319 /* Set the ESSID in the card */
1320 memcpy(local
->sparm
.b5
.a_current_ess_id
, card_essid
,
1326 /* Get current Access Point (BSSID in our case) */
1328 memcpy(wrq
->u
.ap_addr
.sa_data
, local
->bss_id
, ETH_ALEN
);
1329 wrq
->u
.ap_addr
.sa_family
= ARPHRD_ETHER
;
1332 /* Get the current bit-rate */
1334 if(local
->net_default_tx_rate
== 3)
1335 wrq
->u
.bitrate
.value
= 2000000; /* Hum... */
1337 wrq
->u
.bitrate
.value
= local
->net_default_tx_rate
* 500000;
1338 wrq
->u
.bitrate
.fixed
= 0; /* We are in auto mode */
1341 /* Set the desired bit-rate */
1343 /* Check if rate is in range */
1344 if((wrq
->u
.bitrate
.value
!= 1000000) &&
1345 (wrq
->u
.bitrate
.value
!= 2000000))
1350 /* Hack for 1.5 Mb/s instead of 2 Mb/s */
1351 if((local
->fw_ver
== 0x55) && /* Please check */
1352 (wrq
->u
.bitrate
.value
== 2000000))
1353 local
->net_default_tx_rate
= 3;
1355 local
->net_default_tx_rate
= wrq
->u
.bitrate
.value
/500000;
1358 /* Get the current RTS threshold */
1360 wrq
->u
.rts
.value
= (local
->sparm
.b5
.a_rts_threshold
[0] << 8)
1361 + local
->sparm
.b5
.a_rts_threshold
[1];
1362 #if WIRELESS_EXT > 8
1363 wrq
->u
.rts
.disabled
= (wrq
->u
.rts
.value
== 32767);
1364 #endif /* WIRELESS_EXT > 8 */
1365 wrq
->u
.rts
.fixed
= 1;
1368 /* Set the desired RTS threshold */
1371 int rthr
= wrq
->u
.rts
.value
;
1373 /* Reject if card is already initialised */
1374 if(local
->card_status
!= CARD_AWAITING_PARAM
)
1380 /* if(wrq->u.rts.fixed == 0) we should complain */
1381 #if WIRELESS_EXT > 8
1382 if(wrq
->u
.rts
.disabled
)
1385 #endif /* WIRELESS_EXT > 8 */
1386 if((rthr
< 0) || (rthr
> 2347)) /* What's the max packet size ??? */
1391 local
->sparm
.b5
.a_rts_threshold
[0] = (rthr
>> 8) & 0xFF;
1392 local
->sparm
.b5
.a_rts_threshold
[1] = rthr
& 0xFF;
1396 /* Get the current fragmentation threshold */
1398 wrq
->u
.frag
.value
= (local
->sparm
.b5
.a_frag_threshold
[0] << 8)
1399 + local
->sparm
.b5
.a_frag_threshold
[1];
1400 #if WIRELESS_EXT > 8
1401 wrq
->u
.frag
.disabled
= (wrq
->u
.frag
.value
== 32767);
1402 #endif /* WIRELESS_EXT > 8 */
1403 wrq
->u
.frag
.fixed
= 1;
1406 /* Set the desired fragmentation threshold */
1409 int fthr
= wrq
->u
.frag
.value
;
1411 /* Reject if card is already initialised */
1412 if(local
->card_status
!= CARD_AWAITING_PARAM
)
1418 /* if(wrq->u.frag.fixed == 0) should complain */
1419 #if WIRELESS_EXT > 8
1420 if(wrq
->u
.frag
.disabled
)
1423 #endif /* WIRELESS_EXT > 8 */
1424 if((fthr
< 256) || (fthr
> 2347)) /* To check out ! */
1429 local
->sparm
.b5
.a_frag_threshold
[0] = (fthr
>> 8) & 0xFF;
1430 local
->sparm
.b5
.a_frag_threshold
[1] = fthr
& 0xFF;
1434 #endif /* WIRELESS_EXT > 7 */
1435 #if WIRELESS_EXT > 8
1437 /* Get the current mode of operation */
1439 if(local
->sparm
.b5
.a_network_type
)
1440 wrq
->u
.mode
= IW_MODE_INFRA
;
1442 wrq
->u
.mode
= IW_MODE_ADHOC
;
1445 /* Set the current mode of operation */
1450 /* Reject if card is already initialised */
1451 if(local
->card_status
!= CARD_AWAITING_PARAM
)
1457 switch (wrq
->u
.mode
)
1463 local
->sparm
.b5
.a_network_type
= card_mode
;
1471 #endif /* WIRELESS_EXT > 8 */
1472 #if WIRELESS_EXT > 7
1473 /* ------------------ IWSPY SUPPORT ------------------ */
1474 /* Define the range (variations) of above parameters */
1476 /* Basic checking... */
1477 if(wrq
->u
.data
.pointer
!= (caddr_t
) 0)
1479 struct iw_range range
;
1480 memset((char *) &range
, 0, sizeof(struct iw_range
));
1482 /* Set the length (very important for backward compatibility) */
1483 wrq
->u
.data
.length
= sizeof(struct iw_range
);
1485 #if WIRELESS_EXT > 10
1486 /* Set the Wireless Extension versions */
1487 range
.we_version_compiled
= WIRELESS_EXT
;
1488 range
.we_version_source
= 9;
1489 #endif /* WIRELESS_EXT > 10 */
1491 /* Set information in the range struct */
1492 range
.throughput
= 1.1 * 1000 * 1000; /* Put the right number here */
1493 range
.num_channels
= hop_pattern_length
[(int)country
];
1494 range
.num_frequency
= 0;
1495 range
.max_qual
.qual
= 0;
1496 range
.max_qual
.level
= 255; /* What's the correct value ? */
1497 range
.max_qual
.noise
= 255; /* Idem */
1498 range
.num_bitrates
= 2;
1499 range
.bitrate
[0] = 1000000; /* 1 Mb/s */
1500 range
.bitrate
[1] = 2000000; /* 2 Mb/s */
1502 /* Copy structure to the user buffer */
1503 if(copy_to_user(wrq
->u
.data
.pointer
, &range
,
1504 sizeof(struct iw_range
)))
1510 /* Set addresses to spy */
1512 /* Check the number of addresses */
1513 if(wrq
->u
.data
.length
> IW_MAX_SPY
)
1518 local
->spy_number
= wrq
->u
.data
.length
;
1520 /* If there is some addresses to copy */
1521 if(local
->spy_number
> 0)
1523 struct sockaddr address
[IW_MAX_SPY
];
1526 /* Copy addresses to the driver */
1527 if(copy_from_user(address
, wrq
->u
.data
.pointer
,
1528 sizeof(struct sockaddr
) * local
->spy_number
))
1534 /* Copy addresses to the lp structure */
1535 for(i
= 0; i
< local
->spy_number
; i
++)
1536 memcpy(local
->spy_address
[i
], address
[i
].sa_data
, ETH_ALEN
);
1538 /* Reset structure... */
1539 memset(local
->spy_stat
, 0x00, sizeof(iw_qual
) * IW_MAX_SPY
);
1541 #ifdef DEBUG_IOCTL_INFO
1542 printk(KERN_DEBUG
"SetSpy - Set of new addresses is :\n");
1543 for(i
= 0; i
< local
->spy_number
; i
++)
1544 printk(KERN_DEBUG
"%02X:%02X:%02X:%02X:%02X:%02X\n",
1545 local
->spy_address
[i
][0],
1546 local
->spy_address
[i
][1],
1547 local
->spy_address
[i
][2],
1548 local
->spy_address
[i
][3],
1549 local
->spy_address
[i
][4],
1550 local
->spy_address
[i
][5]);
1551 #endif /* DEBUG_IOCTL_INFO */
1555 /* Get the spy list and spy stats */
1557 /* Set the number of addresses */
1558 wrq
->u
.data
.length
= local
->spy_number
;
1560 /* If the user want to have the addresses back... */
1561 if((local
->spy_number
> 0) && (wrq
->u
.data
.pointer
!= (caddr_t
) 0))
1563 struct sockaddr address
[IW_MAX_SPY
];
1566 /* Copy addresses from the lp structure */
1567 for(i
= 0; i
< local
->spy_number
; i
++)
1569 memcpy(address
[i
].sa_data
, local
->spy_address
[i
], ETH_ALEN
);
1570 address
[i
].sa_family
= ARPHRD_ETHER
;
1573 /* Copy addresses to the user buffer */
1574 if(copy_to_user(wrq
->u
.data
.pointer
, address
,
1575 sizeof(struct sockaddr
) * local
->spy_number
))
1581 /* Copy stats to the user buffer (just after) */
1582 if(copy_to_user(wrq
->u
.data
.pointer
+
1583 (sizeof(struct sockaddr
) * local
->spy_number
),
1584 local
->spy_stat
, sizeof(iw_qual
) * local
->spy_number
))
1590 /* Reset updated flags */
1591 for(i
= 0; i
< local
->spy_number
; i
++)
1592 local
->spy_stat
[i
].updated
= 0x0;
1593 } /* if(pointer != NULL) */
1596 #endif /* WIRELESS_SPY */
1598 /* ------------------ PRIVATE IOCTL ------------------ */
1599 #ifndef SIOCIWFIRSTPRIV
1600 #define SIOCIWFIRSTPRIV SIOCDEVPRIVATE
1601 #endif /* SIOCIWFIRSTPRIV */
1602 #define SIOCSIPFRAMING SIOCIWFIRSTPRIV /* Set framing mode */
1603 #define SIOCGIPFRAMING SIOCIWFIRSTPRIV + 1 /* Get framing mode */
1604 #define SIOCGIPCOUNTRY SIOCIWFIRSTPRIV + 3 /* Get country code */
1605 case SIOCSIPFRAMING
:
1606 if(!capable(CAP_NET_ADMIN
)) /* For private IOCTLs, we need to check permissions */
1611 translate
= *(wrq
->u
.name
); /* Set framing mode */
1613 case SIOCGIPFRAMING
:
1614 *(wrq
->u
.name
) = translate
;
1616 case SIOCGIPCOUNTRY
:
1617 *(wrq
->u
.name
) = country
;
1620 /* Export our "private" intercace */
1621 if(wrq
->u
.data
.pointer
!= (caddr_t
) 0)
1623 struct iw_priv_args priv
[] =
1624 { /* cmd, set_args, get_args, name */
1625 { SIOCSIPFRAMING
, IW_PRIV_TYPE_BYTE
| IW_PRIV_SIZE_FIXED
| 1, 0, "set_framing" },
1626 { SIOCGIPFRAMING
, 0, IW_PRIV_TYPE_BYTE
| IW_PRIV_SIZE_FIXED
| 1, "get_framing" },
1627 { SIOCGIPCOUNTRY
, 0, IW_PRIV_TYPE_BYTE
| IW_PRIV_SIZE_FIXED
| 1, "get_country" },
1629 /* Set the number of ioctl available */
1630 wrq
->u
.data
.length
= 3;
1631 /* Copy structure to the user buffer */
1632 if(copy_to_user(wrq
->u
.data
.pointer
, (u_char
*) priv
,
1637 #endif /* WIRELESS_EXT > 7 */
1641 DEBUG(0,"ray_dev_ioctl cmd = 0x%x\n", cmd
);
1645 } /* end ray_dev_ioctl */
1646 /*===========================================================================*/
1647 #if WIRELESS_EXT > 7 /* If wireless extension exist in the kernel */
1648 static iw_stats
* ray_get_wireless_stats(struct net_device
* dev
)
1650 ray_dev_t
* local
= (ray_dev_t
*) dev
->priv
;
1651 dev_link_t
*link
= local
->finder
;
1652 struct status __iomem
*p
= local
->sram
+ STATUS_BASE
;
1654 if(local
== (ray_dev_t
*) NULL
)
1655 return (iw_stats
*) NULL
;
1657 local
->wstats
.status
= local
->card_status
;
1659 if((local
->spy_number
> 0) && (local
->sparm
.b5
.a_network_type
== 0))
1661 /* Get it from the first node in spy list */
1662 local
->wstats
.qual
.qual
= local
->spy_stat
[0].qual
;
1663 local
->wstats
.qual
.level
= local
->spy_stat
[0].level
;
1664 local
->wstats
.qual
.noise
= local
->spy_stat
[0].noise
;
1665 local
->wstats
.qual
.updated
= local
->spy_stat
[0].updated
;
1667 #endif /* WIRELESS_SPY */
1669 if((link
->state
& DEV_PRESENT
)) {
1670 local
->wstats
.qual
.noise
= readb(&p
->rxnoise
);
1671 local
->wstats
.qual
.updated
|= 4;
1674 return &local
->wstats
;
1675 } /* end ray_get_wireless_stats */
1676 #endif /* WIRELESS_EXT > 7 */
1677 /*===========================================================================*/
1678 static int ray_open(struct net_device
*dev
)
1681 ray_dev_t
*local
= (ray_dev_t
*)dev
->priv
;
1683 DEBUG(1, "ray_open('%s')\n", dev
->name
);
1685 for (link
= dev_list
; link
; link
= link
->next
)
1686 if (link
->priv
== dev
) break;
1687 if (!DEV_OK(link
)) {
1691 if (link
->open
== 0) local
->num_multi
= 0;
1694 /* If the card is not started, time to start it ! - Jean II */
1695 if(local
->card_status
== CARD_AWAITING_PARAM
) {
1698 DEBUG(1,"ray_open: doing init now !\n");
1700 /* Download startup parameters */
1701 if ( (i
= dl_startup_params(dev
)) < 0)
1703 printk(KERN_INFO
"ray_dev_init dl_startup_params failed - "
1704 "returns 0x%x\n",i
);
1709 if (sniffer
) netif_stop_queue(dev
);
1710 else netif_start_queue(dev
);
1712 DEBUG(2,"ray_open ending\n");
1714 } /* end ray_open */
1715 /*===========================================================================*/
1716 static int ray_dev_close(struct net_device
*dev
)
1720 DEBUG(1, "ray_dev_close('%s')\n", dev
->name
);
1722 for (link
= dev_list
; link
; link
= link
->next
)
1723 if (link
->priv
== dev
) break;
1728 netif_stop_queue(dev
);
1730 /* In here, we should stop the hardware (stop card from beeing active)
1731 * and set local->card_status to CARD_AWAITING_PARAM, so that while the
1732 * card is closed we can chage its configuration.
1733 * Probably also need a COR reset to get sane state - Jean II */
1736 } /* end ray_dev_close */
1737 /*===========================================================================*/
1738 static void ray_reset(struct net_device
*dev
) {
1739 DEBUG(1,"ray_reset entered\n");
1742 /*===========================================================================*/
1743 /* Cause a firmware interrupt if it is ready for one */
1744 /* Return nonzero if not ready */
1745 static int interrupt_ecf(ray_dev_t
*local
, int ccs
)
1748 dev_link_t
*link
= local
->finder
;
1750 if (!(link
->state
& DEV_PRESENT
)) {
1751 DEBUG(2,"ray_cs interrupt_ecf - device not present\n");
1754 DEBUG(2,"interrupt_ecf(local=%p, ccs = 0x%x\n",local
,ccs
);
1757 (readb(local
->amem
+ CIS_OFFSET
+ ECF_INTR_OFFSET
) & ECF_INTR_SET
))
1760 DEBUG(2,"ray_cs interrupt_ecf card not ready for interrupt\n");
1763 /* Fill the mailbox, then kick the card */
1764 writeb(ccs
, local
->sram
+ SCB_BASE
);
1765 writeb(ECF_INTR_SET
, local
->amem
+ CIS_OFFSET
+ ECF_INTR_OFFSET
);
1767 } /* interrupt_ecf */
1768 /*===========================================================================*/
1769 /* Get next free transmit CCS */
1770 /* Return - index of current tx ccs */
1771 static int get_free_tx_ccs(ray_dev_t
*local
)
1774 struct ccs __iomem
*pccs
= ccs_base(local
);
1775 dev_link_t
*link
= local
->finder
;
1777 if (!(link
->state
& DEV_PRESENT
)) {
1778 DEBUG(2,"ray_cs get_free_tx_ccs - device not present\n");
1782 if (test_and_set_bit(0,&local
->tx_ccs_lock
)) {
1783 DEBUG(1,"ray_cs tx_ccs_lock busy\n");
1787 for (i
=0; i
< NUMBER_OF_TX_CCS
; i
++) {
1788 if (readb(&(pccs
+i
)->buffer_status
) == CCS_BUFFER_FREE
) {
1789 writeb(CCS_BUFFER_BUSY
, &(pccs
+i
)->buffer_status
);
1790 writeb(CCS_END_LIST
, &(pccs
+i
)->link
);
1791 local
->tx_ccs_lock
= 0;
1795 local
->tx_ccs_lock
= 0;
1796 DEBUG(2,"ray_cs ERROR no free tx CCS for raylink card\n");
1798 } /* get_free_tx_ccs */
1799 /*===========================================================================*/
1800 /* Get next free CCS */
1801 /* Return - index of current ccs */
1802 static int get_free_ccs(ray_dev_t
*local
)
1805 struct ccs __iomem
*pccs
= ccs_base(local
);
1806 dev_link_t
*link
= local
->finder
;
1808 if (!(link
->state
& DEV_PRESENT
)) {
1809 DEBUG(2,"ray_cs get_free_ccs - device not present\n");
1812 if (test_and_set_bit(0,&local
->ccs_lock
)) {
1813 DEBUG(1,"ray_cs ccs_lock busy\n");
1817 for (i
= NUMBER_OF_TX_CCS
; i
< NUMBER_OF_CCS
; i
++) {
1818 if (readb(&(pccs
+i
)->buffer_status
) == CCS_BUFFER_FREE
) {
1819 writeb(CCS_BUFFER_BUSY
, &(pccs
+i
)->buffer_status
);
1820 writeb(CCS_END_LIST
, &(pccs
+i
)->link
);
1821 local
->ccs_lock
= 0;
1825 local
->ccs_lock
= 0;
1826 DEBUG(1,"ray_cs ERROR no free CCS for raylink card\n");
1828 } /* get_free_ccs */
1829 /*===========================================================================*/
1830 static void authenticate_timeout(u_long data
)
1832 ray_dev_t
*local
= (ray_dev_t
*)data
;
1833 del_timer(&local
->timer
);
1834 printk(KERN_INFO
"ray_cs Authentication with access point failed"
1836 join_net((u_long
)local
);
1838 /*===========================================================================*/
1839 static int asc_to_int(char a
)
1841 if (a
< '0') return -1;
1842 if (a
<= '9') return (a
- '0');
1843 if (a
< 'A') return -1;
1844 if (a
<= 'F') return (10 + a
- 'A');
1845 if (a
< 'a') return -1;
1846 if (a
<= 'f') return (10 + a
- 'a');
1849 /*===========================================================================*/
1850 static int parse_addr(char *in_str
, UCHAR
*out
)
1856 if (in_str
== NULL
) return 0;
1857 if ((len
= strlen(in_str
)) < 2) return 0;
1858 memset(out
, 0, ADDRLEN
);
1867 if ((k
= asc_to_int(in_str
[j
--])) != -1) out
[i
] = k
;
1871 if ((k
= asc_to_int(in_str
[j
--])) != -1) out
[i
] += k
<< 4;
1877 /*===========================================================================*/
1878 static struct net_device_stats
*ray_get_stats(struct net_device
*dev
)
1880 ray_dev_t
*local
= (ray_dev_t
*)dev
->priv
;
1881 dev_link_t
*link
= local
->finder
;
1882 struct status __iomem
*p
= local
->sram
+ STATUS_BASE
;
1883 if (!(link
->state
& DEV_PRESENT
)) {
1884 DEBUG(2,"ray_cs net_device_stats - device not present\n");
1885 return &local
->stats
;
1887 if (readb(&p
->mrx_overflow_for_host
))
1889 local
->stats
.rx_over_errors
+= ntohs(readb(&p
->mrx_overflow
));
1890 writeb(0,&p
->mrx_overflow
);
1891 writeb(0,&p
->mrx_overflow_for_host
);
1893 if (readb(&p
->mrx_checksum_error_for_host
))
1895 local
->stats
.rx_crc_errors
+= ntohs(readb(&p
->mrx_checksum_error
));
1896 writeb(0,&p
->mrx_checksum_error
);
1897 writeb(0,&p
->mrx_checksum_error_for_host
);
1899 if (readb(&p
->rx_hec_error_for_host
))
1901 local
->stats
.rx_frame_errors
+= ntohs(readb(&p
->rx_hec_error
));
1902 writeb(0,&p
->rx_hec_error
);
1903 writeb(0,&p
->rx_hec_error_for_host
);
1905 return &local
->stats
;
1907 /*===========================================================================*/
1908 static void ray_update_parm(struct net_device
*dev
, UCHAR objid
, UCHAR
*value
, int len
)
1910 ray_dev_t
*local
= (ray_dev_t
*)dev
->priv
;
1911 dev_link_t
*link
= local
->finder
;
1914 struct ccs __iomem
*pccs
;
1916 if (!(link
->state
& DEV_PRESENT
)) {
1917 DEBUG(2,"ray_update_parm - device not present\n");
1921 if ((ccsindex
= get_free_ccs(local
)) < 0)
1923 DEBUG(0,"ray_update_parm - No free ccs\n");
1926 pccs
= ccs_base(local
) + ccsindex
;
1927 writeb(CCS_UPDATE_PARAMS
, &pccs
->cmd
);
1928 writeb(objid
, &pccs
->var
.update_param
.object_id
);
1929 writeb(1, &pccs
->var
.update_param
.number_objects
);
1930 writeb(0, &pccs
->var
.update_param
.failure_cause
);
1931 for (i
=0; i
<len
; i
++) {
1932 writeb(value
[i
], local
->sram
+ HOST_TO_ECF_BASE
);
1934 /* Interrupt the firmware to process the command */
1935 if (interrupt_ecf(local
, ccsindex
)) {
1936 DEBUG(0,"ray_cs associate failed - ECF not ready for intr\n");
1937 writeb(CCS_BUFFER_FREE
, &(pccs
++)->buffer_status
);
1940 /*===========================================================================*/
1941 static void ray_update_multi_list(struct net_device
*dev
, int all
)
1943 struct dev_mc_list
*dmi
, **dmip
;
1945 struct ccs __iomem
*pccs
;
1947 ray_dev_t
*local
= (ray_dev_t
*)dev
->priv
;
1948 dev_link_t
*link
= local
->finder
;
1949 void __iomem
*p
= local
->sram
+ HOST_TO_ECF_BASE
;
1951 if (!(link
->state
& DEV_PRESENT
)) {
1952 DEBUG(2,"ray_update_multi_list - device not present\n");
1956 DEBUG(2,"ray_update_multi_list(%p)\n",dev
);
1957 if ((ccsindex
= get_free_ccs(local
)) < 0)
1959 DEBUG(1,"ray_update_multi - No free ccs\n");
1962 pccs
= ccs_base(local
) + ccsindex
;
1963 writeb(CCS_UPDATE_MULTICAST_LIST
, &pccs
->cmd
);
1966 writeb(0xff, &pccs
->var
);
1967 local
->num_multi
= 0xff;
1970 /* Copy the kernel's list of MC addresses to card */
1971 for (dmip
=&dev
->mc_list
; (dmi
=*dmip
)!=NULL
; dmip
=&dmi
->next
) {
1972 memcpy_toio(p
, dmi
->dmi_addr
, ETH_ALEN
);
1973 DEBUG(1,"ray_update_multi add addr %02x%02x%02x%02x%02x%02x\n",dmi
->dmi_addr
[0],dmi
->dmi_addr
[1],dmi
->dmi_addr
[2],dmi
->dmi_addr
[3],dmi
->dmi_addr
[4],dmi
->dmi_addr
[5]);
1977 if (i
> 256/ADDRLEN
) i
= 256/ADDRLEN
;
1978 writeb((UCHAR
)i
, &pccs
->var
);
1979 DEBUG(1,"ray_cs update_multi %d addresses in list\n", i
);
1980 /* Interrupt the firmware to process the command */
1981 local
->num_multi
= i
;
1983 if (interrupt_ecf(local
, ccsindex
)) {
1984 DEBUG(1,"ray_cs update_multi failed - ECF not ready for intr\n");
1985 writeb(CCS_BUFFER_FREE
, &(pccs
++)->buffer_status
);
1987 } /* end ray_update_multi_list */
1988 /*===========================================================================*/
1989 static void set_multicast_list(struct net_device
*dev
)
1991 ray_dev_t
*local
= (ray_dev_t
*)dev
->priv
;
1994 DEBUG(2,"ray_cs set_multicast_list(%p)\n",dev
);
1996 if (dev
->flags
& IFF_PROMISC
)
1998 if (local
->sparm
.b5
.a_promiscuous_mode
== 0) {
1999 DEBUG(1,"ray_cs set_multicast_list promisc on\n");
2000 local
->sparm
.b5
.a_promiscuous_mode
= 1;
2002 ray_update_parm(dev
, OBJID_promiscuous_mode
, \
2003 &promisc
, sizeof(promisc
));
2007 if (local
->sparm
.b5
.a_promiscuous_mode
== 1) {
2008 DEBUG(1,"ray_cs set_multicast_list promisc off\n");
2009 local
->sparm
.b5
.a_promiscuous_mode
= 0;
2011 ray_update_parm(dev
, OBJID_promiscuous_mode
, \
2012 &promisc
, sizeof(promisc
));
2016 if (dev
->flags
& IFF_ALLMULTI
) ray_update_multi_list(dev
, 1);
2019 if (local
->num_multi
!= dev
->mc_count
) ray_update_multi_list(dev
, 0);
2021 } /* end set_multicast_list */
2022 /*=============================================================================
2023 * All routines below here are run at interrupt time.
2024 =============================================================================*/
2025 static irqreturn_t
ray_interrupt(int irq
, void *dev_id
, struct pt_regs
* regs
)
2027 struct net_device
*dev
= (struct net_device
*)dev_id
;
2030 struct ccs __iomem
*pccs
;
2031 struct rcs __iomem
*prcs
;
2037 if (dev
== NULL
) /* Note that we want interrupts with dev->start == 0 */
2040 DEBUG(4,"ray_cs: interrupt for *dev=%p\n",dev
);
2042 local
= (ray_dev_t
*)dev
->priv
;
2043 link
= (dev_link_t
*)local
->finder
;
2044 if ( ! (link
->state
& DEV_PRESENT
) || link
->state
& DEV_SUSPEND
) {
2045 DEBUG(2,"ray_cs interrupt from device not present or suspended.\n");
2048 rcsindex
= readb(&((struct scb __iomem
*)(local
->sram
))->rcs_index
);
2050 if (rcsindex
>= (NUMBER_OF_CCS
+ NUMBER_OF_RCS
))
2052 DEBUG(1,"ray_cs interrupt bad rcsindex = 0x%x\n",rcsindex
);
2053 clear_interrupt(local
);
2056 if (rcsindex
< NUMBER_OF_CCS
) /* If it's a returned CCS */
2058 pccs
= ccs_base(local
) + rcsindex
;
2059 cmd
= readb(&pccs
->cmd
);
2060 status
= readb(&pccs
->buffer_status
);
2063 case CCS_DOWNLOAD_STARTUP_PARAMS
: /* Happens in firmware someday */
2064 del_timer(&local
->timer
);
2065 if (status
== CCS_COMMAND_COMPLETE
) {
2066 DEBUG(1,"ray_cs interrupt download_startup_parameters OK\n");
2069 DEBUG(1,"ray_cs interrupt download_startup_parameters fail\n");
2072 case CCS_UPDATE_PARAMS
:
2073 DEBUG(1,"ray_cs interrupt update params done\n");
2074 if (status
!= CCS_COMMAND_COMPLETE
) {
2075 tmp
= readb(&pccs
->var
.update_param
.failure_cause
);
2076 DEBUG(0,"ray_cs interrupt update params failed - reason %d\n",tmp
);
2079 case CCS_REPORT_PARAMS
:
2080 DEBUG(1,"ray_cs interrupt report params done\n");
2082 case CCS_UPDATE_MULTICAST_LIST
: /* Note that this CCS isn't returned */
2083 DEBUG(1,"ray_cs interrupt CCS Update Multicast List done\n");
2085 case CCS_UPDATE_POWER_SAVINGS_MODE
:
2086 DEBUG(1,"ray_cs interrupt update power save mode done\n");
2088 case CCS_START_NETWORK
:
2089 case CCS_JOIN_NETWORK
:
2090 if (status
== CCS_COMMAND_COMPLETE
) {
2091 if (readb(&pccs
->var
.start_network
.net_initiated
) == 1) {
2092 DEBUG(0,"ray_cs interrupt network \"%s\" started\n",\
2093 local
->sparm
.b4
.a_current_ess_id
);
2096 DEBUG(0,"ray_cs interrupt network \"%s\" joined\n",\
2097 local
->sparm
.b4
.a_current_ess_id
);
2099 memcpy_fromio(&local
->bss_id
,pccs
->var
.start_network
.bssid
,ADDRLEN
);
2101 if (local
->fw_ver
== 0x55) local
->net_default_tx_rate
= 3;
2102 else local
->net_default_tx_rate
=
2103 readb(&pccs
->var
.start_network
.net_default_tx_rate
);
2104 local
->encryption
= readb(&pccs
->var
.start_network
.encryption
);
2105 if (!sniffer
&& (local
->net_type
== INFRA
)
2106 && !(local
->sparm
.b4
.a_acting_as_ap_status
)) {
2107 authenticate(local
);
2109 local
->card_status
= CARD_ACQ_COMPLETE
;
2112 local
->card_status
= CARD_ACQ_FAILED
;
2114 del_timer(&local
->timer
);
2115 local
->timer
.expires
= jiffies
+ HZ
*5;
2116 local
->timer
.data
= (long)local
;
2117 if (status
== CCS_START_NETWORK
) {
2118 DEBUG(0,"ray_cs interrupt network \"%s\" start failed\n",\
2119 local
->sparm
.b4
.a_current_ess_id
);
2120 local
->timer
.function
= &start_net
;
2123 DEBUG(0,"ray_cs interrupt network \"%s\" join failed\n",\
2124 local
->sparm
.b4
.a_current_ess_id
);
2125 local
->timer
.function
= &join_net
;
2127 add_timer(&local
->timer
);
2130 case CCS_START_ASSOCIATION
:
2131 if (status
== CCS_COMMAND_COMPLETE
) {
2132 local
->card_status
= CARD_ASSOC_COMPLETE
;
2133 DEBUG(0,"ray_cs association successful\n");
2137 DEBUG(0,"ray_cs association failed,\n");
2138 local
->card_status
= CARD_ASSOC_FAILED
;
2139 join_net((u_long
)local
);
2142 case CCS_TX_REQUEST
:
2143 if (status
== CCS_COMMAND_COMPLETE
) {
2144 DEBUG(3,"ray_cs interrupt tx request complete\n");
2147 DEBUG(1,"ray_cs interrupt tx request failed\n");
2149 if (!sniffer
) netif_start_queue(dev
);
2150 netif_wake_queue(dev
);
2152 case CCS_TEST_MEMORY
:
2153 DEBUG(1,"ray_cs interrupt mem test done\n");
2156 DEBUG(1,"ray_cs interrupt Unexpected CCS returned - Shutdown\n");
2158 case CCS_DUMP_MEMORY
:
2159 DEBUG(1,"ray_cs interrupt dump memory done\n");
2161 case CCS_START_TIMER
:
2162 DEBUG(2,"ray_cs interrupt DING - raylink timer expired\n");
2165 DEBUG(1,"ray_cs interrupt Unexpected CCS 0x%x returned 0x%x\n",\
2168 writeb(CCS_BUFFER_FREE
, &pccs
->buffer_status
);
2170 else /* It's an RCS */
2172 prcs
= rcs_base(local
) + rcsindex
;
2174 switch (readb(&prcs
->interrupt_id
))
2176 case PROCESS_RX_PACKET
:
2177 ray_rx(dev
, local
, prcs
);
2179 case REJOIN_NET_COMPLETE
:
2180 DEBUG(1,"ray_cs interrupt rejoin net complete\n");
2181 local
->card_status
= CARD_ACQ_COMPLETE
;
2182 /* do we need to clear tx buffers CCS's? */
2183 if (local
->sparm
.b4
.a_network_type
== ADHOC
) {
2184 if (!sniffer
) netif_start_queue(dev
);
2187 memcpy_fromio(&local
->bss_id
, prcs
->var
.rejoin_net_complete
.bssid
, ADDRLEN
);
2188 DEBUG(1,"ray_cs new BSSID = %02x%02x%02x%02x%02x%02x\n",\
2189 local
->bss_id
[0], local
->bss_id
[1], local
->bss_id
[2],\
2190 local
->bss_id
[3], local
->bss_id
[4], local
->bss_id
[5]);
2191 if (!sniffer
) authenticate(local
);
2194 case ROAMING_INITIATED
:
2195 DEBUG(1,"ray_cs interrupt roaming initiated\n");
2196 netif_stop_queue(dev
);
2197 local
->card_status
= CARD_DOING_ACQ
;
2199 case JAPAN_CALL_SIGN_RXD
:
2200 DEBUG(1,"ray_cs interrupt japan call sign rx\n");
2203 DEBUG(1,"ray_cs Unexpected interrupt for RCS 0x%x cmd = 0x%x\n",\
2204 rcsindex
, (unsigned int) readb(&prcs
->interrupt_id
));
2207 writeb(CCS_BUFFER_FREE
, &prcs
->buffer_status
);
2209 clear_interrupt(local
);
2211 } /* ray_interrupt */
2212 /*===========================================================================*/
2213 static void ray_rx(struct net_device
*dev
, ray_dev_t
*local
, struct rcs __iomem
*prcs
)
2216 unsigned int pkt_addr
;
2218 DEBUG(4,"ray_rx process rx packet\n");
2220 /* Calculate address of packet within Rx buffer */
2221 pkt_addr
= ((readb(&prcs
->var
.rx_packet
.rx_data_ptr
[0]) << 8)
2222 + readb(&prcs
->var
.rx_packet
.rx_data_ptr
[1])) & RX_BUFF_END
;
2223 /* Length of first packet fragment */
2224 rx_len
= (readb(&prcs
->var
.rx_packet
.rx_data_length
[0]) << 8)
2225 + readb(&prcs
->var
.rx_packet
.rx_data_length
[1]);
2227 local
->last_rsl
= readb(&prcs
->var
.rx_packet
.rx_sig_lev
);
2228 pmsg
= local
->rmem
+ pkt_addr
;
2232 DEBUG(4,"ray_rx data type\n");
2233 rx_data(dev
, prcs
, pkt_addr
, rx_len
);
2235 case AUTHENTIC_TYPE
:
2236 DEBUG(4,"ray_rx authentic type\n");
2237 if (sniffer
) rx_data(dev
, prcs
, pkt_addr
, rx_len
);
2238 else rx_authenticate(local
, prcs
, pkt_addr
, rx_len
);
2240 case DEAUTHENTIC_TYPE
:
2241 DEBUG(4,"ray_rx deauth type\n");
2242 if (sniffer
) rx_data(dev
, prcs
, pkt_addr
, rx_len
);
2243 else rx_deauthenticate(local
, prcs
, pkt_addr
, rx_len
);
2246 DEBUG(3,"ray_cs rx NULL msg\n");
2249 DEBUG(4,"ray_rx beacon type\n");
2250 if (sniffer
) rx_data(dev
, prcs
, pkt_addr
, rx_len
);
2252 copy_from_rx_buff(local
, (UCHAR
*)&local
->last_bcn
, pkt_addr
,
2253 rx_len
< sizeof(struct beacon_rx
) ?
2254 rx_len
: sizeof(struct beacon_rx
));
2256 local
->beacon_rxed
= 1;
2257 /* Get the statistics so the card counters never overflow */
2261 DEBUG(0,"ray_cs unknown pkt type %2x\n", (unsigned int) readb(pmsg
));
2266 /*===========================================================================*/
2267 static void rx_data(struct net_device
*dev
, struct rcs __iomem
*prcs
, unsigned int pkt_addr
,
2270 struct sk_buff
*skb
= NULL
;
2271 struct rcs __iomem
*prcslink
= prcs
;
2272 ray_dev_t
*local
= dev
->priv
;
2277 int siglev
= local
->last_rsl
;
2278 u_char linksrcaddr
[ETH_ALEN
]; /* Other end of the wireless link */
2283 /* TBD length needs fixing for translated header */
2284 if (rx_len
< (ETH_HLEN
+ RX_MAC_HEADER_LENGTH
) ||
2285 rx_len
> (dev
->mtu
+ RX_MAC_HEADER_LENGTH
+ ETH_HLEN
+ FCS_LEN
))
2287 DEBUG(0,"ray_cs invalid packet length %d received \n",rx_len
);
2291 else /* encapsulated ethernet */ {
2292 if (rx_len
< (ETH_HLEN
+ RX_MAC_HEADER_LENGTH
) ||
2293 rx_len
> (dev
->mtu
+ RX_MAC_HEADER_LENGTH
+ ETH_HLEN
+ FCS_LEN
))
2295 DEBUG(0,"ray_cs invalid packet length %d received \n",rx_len
);
2300 DEBUG(4,"ray_cs rx_data packet\n");
2301 /* If fragmented packet, verify sizes of fragments add up */
2302 if (readb(&prcs
->var
.rx_packet
.next_frag_rcs_index
) != 0xFF) {
2303 DEBUG(1,"ray_cs rx'ed fragment\n");
2304 tmp
= (readb(&prcs
->var
.rx_packet
.totalpacketlength
[0]) << 8)
2305 + readb(&prcs
->var
.rx_packet
.totalpacketlength
[1]);
2309 tmp
-= (readb(&prcslink
->var
.rx_packet
.rx_data_length
[0]) << 8)
2310 + readb(&prcslink
->var
.rx_packet
.rx_data_length
[1]);
2311 if (readb(&prcslink
->var
.rx_packet
.next_frag_rcs_index
) == 0xFF
2313 prcslink
= rcs_base(local
)
2314 + readb(&prcslink
->link_field
);
2319 DEBUG(0,"ray_cs rx_data fragment lengths don't add up\n");
2320 local
->stats
.rx_dropped
++;
2321 release_frag_chain(local
, prcs
);
2325 else { /* Single unfragmented packet */
2329 skb
= dev_alloc_skb( total_len
+5 );
2332 DEBUG(0,"ray_cs rx_data could not allocate skb\n");
2333 local
->stats
.rx_dropped
++;
2334 if (readb(&prcs
->var
.rx_packet
.next_frag_rcs_index
) != 0xFF)
2335 release_frag_chain(local
, prcs
);
2338 skb_reserve( skb
, 2); /* Align IP on 16 byte (TBD check this)*/
2341 DEBUG(4,"ray_cs rx_data total_len = %x, rx_len = %x\n",total_len
,rx_len
);
2343 /************************/
2344 /* Reserve enough room for the whole damn packet. */
2345 rx_ptr
= skb_put( skb
, total_len
);
2346 /* Copy the whole packet to sk_buff */
2347 rx_ptr
+= copy_from_rx_buff(local
, rx_ptr
, pkt_addr
& RX_BUFF_END
, rx_len
);
2348 /* Get source address */
2350 memcpy(linksrcaddr
, ((struct mac_header
*)skb
->data
)->addr_2
, ETH_ALEN
);
2352 /* Now, deal with encapsulation/translation/sniffer */
2355 /* Encapsulated ethernet, so just lop off 802.11 MAC header */
2356 /* TBD reserve skb_reserve( skb, RX_MAC_HEADER_LENGTH); */
2357 skb_pull( skb
, RX_MAC_HEADER_LENGTH
);
2360 /* Do translation */
2361 untranslate(local
, skb
, total_len
);
2365 { /* sniffer mode, so just pass whole packet */ };
2367 /************************/
2368 /* Now pick up the rest of the fragments if any */
2370 if (readb(&prcs
->var
.rx_packet
.next_frag_rcs_index
) != 0xFF) {
2372 DEBUG(1,"ray_cs rx_data in fragment loop\n");
2374 prcslink
= rcs_base(local
)
2375 + readb(&prcslink
->var
.rx_packet
.next_frag_rcs_index
);
2376 rx_len
= (( readb(&prcslink
->var
.rx_packet
.rx_data_length
[0]) << 8)
2377 + readb(&prcslink
->var
.rx_packet
.rx_data_length
[1]))
2379 pkt_addr
= (( readb(&prcslink
->var
.rx_packet
.rx_data_ptr
[0]) << 8)
2380 + readb(&prcslink
->var
.rx_packet
.rx_data_ptr
[1]))
2383 rx_ptr
+= copy_from_rx_buff(local
, rx_ptr
, pkt_addr
, rx_len
);
2386 readb(&prcslink
->var
.rx_packet
.next_frag_rcs_index
) != 0xFF);
2387 release_frag_chain(local
, prcs
);
2390 skb
->protocol
= eth_type_trans(skb
,dev
);
2392 dev
->last_rx
= jiffies
;
2393 local
->stats
.rx_packets
++;
2394 local
->stats
.rx_bytes
+= total_len
;
2396 /* Gather signal strength per address */
2398 /* For the Access Point or the node having started the ad-hoc net
2399 * note : ad-hoc work only in some specific configurations, but we
2400 * kludge in ray_get_wireless_stats... */
2401 if(!memcmp(linksrcaddr
, local
->bss_id
, ETH_ALEN
))
2403 /* Update statistics */
2404 /*local->wstats.qual.qual = none ? */
2405 local
->wstats
.qual
.level
= siglev
;
2406 /*local->wstats.qual.noise = none ? */
2407 local
->wstats
.qual
.updated
= 0x2;
2409 /* Now, for the addresses in the spy list */
2412 /* Look all addresses */
2413 for(i
= 0; i
< local
->spy_number
; i
++)
2415 if(!memcmp(linksrcaddr
, local
->spy_address
[i
], ETH_ALEN
))
2417 /* Update statistics */
2418 /*local->spy_stat[i].qual = none ? */
2419 local
->spy_stat
[i
].level
= siglev
;
2420 /*local->spy_stat[i].noise = none ? */
2421 local
->spy_stat
[i
].updated
= 0x2;
2424 #endif /* WIRELESS_SPY */
2426 /*===========================================================================*/
2427 static void untranslate(ray_dev_t
*local
, struct sk_buff
*skb
, int len
)
2429 snaphdr_t
*psnap
= (snaphdr_t
*)(skb
->data
+ RX_MAC_HEADER_LENGTH
);
2430 struct mac_header
*pmac
= (struct mac_header
*)skb
->data
;
2431 unsigned short type
= *(unsigned short *)psnap
->ethertype
;
2432 unsigned int xsap
= *(unsigned int *)psnap
& 0x00ffffff;
2433 unsigned int org
= (*(unsigned int *)psnap
->org
) & 0x00ffffff;
2435 struct ethhdr
*peth
;
2436 UCHAR srcaddr
[ADDRLEN
];
2437 UCHAR destaddr
[ADDRLEN
];
2439 if (pmac
->frame_ctl_2
& FC2_FROM_DS
) {
2440 if (pmac
->frame_ctl_2
& FC2_TO_DS
) { /* AP to AP */
2441 memcpy(destaddr
, pmac
->addr_3
, ADDRLEN
);
2442 memcpy(srcaddr
, ((unsigned char *)pmac
->addr_3
) + ADDRLEN
, ADDRLEN
);
2443 } else { /* AP to terminal */
2444 memcpy(destaddr
, pmac
->addr_1
, ADDRLEN
);
2445 memcpy(srcaddr
, pmac
->addr_3
, ADDRLEN
);
2447 } else { /* Terminal to AP */
2448 if (pmac
->frame_ctl_2
& FC2_TO_DS
) {
2449 memcpy(destaddr
, pmac
->addr_3
, ADDRLEN
);
2450 memcpy(srcaddr
, pmac
->addr_2
, ADDRLEN
);
2451 } else { /* Adhoc */
2452 memcpy(destaddr
, pmac
->addr_1
, ADDRLEN
);
2453 memcpy(srcaddr
, pmac
->addr_2
, ADDRLEN
);
2460 printk(KERN_DEBUG
"skb->data before untranslate");
2462 printk("%02x ",skb
->data
[i
]);
2463 printk("\n" KERN_DEBUG
"type = %08x, xsap = %08x, org = %08x\n",
2465 printk(KERN_DEBUG
"untranslate skb->data = %p\n",skb
->data
);
2469 if ( xsap
!= SNAP_ID
) {
2470 /* not a snap type so leave it alone */
2471 DEBUG(3,"ray_cs untranslate NOT SNAP %x\n", *(unsigned int *)psnap
& 0x00ffffff);
2473 delta
= RX_MAC_HEADER_LENGTH
- ETH_HLEN
;
2474 peth
= (struct ethhdr
*)(skb
->data
+ delta
);
2475 peth
->h_proto
= htons(len
- RX_MAC_HEADER_LENGTH
);
2477 else { /* Its a SNAP */
2478 if (org
== BRIDGE_ENCAP
) { /* EtherII and nuke the LLC */
2479 DEBUG(3,"ray_cs untranslate Bridge encap\n");
2480 delta
= RX_MAC_HEADER_LENGTH
2481 + sizeof(struct snaphdr_t
) - ETH_HLEN
;
2482 peth
= (struct ethhdr
*)(skb
->data
+ delta
);
2483 peth
->h_proto
= type
;
2486 if (org
== RFC1042_ENCAP
) {
2490 DEBUG(3,"ray_cs untranslate RFC IPX/AARP\n");
2491 delta
= RX_MAC_HEADER_LENGTH
- ETH_HLEN
;
2492 peth
= (struct ethhdr
*)(skb
->data
+ delta
);
2493 peth
->h_proto
= htons(len
- RX_MAC_HEADER_LENGTH
);
2496 DEBUG(3,"ray_cs untranslate RFC default\n");
2497 delta
= RX_MAC_HEADER_LENGTH
+
2498 sizeof(struct snaphdr_t
) - ETH_HLEN
;
2499 peth
= (struct ethhdr
*)(skb
->data
+ delta
);
2500 peth
->h_proto
= type
;
2505 printk("ray_cs untranslate very confused by packet\n");
2506 delta
= RX_MAC_HEADER_LENGTH
- ETH_HLEN
;
2507 peth
= (struct ethhdr
*)(skb
->data
+ delta
);
2508 peth
->h_proto
= type
;
2512 /* TBD reserve skb_reserve(skb, delta); */
2513 skb_pull(skb
, delta
);
2514 DEBUG(3,"untranslate after skb_pull(%d), skb->data = %p\n",delta
,skb
->data
);
2515 memcpy(peth
->h_dest
, destaddr
, ADDRLEN
);
2516 memcpy(peth
->h_source
, srcaddr
, ADDRLEN
);
2520 printk(KERN_DEBUG
"skb->data after untranslate:");
2522 printk("%02x ",skb
->data
[i
]);
2526 } /* end untranslate */
2527 /*===========================================================================*/
2528 /* Copy data from circular receive buffer to PC memory.
2529 * dest = destination address in PC memory
2530 * pkt_addr = source address in receive buffer
2531 * len = length of packet to copy
2533 static int copy_from_rx_buff(ray_dev_t
*local
, UCHAR
*dest
, int pkt_addr
, int length
)
2535 int wrap_bytes
= (pkt_addr
+ length
) - (RX_BUFF_END
+ 1);
2536 if (wrap_bytes
<= 0)
2538 memcpy_fromio(dest
,local
->rmem
+ pkt_addr
,length
);
2540 else /* Packet wrapped in circular buffer */
2542 memcpy_fromio(dest
,local
->rmem
+pkt_addr
,length
- wrap_bytes
);
2543 memcpy_fromio(dest
+ length
- wrap_bytes
, local
->rmem
, wrap_bytes
);
2547 /*===========================================================================*/
2548 static void release_frag_chain(ray_dev_t
*local
, struct rcs __iomem
* prcs
)
2550 struct rcs __iomem
*prcslink
= prcs
;
2552 unsigned rcsindex
= readb(&prcs
->var
.rx_packet
.next_frag_rcs_index
);
2555 writeb(CCS_BUFFER_FREE
, &prcslink
->buffer_status
);
2556 if (rcsindex
>= (NUMBER_OF_CCS
+ NUMBER_OF_RCS
)) {
2557 DEBUG(1,"ray_cs interrupt bad rcsindex = 0x%x\n",rcsindex
);
2560 prcslink
= rcs_base(local
) + rcsindex
;
2561 rcsindex
= readb(&prcslink
->var
.rx_packet
.next_frag_rcs_index
);
2563 writeb(CCS_BUFFER_FREE
, &prcslink
->buffer_status
);
2565 /*===========================================================================*/
2566 static void authenticate(ray_dev_t
*local
)
2568 dev_link_t
*link
= local
->finder
;
2569 DEBUG(0,"ray_cs Starting authentication.\n");
2570 if (!(link
->state
& DEV_PRESENT
)) {
2571 DEBUG(2,"ray_cs authenticate - device not present\n");
2575 del_timer(&local
->timer
);
2576 if (build_auth_frame(local
, local
->bss_id
, OPEN_AUTH_REQUEST
)) {
2577 local
->timer
.function
= &join_net
;
2580 local
->timer
.function
= &authenticate_timeout
;
2582 local
->timer
.expires
= jiffies
+ HZ
*2;
2583 local
->timer
.data
= (long)local
;
2584 add_timer(&local
->timer
);
2585 local
->authentication_state
= AWAITING_RESPONSE
;
2586 } /* end authenticate */
2587 /*===========================================================================*/
2588 static void rx_authenticate(ray_dev_t
*local
, struct rcs __iomem
*prcs
,
2589 unsigned int pkt_addr
, int rx_len
)
2592 struct rx_msg
*msg
= (struct rx_msg
*)buff
;
2594 del_timer(&local
->timer
);
2596 copy_from_rx_buff(local
, buff
, pkt_addr
, rx_len
& 0xff);
2597 /* if we are trying to get authenticated */
2598 if (local
->sparm
.b4
.a_network_type
== ADHOC
) {
2599 DEBUG(1,"ray_cs rx_auth var= %02x %02x %02x %02x %02x %02x\n", msg
->var
[0],msg
->var
[1],msg
->var
[2],msg
->var
[3],msg
->var
[4],msg
->var
[5]);
2600 if (msg
->var
[2] == 1) {
2601 DEBUG(0,"ray_cs Sending authentication response.\n");
2602 if (!build_auth_frame (local
, msg
->mac
.addr_2
, OPEN_AUTH_RESPONSE
)) {
2603 local
->authentication_state
= NEED_TO_AUTH
;
2604 memcpy(local
->auth_id
, msg
->mac
.addr_2
, ADDRLEN
);
2608 else /* Infrastructure network */
2610 if (local
->authentication_state
== AWAITING_RESPONSE
) {
2611 /* Verify authentication sequence #2 and success */
2612 if (msg
->var
[2] == 2) {
2613 if ((msg
->var
[3] | msg
->var
[4]) == 0) {
2614 DEBUG(1,"Authentication successful\n");
2615 local
->card_status
= CARD_AUTH_COMPLETE
;
2617 local
->authentication_state
= AUTHENTICATED
;
2620 DEBUG(0,"Authentication refused\n");
2621 local
->card_status
= CARD_AUTH_REFUSED
;
2622 join_net((u_long
)local
);
2623 local
->authentication_state
= UNAUTHENTICATED
;
2629 } /* end rx_authenticate */
2630 /*===========================================================================*/
2631 static void associate(ray_dev_t
*local
)
2633 struct ccs __iomem
*pccs
;
2634 dev_link_t
*link
= local
->finder
;
2635 struct net_device
*dev
= link
->priv
;
2637 if (!(link
->state
& DEV_PRESENT
)) {
2638 DEBUG(2,"ray_cs associate - device not present\n");
2641 /* If no tx buffers available, return*/
2642 if ((ccsindex
= get_free_ccs(local
)) < 0)
2644 /* TBD should never be here but... what if we are? */
2645 DEBUG(1,"ray_cs associate - No free ccs\n");
2648 DEBUG(1,"ray_cs Starting association with access point\n");
2649 pccs
= ccs_base(local
) + ccsindex
;
2650 /* fill in the CCS */
2651 writeb(CCS_START_ASSOCIATION
, &pccs
->cmd
);
2652 /* Interrupt the firmware to process the command */
2653 if (interrupt_ecf(local
, ccsindex
)) {
2654 DEBUG(1,"ray_cs associate failed - ECF not ready for intr\n");
2655 writeb(CCS_BUFFER_FREE
, &(pccs
++)->buffer_status
);
2657 del_timer(&local
->timer
);
2658 local
->timer
.expires
= jiffies
+ HZ
*2;
2659 local
->timer
.data
= (long)local
;
2660 local
->timer
.function
= &join_net
;
2661 add_timer(&local
->timer
);
2662 local
->card_status
= CARD_ASSOC_FAILED
;
2665 if (!sniffer
) netif_start_queue(dev
);
2667 } /* end associate */
2668 /*===========================================================================*/
2669 static void rx_deauthenticate(ray_dev_t
*local
, struct rcs __iomem
*prcs
,
2670 unsigned int pkt_addr
, int rx_len
)
2673 struct rx_msg *msg = (struct rx_msg *)buff;
2675 DEBUG(0,"Deauthentication frame received\n");
2676 local
->authentication_state
= UNAUTHENTICATED
;
2677 /* Need to reauthenticate or rejoin depending on reason code */
2678 /* copy_from_rx_buff(local, buff, pkt_addr, rx_len & 0xff);
2681 /*===========================================================================*/
2682 static void clear_interrupt(ray_dev_t
*local
)
2684 writeb(0, local
->amem
+ CIS_OFFSET
+ HCS_INTR_OFFSET
);
2686 /*===========================================================================*/
2687 #ifdef CONFIG_PROC_FS
2688 #define MAXDATA (PAGE_SIZE - 80)
2690 static char *card_status
[] = {
2691 "Card inserted - uninitialized", /* 0 */
2692 "Card not downloaded", /* 1 */
2693 "Waiting for download parameters", /* 2 */
2694 "Card doing acquisition", /* 3 */
2695 "Acquisition complete", /* 4 */
2696 "Authentication complete", /* 5 */
2697 "Association complete", /* 6 */
2698 "???", "???", "???", "???", /* 7 8 9 10 undefined */
2699 "Card init error", /* 11 */
2700 "Download parameters error", /* 12 */
2702 "Acquisition failed", /* 14 */
2703 "Authentication refused", /* 15 */
2704 "Association failed" /* 16 */
2707 static char *nettype
[] = {"Adhoc", "Infra "};
2708 static char *framing
[] = {"Encapsulation", "Translation"}
2710 /*===========================================================================*/
2711 static int ray_cs_proc_read(char *buf
, char **start
, off_t offset
, int len
)
2713 /* Print current values which are not available via other means
2718 struct net_device
*dev
;
2721 struct freq_hop_element
*pfh
;
2727 dev
= (struct net_device
*)link
->priv
;
2730 local
= (ray_dev_t
*)dev
->priv
;
2736 len
+= sprintf(buf
+ len
, "Raylink Wireless LAN driver status\n");
2737 len
+= sprintf(buf
+ len
, "%s\n", rcsid
);
2738 /* build 4 does not report version, and field is 0x55 after memtest */
2739 len
+= sprintf(buf
+ len
, "Firmware version = ");
2740 if (local
->fw_ver
== 0x55)
2741 len
+= sprintf(buf
+ len
, "4 - Use dump_cis for more details\n");
2743 len
+= sprintf(buf
+ len
, "%2d.%02d.%02d\n",
2744 local
->fw_ver
, local
->fw_bld
, local
->fw_var
);
2746 for (i
=0; i
<32; i
++) c
[i
] = local
->sparm
.b5
.a_current_ess_id
[i
];
2748 len
+= sprintf(buf
+ len
, "%s network ESSID = \"%s\"\n",
2749 nettype
[local
->sparm
.b5
.a_network_type
], c
);
2752 len
+= sprintf(buf
+ len
,
2753 "BSSID = %02x:%02x:%02x:%02x:%02x:%02x\n",
2754 p
[0],p
[1],p
[2],p
[3],p
[4],p
[5]);
2756 len
+= sprintf(buf
+ len
, "Country code = %d\n",
2757 local
->sparm
.b5
.a_curr_country_code
);
2759 i
= local
->card_status
;
2762 len
+= sprintf(buf
+ len
, "Card status = %s\n", card_status
[i
]);
2764 len
+= sprintf(buf
+ len
, "Framing mode = %s\n",framing
[translate
]);
2766 len
+= sprintf(buf
+ len
, "Last pkt signal lvl = %d\n", local
->last_rsl
);
2768 if (local
->beacon_rxed
) {
2769 /* Pull some fields out of last beacon received */
2770 len
+= sprintf(buf
+ len
, "Beacon Interval = %d Kus\n",
2771 local
->last_bcn
.beacon_intvl
[0]
2772 + 256 * local
->last_bcn
.beacon_intvl
[1]);
2774 p
= local
->last_bcn
.elements
;
2775 if (p
[0] == C_ESSID_ELEMENT_ID
) p
+= p
[1] + 2;
2777 len
+= sprintf(buf
+ len
, "Parse beacon failed at essid element id = %d\n",p
[0]);
2781 if (p
[0] == C_SUPPORTED_RATES_ELEMENT_ID
) {
2782 len
+= sprintf(buf
+ len
, "Supported rate codes = ");
2783 for (i
=2; i
<p
[1] + 2; i
++)
2784 len
+= sprintf(buf
+ len
, "0x%02x ", p
[i
]);
2785 len
+= sprintf(buf
+ len
, "\n");
2789 len
+= sprintf(buf
+ len
, "Parse beacon failed at rates element\n");
2793 if (p
[0] == C_FH_PARAM_SET_ELEMENT_ID
) {
2794 pfh
= (struct freq_hop_element
*)p
;
2795 len
+= sprintf(buf
+ len
, "Hop dwell = %d Kus\n",
2796 pfh
->dwell_time
[0] + 256 * pfh
->dwell_time
[1]);
2797 len
+= sprintf(buf
+ len
, "Hop set = %d \n", pfh
->hop_set
);
2798 len
+= sprintf(buf
+ len
, "Hop pattern = %d \n", pfh
->hop_pattern
);
2799 len
+= sprintf(buf
+ len
, "Hop index = %d \n", pfh
->hop_index
);
2803 len
+= sprintf(buf
+ len
, "Parse beacon failed at FH param element\n");
2807 len
+= sprintf(buf
+ len
, "No beacons received\n");
2813 /*===========================================================================*/
2814 static int build_auth_frame(ray_dev_t
*local
, UCHAR
*dest
, int auth_type
)
2817 struct ccs __iomem
*pccs
;
2818 struct tx_msg __iomem
*ptx
;
2821 /* If no tx buffers available, return */
2822 if ((ccsindex
= get_free_tx_ccs(local
)) < 0)
2824 DEBUG(1,"ray_cs send authenticate - No free tx ccs\n");
2828 pccs
= ccs_base(local
) + ccsindex
;
2830 /* Address in card space */
2831 addr
= TX_BUF_BASE
+ (ccsindex
<< 11);
2832 /* fill in the CCS */
2833 writeb(CCS_TX_REQUEST
, &pccs
->cmd
);
2834 writeb(addr
>> 8, pccs
->var
.tx_request
.tx_data_ptr
);
2835 writeb(0x20, pccs
->var
.tx_request
.tx_data_ptr
+ 1);
2836 writeb(TX_AUTHENTICATE_LENGTH_MSB
, pccs
->var
.tx_request
.tx_data_length
);
2837 writeb(TX_AUTHENTICATE_LENGTH_LSB
,pccs
->var
.tx_request
.tx_data_length
+ 1);
2838 writeb(0, &pccs
->var
.tx_request
.pow_sav_mode
);
2840 ptx
= local
->sram
+ addr
;
2841 /* fill in the mac header */
2842 writeb(PROTOCOL_VER
| AUTHENTIC_TYPE
, &ptx
->mac
.frame_ctl_1
);
2843 writeb(0, &ptx
->mac
.frame_ctl_2
);
2845 memcpy_toio(ptx
->mac
.addr_1
, dest
, ADDRLEN
);
2846 memcpy_toio(ptx
->mac
.addr_2
, local
->sparm
.b4
.a_mac_addr
, ADDRLEN
);
2847 memcpy_toio(ptx
->mac
.addr_3
, local
->bss_id
, ADDRLEN
);
2849 /* Fill in msg body with protocol 00 00, sequence 01 00 ,status 00 00 */
2850 memset_io(ptx
->var
, 0, 6);
2851 writeb(auth_type
& 0xff, ptx
->var
+ 2);
2853 /* Interrupt the firmware to process the command */
2854 if (interrupt_ecf(local
, ccsindex
)) {
2855 DEBUG(1,"ray_cs send authentication request failed - ECF not ready for intr\n");
2856 writeb(CCS_BUFFER_FREE
, &(pccs
++)->buffer_status
);
2860 } /* End build_auth_frame */
2862 /*===========================================================================*/
2863 #ifdef CONFIG_PROC_FS
2864 static void raycs_write(const char *name
, write_proc_t
*w
, void *data
)
2866 struct proc_dir_entry
* entry
= create_proc_entry(name
, S_IFREG
| S_IWUSR
, NULL
);
2868 entry
->write_proc
= w
;
2873 static int write_essid(struct file
*file
, const char __user
*buffer
, unsigned long count
, void *data
)
2875 static char proc_essid
[33];
2880 memset(proc_essid
, 0, 33);
2881 if (copy_from_user(proc_essid
, buffer
, len
))
2887 static int write_int(struct file
*file
, const char __user
*buffer
, unsigned long count
, void *data
)
2889 static char proc_number
[10];
2898 if (copy_from_user(proc_number
, buffer
, count
))
2904 unsigned int c
= *p
- '0';
2915 static struct pcmcia_driver ray_driver
= {
2916 .owner
= THIS_MODULE
,
2920 .attach
= ray_attach
,
2921 .detach
= ray_detach
,
2924 static int __init
init_ray_cs(void)
2928 DEBUG(1, "%s\n", rcsid
);
2929 rc
= pcmcia_register_driver(&ray_driver
);
2930 DEBUG(1, "raylink init_module register_pcmcia_driver returns 0x%x\n",rc
);
2932 #ifdef CONFIG_PROC_FS
2933 proc_mkdir("driver/ray_cs", NULL
);
2935 create_proc_info_entry("driver/ray_cs/ray_cs", 0, NULL
, &ray_cs_proc_read
);
2936 raycs_write("driver/ray_cs/essid", write_essid
, NULL
);
2937 raycs_write("driver/ray_cs/net_type", write_int
, &net_type
);
2938 raycs_write("driver/ray_cs/translate", write_int
, &translate
);
2940 if (translate
!= 0) translate
= 1;
2944 /*===========================================================================*/
2946 static void __exit
exit_ray_cs(void)
2948 DEBUG(0, "ray_cs: cleanup_module\n");
2950 #ifdef CONFIG_PROC_FS
2951 remove_proc_entry("driver/ray_cs/ray_cs", NULL
);
2952 remove_proc_entry("driver/ray_cs/essid", NULL
);
2953 remove_proc_entry("driver/ray_cs/net_type", NULL
);
2954 remove_proc_entry("driver/ray_cs/translate", NULL
);
2955 remove_proc_entry("driver/ray_cs", NULL
);
2958 pcmcia_unregister_driver(&ray_driver
);
2959 while (dev_list
!= NULL
)
2960 ray_detach(dev_list
);
2963 module_init(init_ray_cs
);
2964 module_exit(exit_ray_cs
);
2966 /*===========================================================================*/