1/*
2 *  smctr.c: A network driver for the SMC Token Ring Adapters.
3 *
4 *  Written by Jay Schulist <jschlst@samba.org>
5 *
6 *  This software may be used and distributed according to the terms
7 *  of the GNU General Public License, incorporated herein by reference.
8 *
9 *  This device driver works with the following SMC adapters:
10 *      - SMC TokenCard Elite   (8115T, chips 825/584)
11 *      - SMC TokenCard Elite/A MCA (8115T/A, chips 825/594)
12 *
13 *  Source(s):
14 *  	- SMC TokenCard SDK.
15 *
16 *  Maintainer(s):
17 *    JS        Jay Schulist <jschlst@samba.org>
18 *
19 * Changes:
20 *    07102000          JS      Fixed a timing problem in smctr_wait_cmd();
21 *                              Also added a bit more discriptive error msgs.
22 *    07122000          JS      Fixed problem with detecting a card with
23 *				module io/irq/mem specified.
24 *
25 *  To do:
26 *    1. Multicast support.
27 *
28 *  Initial 2.5 cleanup Alan Cox <alan@redhat.com>  2002/10/28
29 */
30
31#include <linux/module.h>
32#include <linux/kernel.h>
33#include <linux/types.h>
34#include <linux/fcntl.h>
35#include <linux/interrupt.h>
36#include <linux/ptrace.h>
37#include <linux/ioport.h>
38#include <linux/in.h>
39#include <linux/slab.h>
40#include <linux/string.h>
41#include <linux/time.h>
42#include <linux/errno.h>
43#include <linux/init.h>
44#include <linux/mca-legacy.h>
45#include <linux/delay.h>
46#include <linux/netdevice.h>
47#include <linux/etherdevice.h>
48#include <linux/skbuff.h>
49#include <linux/trdevice.h>
50#include <linux/bitops.h>
51
52#include <asm/system.h>
53#include <asm/io.h>
54#include <asm/dma.h>
55#include <asm/irq.h>
56
57#if BITS_PER_LONG == 64
58#error FIXME: driver does not support 64-bit platforms
59#endif
60
61#include "smctr.h"               /* Our Stuff */
62#include "smctr_firmware.h"      /* SMC adapter firmware */
63
64static char version[] __initdata = KERN_INFO "smctr.c: v1.4 7/12/00 by jschlst@samba.org\n";
65static const char cardname[] = "smctr";
66
67
68#define SMCTR_IO_EXTENT   20
69
70#ifdef CONFIG_MCA_LEGACY
71static unsigned int smctr_posid = 0x6ec6;
72#endif
73
74static int ringspeed;
75
76/* SMC Name of the Adapter. */
77static char smctr_name[] = "SMC TokenCard";
78static char *smctr_model = "Unknown";
79
80/* Use 0 for production, 1 for verification, 2 for debug, and
81 * 3 for very verbose debug.
82 */
83#ifndef SMCTR_DEBUG
84#define SMCTR_DEBUG 1
85#endif
86static unsigned int smctr_debug = SMCTR_DEBUG;
87
88/* smctr.c prototypes and functions are arranged alphabeticly
89 * for clearity, maintainability and pure old fashion fun.
90 */
91/* A */
92static int smctr_alloc_shared_memory(struct net_device *dev);
93
94/* B */
95static int smctr_bypass_state(struct net_device *dev);
96
97/* C */
98static int smctr_checksum_firmware(struct net_device *dev);
99static int __init smctr_chk_isa(struct net_device *dev);
100static int smctr_chg_rx_mask(struct net_device *dev);
101static int smctr_clear_int(struct net_device *dev);
102static int smctr_clear_trc_reset(int ioaddr);
103static int smctr_close(struct net_device *dev);
104
105/* D */
106static int smctr_decode_firmware(struct net_device *dev);
107static int smctr_disable_16bit(struct net_device *dev);
108static int smctr_disable_adapter_ctrl_store(struct net_device *dev);
109static int smctr_disable_bic_int(struct net_device *dev);
110
111/* E */
112static int smctr_enable_16bit(struct net_device *dev);
113static int smctr_enable_adapter_ctrl_store(struct net_device *dev);
114static int smctr_enable_adapter_ram(struct net_device *dev);
115static int smctr_enable_bic_int(struct net_device *dev);
116
117/* G */
118static int __init smctr_get_boardid(struct net_device *dev, int mca);
119static int smctr_get_group_address(struct net_device *dev);
120static int smctr_get_functional_address(struct net_device *dev);
121static unsigned int smctr_get_num_rx_bdbs(struct net_device *dev);
122static int smctr_get_physical_drop_number(struct net_device *dev);
123static __u8 *smctr_get_rx_pointer(struct net_device *dev, short queue);
124static int smctr_get_station_id(struct net_device *dev);
125static struct net_device_stats *smctr_get_stats(struct net_device *dev);
126static FCBlock *smctr_get_tx_fcb(struct net_device *dev, __u16 queue,
127        __u16 bytes_count);
128static int smctr_get_upstream_neighbor_addr(struct net_device *dev);
129
130/* H */
131static int smctr_hardware_send_packet(struct net_device *dev,
132        struct net_local *tp);
133/* I */
134static int smctr_init_acbs(struct net_device *dev);
135static int smctr_init_adapter(struct net_device *dev);
136static int smctr_init_card_real(struct net_device *dev);
137static int smctr_init_rx_bdbs(struct net_device *dev);
138static int smctr_init_rx_fcbs(struct net_device *dev);
139static int smctr_init_shared_memory(struct net_device *dev);
140static int smctr_init_tx_bdbs(struct net_device *dev);
141static int smctr_init_tx_fcbs(struct net_device *dev);
142static int smctr_internal_self_test(struct net_device *dev);
143static irqreturn_t smctr_interrupt(int irq, void *dev_id);
144static int smctr_issue_enable_int_cmd(struct net_device *dev,
145        __u16 interrupt_enable_mask);
146static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code,
147        __u16 ibits);
148static int smctr_issue_init_timers_cmd(struct net_device *dev);
149static int smctr_issue_init_txrx_cmd(struct net_device *dev);
150static int smctr_issue_insert_cmd(struct net_device *dev);
151static int smctr_issue_read_ring_status_cmd(struct net_device *dev);
152static int smctr_issue_read_word_cmd(struct net_device *dev, __u16 aword_cnt);
153static int smctr_issue_remove_cmd(struct net_device *dev);
154static int smctr_issue_resume_acb_cmd(struct net_device *dev);
155static int smctr_issue_resume_rx_bdb_cmd(struct net_device *dev, __u16 queue);
156static int smctr_issue_resume_rx_fcb_cmd(struct net_device *dev, __u16 queue);
157static int smctr_issue_resume_tx_fcb_cmd(struct net_device *dev, __u16 queue);
158static int smctr_issue_test_internal_rom_cmd(struct net_device *dev);
159static int smctr_issue_test_hic_cmd(struct net_device *dev);
160static int smctr_issue_test_mac_reg_cmd(struct net_device *dev);
161static int smctr_issue_trc_loopback_cmd(struct net_device *dev);
162static int smctr_issue_tri_loopback_cmd(struct net_device *dev);
163static int smctr_issue_write_byte_cmd(struct net_device *dev,
164        short aword_cnt, void *byte);
165static int smctr_issue_write_word_cmd(struct net_device *dev,
166        short aword_cnt, void *word);
167
168/* J */
169static int smctr_join_complete_state(struct net_device *dev);
170
171/* L */
172static int smctr_link_tx_fcbs_to_bdbs(struct net_device *dev);
173static int smctr_load_firmware(struct net_device *dev);
174static int smctr_load_node_addr(struct net_device *dev);
175static int smctr_lobe_media_test(struct net_device *dev);
176static int smctr_lobe_media_test_cmd(struct net_device *dev);
177static int smctr_lobe_media_test_state(struct net_device *dev);
178
179/* M */
180static int smctr_make_8025_hdr(struct net_device *dev,
181        MAC_HEADER *rmf, MAC_HEADER *tmf, __u16 ac_fc);
182static int smctr_make_access_pri(struct net_device *dev,
183        MAC_SUB_VECTOR *tsv);
184static int smctr_make_addr_mod(struct net_device *dev, MAC_SUB_VECTOR *tsv);
185static int smctr_make_auth_funct_class(struct net_device *dev,
186        MAC_SUB_VECTOR *tsv);
187static int smctr_make_corr(struct net_device *dev,
188        MAC_SUB_VECTOR *tsv, __u16 correlator);
189static int smctr_make_funct_addr(struct net_device *dev,
190        MAC_SUB_VECTOR *tsv);
191static int smctr_make_group_addr(struct net_device *dev,
192        MAC_SUB_VECTOR *tsv);
193static int smctr_make_phy_drop_num(struct net_device *dev,
194        MAC_SUB_VECTOR *tsv);
195static int smctr_make_product_id(struct net_device *dev, MAC_SUB_VECTOR *tsv);
196static int smctr_make_station_id(struct net_device *dev, MAC_SUB_VECTOR *tsv);
197static int smctr_make_ring_station_status(struct net_device *dev,
198        MAC_SUB_VECTOR *tsv);
199static int smctr_make_ring_station_version(struct net_device *dev,
200        MAC_SUB_VECTOR *tsv);
201static int smctr_make_tx_status_code(struct net_device *dev,
202        MAC_SUB_VECTOR *tsv, __u16 tx_fstatus);
203static int smctr_make_upstream_neighbor_addr(struct net_device *dev,
204        MAC_SUB_VECTOR *tsv);
205static int smctr_make_wrap_data(struct net_device *dev,
206        MAC_SUB_VECTOR *tsv);
207
208/* O */
209static int smctr_open(struct net_device *dev);
210static int smctr_open_tr(struct net_device *dev);
211
212/* P */
213struct net_device *smctr_probe(int unit);
214static int __init smctr_probe1(struct net_device *dev, int ioaddr);
215static int smctr_process_rx_packet(MAC_HEADER *rmf, __u16 size,
216        struct net_device *dev, __u16 rx_status);
217
218/* R */
219static int smctr_ram_memory_test(struct net_device *dev);
220static int smctr_rcv_chg_param(struct net_device *dev, MAC_HEADER *rmf,
221        __u16 *correlator);
222static int smctr_rcv_init(struct net_device *dev, MAC_HEADER *rmf,
223        __u16 *correlator);
224static int smctr_rcv_tx_forward(struct net_device *dev, MAC_HEADER *rmf);
225static int smctr_rcv_rq_addr_state_attch(struct net_device *dev,
226        MAC_HEADER *rmf, __u16 *correlator);
227static int smctr_rcv_unknown(struct net_device *dev, MAC_HEADER *rmf,
228        __u16 *correlator);
229static int smctr_reset_adapter(struct net_device *dev);
230static int smctr_restart_tx_chain(struct net_device *dev, short queue);
231static int smctr_ring_status_chg(struct net_device *dev);
232static int smctr_rx_frame(struct net_device *dev);
233
234/* S */
235static int smctr_send_dat(struct net_device *dev);
236static int smctr_send_packet(struct sk_buff *skb, struct net_device *dev);
237static int smctr_send_lobe_media_test(struct net_device *dev);
238static int smctr_send_rpt_addr(struct net_device *dev, MAC_HEADER *rmf,
239        __u16 correlator);
240static int smctr_send_rpt_attch(struct net_device *dev, MAC_HEADER *rmf,
241        __u16 correlator);
242static int smctr_send_rpt_state(struct net_device *dev, MAC_HEADER *rmf,
243        __u16 correlator);
244static int smctr_send_rpt_tx_forward(struct net_device *dev,
245        MAC_HEADER *rmf, __u16 tx_fstatus);
246static int smctr_send_rsp(struct net_device *dev, MAC_HEADER *rmf,
247        __u16 rcode, __u16 correlator);
248static int smctr_send_rq_init(struct net_device *dev);
249static int smctr_send_tx_forward(struct net_device *dev, MAC_HEADER *rmf,
250        __u16 *tx_fstatus);
251static int smctr_set_auth_access_pri(struct net_device *dev,
252        MAC_SUB_VECTOR *rsv);
253static int smctr_set_auth_funct_class(struct net_device *dev,
254        MAC_SUB_VECTOR *rsv);
255static int smctr_set_corr(struct net_device *dev, MAC_SUB_VECTOR *rsv,
256	__u16 *correlator);
257static int smctr_set_error_timer_value(struct net_device *dev,
258        MAC_SUB_VECTOR *rsv);
259static int smctr_set_frame_forward(struct net_device *dev,
260        MAC_SUB_VECTOR *rsv, __u8 dc_sc);
261static int smctr_set_local_ring_num(struct net_device *dev,
262        MAC_SUB_VECTOR *rsv);
263static unsigned short smctr_set_ctrl_attention(struct net_device *dev);
264static void smctr_set_multicast_list(struct net_device *dev);
265static int smctr_set_page(struct net_device *dev, __u8 *buf);
266static int smctr_set_phy_drop(struct net_device *dev,
267        MAC_SUB_VECTOR *rsv);
268static int smctr_set_ring_speed(struct net_device *dev);
269static int smctr_set_rx_look_ahead(struct net_device *dev);
270static int smctr_set_trc_reset(int ioaddr);
271static int smctr_setup_single_cmd(struct net_device *dev,
272        __u16 command, __u16 subcommand);
273static int smctr_setup_single_cmd_w_data(struct net_device *dev,
274        __u16 command, __u16 subcommand);
275static char *smctr_malloc(struct net_device *dev, __u16 size);
276static int smctr_status_chg(struct net_device *dev);
277
278/* T */
279static void smctr_timeout(struct net_device *dev);
280static int smctr_trc_send_packet(struct net_device *dev, FCBlock *fcb,
281        __u16 queue);
282static __u16 smctr_tx_complete(struct net_device *dev, __u16 queue);
283static unsigned short smctr_tx_move_frame(struct net_device *dev,
284        struct sk_buff *skb, __u8 *pbuff, unsigned int bytes);
285
286/* U */
287static int smctr_update_err_stats(struct net_device *dev);
288static int smctr_update_rx_chain(struct net_device *dev, __u16 queue);
289static int smctr_update_tx_chain(struct net_device *dev, FCBlock *fcb,
290        __u16 queue);
291
292/* W */
293static int smctr_wait_cmd(struct net_device *dev);
294static int smctr_wait_while_cbusy(struct net_device *dev);
295
296#define TO_256_BYTE_BOUNDRY(X)  (((X + 0xff) & 0xff00) - X)
297#define TO_PARAGRAPH_BOUNDRY(X) (((X + 0x0f) & 0xfff0) - X)
298#define PARAGRAPH_BOUNDRY(X)    smctr_malloc(dev, TO_PARAGRAPH_BOUNDRY(X))
299
300/* Allocate Adapter Shared Memory.
301 * IMPORTANT NOTE: Any changes to this function MUST be mirrored in the
302 * function "get_num_rx_bdbs" below!!!
303 *
304 * Order of memory allocation:
305 *
306 *       0. Initial System Configuration Block Pointer
307 *       1. System Configuration Block
308 *       2. System Control Block
309 *       3. Action Command Block
310 *       4. Interrupt Status Block
311 *
312 *       5. MAC TX FCB'S
313 *       6. NON-MAC TX FCB'S
314 *       7. MAC TX BDB'S
315 *       8. NON-MAC TX BDB'S
316 *       9. MAC RX FCB'S
317 *      10. NON-MAC RX FCB'S
318 *      11. MAC RX BDB'S
319 *      12. NON-MAC RX BDB'S
320 *      13. MAC TX Data Buffer( 1, 256 byte buffer)
321 *      14. MAC RX Data Buffer( 1, 256 byte buffer)
322 *
323 *      15. NON-MAC TX Data Buffer
324 *      16. NON-MAC RX Data Buffer
325 */
326static int smctr_alloc_shared_memory(struct net_device *dev)
327{
328        struct net_local *tp = netdev_priv(dev);
329
330        if(smctr_debug > 10)
331                printk(KERN_DEBUG "%s: smctr_alloc_shared_memory\n", dev->name);
332
333        /* Allocate initial System Control Block pointer.
334         * This pointer is located in the last page, last offset - 4.
335         */
336        tp->iscpb_ptr = (ISCPBlock *)(tp->ram_access + ((__u32)64 * 0x400)
337                - (long)ISCP_BLOCK_SIZE);
338
339        /* Allocate System Control Blocks. */
340        tp->scgb_ptr = (SCGBlock *)smctr_malloc(dev, sizeof(SCGBlock));
341        PARAGRAPH_BOUNDRY(tp->sh_mem_used);
342
343        tp->sclb_ptr = (SCLBlock *)smctr_malloc(dev, sizeof(SCLBlock));
344        PARAGRAPH_BOUNDRY(tp->sh_mem_used);
345
346        tp->acb_head = (ACBlock *)smctr_malloc(dev,
347                sizeof(ACBlock)*tp->num_acbs);
348        PARAGRAPH_BOUNDRY(tp->sh_mem_used);
349
350        tp->isb_ptr = (ISBlock *)smctr_malloc(dev, sizeof(ISBlock));
351        PARAGRAPH_BOUNDRY(tp->sh_mem_used);
352
353        tp->misc_command_data = (__u16 *)smctr_malloc(dev, MISC_DATA_SIZE);
354        PARAGRAPH_BOUNDRY(tp->sh_mem_used);
355
356        /* Allocate transmit FCBs. */
357        tp->tx_fcb_head[MAC_QUEUE] = (FCBlock *)smctr_malloc(dev,
358                sizeof(FCBlock) * tp->num_tx_fcbs[MAC_QUEUE]);
359
360        tp->tx_fcb_head[NON_MAC_QUEUE] = (FCBlock *)smctr_malloc(dev,
361                sizeof(FCBlock) * tp->num_tx_fcbs[NON_MAC_QUEUE]);
362
363        tp->tx_fcb_head[BUG_QUEUE] = (FCBlock *)smctr_malloc(dev,
364                sizeof(FCBlock) * tp->num_tx_fcbs[BUG_QUEUE]);
365
366        /* Allocate transmit BDBs. */
367        tp->tx_bdb_head[MAC_QUEUE] = (BDBlock *)smctr_malloc(dev,
368                sizeof(BDBlock) * tp->num_tx_bdbs[MAC_QUEUE]);
369
370        tp->tx_bdb_head[NON_MAC_QUEUE] = (BDBlock *)smctr_malloc(dev,
371                sizeof(BDBlock) * tp->num_tx_bdbs[NON_MAC_QUEUE]);
372
373        tp->tx_bdb_head[BUG_QUEUE] = (BDBlock *)smctr_malloc(dev,
374                sizeof(BDBlock) * tp->num_tx_bdbs[BUG_QUEUE]);
375
376        /* Allocate receive FCBs. */
377        tp->rx_fcb_head[MAC_QUEUE] = (FCBlock *)smctr_malloc(dev,
378                sizeof(FCBlock) * tp->num_rx_fcbs[MAC_QUEUE]);
379
380        tp->rx_fcb_head[NON_MAC_QUEUE] = (FCBlock *)smctr_malloc(dev,
381                sizeof(FCBlock) * tp->num_rx_fcbs[NON_MAC_QUEUE]);
382
383        /* Allocate receive BDBs. */
384        tp->rx_bdb_head[MAC_QUEUE] = (BDBlock *)smctr_malloc(dev,
385                sizeof(BDBlock) * tp->num_rx_bdbs[MAC_QUEUE]);
386
387        tp->rx_bdb_end[MAC_QUEUE] = (BDBlock *)smctr_malloc(dev, 0);
388
389        tp->rx_bdb_head[NON_MAC_QUEUE] = (BDBlock *)smctr_malloc(dev,
390                sizeof(BDBlock) * tp->num_rx_bdbs[NON_MAC_QUEUE]);
391
392        tp->rx_bdb_end[NON_MAC_QUEUE] = (BDBlock *)smctr_malloc(dev, 0);
393
394        /* Allocate MAC transmit buffers.
395         * MAC Tx Buffers doen't have to be on an ODD Boundry.
396         */
397        tp->tx_buff_head[MAC_QUEUE]
398                = (__u16 *)smctr_malloc(dev, tp->tx_buff_size[MAC_QUEUE]);
399        tp->tx_buff_curr[MAC_QUEUE] = tp->tx_buff_head[MAC_QUEUE];
400        tp->tx_buff_end [MAC_QUEUE] = (__u16 *)smctr_malloc(dev, 0);
401
402        /* Allocate BUG transmit buffers. */
403        tp->tx_buff_head[BUG_QUEUE]
404                = (__u16 *)smctr_malloc(dev, tp->tx_buff_size[BUG_QUEUE]);
405        tp->tx_buff_curr[BUG_QUEUE] = tp->tx_buff_head[BUG_QUEUE];
406        tp->tx_buff_end[BUG_QUEUE] = (__u16 *)smctr_malloc(dev, 0);
407
408        /* Allocate MAC receive data buffers.
409         * MAC Rx buffer doesn't have to be on a 256 byte boundary.
410         */
411        tp->rx_buff_head[MAC_QUEUE] = (__u16 *)smctr_malloc(dev,
412                RX_DATA_BUFFER_SIZE * tp->num_rx_bdbs[MAC_QUEUE]);
413        tp->rx_buff_end[MAC_QUEUE] = (__u16 *)smctr_malloc(dev, 0);
414
415        /* Allocate Non-MAC transmit buffers.
416         * ?? For maximum Netware performance, put Tx Buffers on
417         * ODD Boundry and then restore malloc to Even Boundrys.
418         */
419        smctr_malloc(dev, 1L);
420        tp->tx_buff_head[NON_MAC_QUEUE]
421                = (__u16 *)smctr_malloc(dev, tp->tx_buff_size[NON_MAC_QUEUE]);
422        tp->tx_buff_curr[NON_MAC_QUEUE] = tp->tx_buff_head[NON_MAC_QUEUE];
423        tp->tx_buff_end [NON_MAC_QUEUE] = (__u16 *)smctr_malloc(dev, 0);
424        smctr_malloc(dev, 1L);
425
426        /* Allocate Non-MAC receive data buffers.
427         * To guarantee a minimum of 256 contigous memory to
428         * UM_Receive_Packet's lookahead pointer, before a page
429         * change or ring end is encountered, place each rx buffer on
430         * a 256 byte boundary.
431         */
432        smctr_malloc(dev, TO_256_BYTE_BOUNDRY(tp->sh_mem_used));
433        tp->rx_buff_head[NON_MAC_QUEUE] = (__u16 *)smctr_malloc(dev,
434                RX_DATA_BUFFER_SIZE * tp->num_rx_bdbs[NON_MAC_QUEUE]);
435        tp->rx_buff_end[NON_MAC_QUEUE] = (__u16 *)smctr_malloc(dev, 0);
436
437        return (0);
438}
439
440/* Enter Bypass state. */
441static int smctr_bypass_state(struct net_device *dev)
442{
443        int err;
444
445	if(smctr_debug > 10)
446        	printk(KERN_DEBUG "%s: smctr_bypass_state\n", dev->name);
447
448        err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE, JS_BYPASS_STATE);
449
450        return (err);
451}
452
453static int smctr_checksum_firmware(struct net_device *dev)
454{
455        struct net_local *tp = netdev_priv(dev);
456        __u16 i, checksum = 0;
457
458        if(smctr_debug > 10)
459                printk(KERN_DEBUG "%s: smctr_checksum_firmware\n", dev->name);
460
461        smctr_enable_adapter_ctrl_store(dev);
462
463        for(i = 0; i < CS_RAM_SIZE; i += 2)
464                checksum += *((__u16 *)(tp->ram_access + i));
465
466        tp->microcode_version = *(__u16 *)(tp->ram_access
467                + CS_RAM_VERSION_OFFSET);
468        tp->microcode_version >>= 8;
469
470        smctr_disable_adapter_ctrl_store(dev);
471
472        if(checksum)
473                return (checksum);
474
475        return (0);
476}
477
478static int __init smctr_chk_mca(struct net_device *dev)
479{
480#ifdef CONFIG_MCA_LEGACY
481	struct net_local *tp = netdev_priv(dev);
482	int current_slot;
483	__u8 r1, r2, r3, r4, r5;
484
485	current_slot = mca_find_unused_adapter(smctr_posid, 0);
486	if(current_slot == MCA_NOTFOUND)
487		return (-ENODEV);
488
489	mca_set_adapter_name(current_slot, smctr_name);
490	mca_mark_as_used(current_slot);
491	tp->slot_num = current_slot;
492
493	r1 = mca_read_stored_pos(tp->slot_num, 2);
494	r2 = mca_read_stored_pos(tp->slot_num, 3);
495
496	if(tp->slot_num)
497		outb(CNFG_POS_CONTROL_REG, (__u8)((tp->slot_num - 1) | CNFG_SLOT_ENABLE_BIT));
498	else
499		outb(CNFG_POS_CONTROL_REG, (__u8)((tp->slot_num) | CNFG_SLOT_ENABLE_BIT));
500
501	r1 = inb(CNFG_POS_REG1);
502	r2 = inb(CNFG_POS_REG0);
503
504	tp->bic_type = BIC_594_CHIP;
505
506	/* IO */
507	r2 = mca_read_stored_pos(tp->slot_num, 2);
508	r2 &= 0xF0;
509	dev->base_addr = ((__u16)r2 << 8) + (__u16)0x800;
510	request_region(dev->base_addr, SMCTR_IO_EXTENT, smctr_name);
511
512	/* IRQ */
513	r5 = mca_read_stored_pos(tp->slot_num, 5);
514	r5 &= 0xC;
515        switch(r5)
516	{
517            	case 0:
518			dev->irq = 3;
519               		break;
520
521            	case 0x4:
522			dev->irq = 4;
523               		break;
524
525            	case 0x8:
526			dev->irq = 10;
527               		break;
528
529            	default:
530			dev->irq = 15;
531               		break;
532	}
533	if (request_irq(dev->irq, smctr_interrupt, IRQF_SHARED, smctr_name, dev)) {
534		release_region(dev->base_addr, SMCTR_IO_EXTENT);
535		return -ENODEV;
536	}
537
538	/* Get RAM base */
539	r3 = mca_read_stored_pos(tp->slot_num, 3);
540	tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0x0C0000;
541	if (r3 & 0x8)
542		tp->ram_base += 0x010000;
543	if (r3 & 0x80)
544		tp->ram_base += 0xF00000;
545
546	/* Get Ram Size */
547	r3 &= 0x30;
548	r3 >>= 4;
549
550	tp->ram_usable = (__u16)CNFG_SIZE_8KB << r3;
551	tp->ram_size = (__u16)CNFG_SIZE_64KB;
552	tp->board_id |= TOKEN_MEDIA;
553
554	r4 = mca_read_stored_pos(tp->slot_num, 4);
555	tp->rom_base = ((__u32)(r4 & 0x7) << 13) + 0x0C0000;
556	if (r4 & 0x8)
557		tp->rom_base += 0x010000;
558
559	/* Get ROM size. */
560	r4 >>= 4;
561	switch (r4) {
562		case 0:
563			tp->rom_size = CNFG_SIZE_8KB;
564			break;
565		case 1:
566			tp->rom_size = CNFG_SIZE_16KB;
567			break;
568		case 2:
569			tp->rom_size = CNFG_SIZE_32KB;
570			break;
571		default:
572			tp->rom_size = ROM_DISABLE;
573	}
574
575	/* Get Media Type. */
576	r5 = mca_read_stored_pos(tp->slot_num, 5);
577	r5 &= CNFG_MEDIA_TYPE_MASK;
578	switch(r5)
579	{
580		case (0):
581			tp->media_type = MEDIA_STP_4;
582			break;
583
584		case (1):
585			tp->media_type = MEDIA_STP_16;
586			break;
587
588		case (3):
589			tp->media_type = MEDIA_UTP_16;
590			break;
591
592		default:
593			tp->media_type = MEDIA_UTP_4;
594			break;
595	}
596	tp->media_menu = 14;
597
598	r2 = mca_read_stored_pos(tp->slot_num, 2);
599	if(!(r2 & 0x02))
600		tp->mode_bits |= EARLY_TOKEN_REL;
601
602	/* Disable slot */
603	outb(CNFG_POS_CONTROL_REG, 0);
604
605	tp->board_id = smctr_get_boardid(dev, 1);
606	switch(tp->board_id & 0xffff)
607        {
608                case WD8115TA:
609                        smctr_model = "8115T/A";
610                        break;
611
612                case WD8115T:
613			if(tp->extra_info & CHIP_REV_MASK)
614                                smctr_model = "8115T rev XE";
615                        else
616                                smctr_model = "8115T rev XD";
617                        break;
618
619                default:
620                        smctr_model = "Unknown";
621                        break;
622        }
623
624	return (0);
625#else
626	return (-1);
627#endif /* CONFIG_MCA_LEGACY */
628}
629
630static int smctr_chg_rx_mask(struct net_device *dev)
631{
632        struct net_local *tp = netdev_priv(dev);
633        int err = 0;
634
635        if(smctr_debug > 10)
636		printk(KERN_DEBUG "%s: smctr_chg_rx_mask\n", dev->name);
637
638        smctr_enable_16bit(dev);
639        smctr_set_page(dev, (__u8 *)tp->ram_access);
640
641        if(tp->mode_bits & LOOPING_MODE_MASK)
642                tp->config_word0 |= RX_OWN_BIT;
643        else
644                tp->config_word0 &= ~RX_OWN_BIT;
645
646        if(tp->receive_mask & PROMISCUOUS_MODE)
647                tp->config_word0 |= PROMISCUOUS_BIT;
648        else
649                tp->config_word0 &= ~PROMISCUOUS_BIT;
650
651        if(tp->receive_mask & ACCEPT_ERR_PACKETS)
652                tp->config_word0 |= SAVBAD_BIT;
653        else
654                tp->config_word0 &= ~SAVBAD_BIT;
655
656        if(tp->receive_mask & ACCEPT_ATT_MAC_FRAMES)
657                tp->config_word0 |= RXATMAC;
658        else
659                tp->config_word0 &= ~RXATMAC;
660
661        if(tp->receive_mask & ACCEPT_MULTI_PROM)
662                tp->config_word1 |= MULTICAST_ADDRESS_BIT;
663        else
664                tp->config_word1 &= ~MULTICAST_ADDRESS_BIT;
665
666        if(tp->receive_mask & ACCEPT_SOURCE_ROUTING_SPANNING)
667                tp->config_word1 |= SOURCE_ROUTING_SPANNING_BITS;
668        else
669        {
670                if(tp->receive_mask & ACCEPT_SOURCE_ROUTING)
671                        tp->config_word1 |= SOURCE_ROUTING_EXPLORER_BIT;
672                else
673                        tp->config_word1 &= ~SOURCE_ROUTING_SPANNING_BITS;
674        }
675
676        if((err = smctr_issue_write_word_cmd(dev, RW_CONFIG_REGISTER_0,
677                &tp->config_word0)))
678        {
679                return (err);
680        }
681
682        if((err = smctr_issue_write_word_cmd(dev, RW_CONFIG_REGISTER_1,
683                &tp->config_word1)))
684        {
685                return (err);
686        }
687
688        smctr_disable_16bit(dev);
689
690        return (0);
691}
692
693static int smctr_clear_int(struct net_device *dev)
694{
695        struct net_local *tp = netdev_priv(dev);
696
697        outb((tp->trc_mask | CSR_CLRTINT), dev->base_addr + CSR);
698
699        return (0);
700}
701
702static int smctr_clear_trc_reset(int ioaddr)
703{
704        __u8 r;
705
706        r = inb(ioaddr + MSR);
707        outb(~MSR_RST & r, ioaddr + MSR);
708
709        return (0);
710}
711
712/*
713 * The inverse routine to smctr_open().
714 */
715static int smctr_close(struct net_device *dev)
716{
717        struct net_local *tp = netdev_priv(dev);
718        struct sk_buff *skb;
719        int err;
720
721	netif_stop_queue(dev);
722
723	tp->cleanup = 1;
724
725        /* Check to see if adapter is already in a closed state. */
726        if(tp->status != OPEN)
727                return (0);
728
729        smctr_enable_16bit(dev);
730        smctr_set_page(dev, (__u8 *)tp->ram_access);
731
732        if((err = smctr_issue_remove_cmd(dev)))
733        {
734                smctr_disable_16bit(dev);
735                return (err);
736        }
737
738        for(;;)
739        {
740                skb = skb_dequeue(&tp->SendSkbQueue);
741                if(skb == NULL)
742                        break;
743                tp->QueueSkb++;
744                dev_kfree_skb(skb);
745        }
746
747
748        return (0);
749}
750
751static int smctr_decode_firmware(struct net_device *dev)
752{
753        struct net_local *tp = netdev_priv(dev);
754        short bit = 0x80, shift = 12;
755        DECODE_TREE_NODE *tree;
756        short branch, tsize;
757        __u16 buff = 0;
758        long weight;
759        __u8 *ucode;
760        __u16 *mem;
761
762        if(smctr_debug > 10)
763                printk(KERN_DEBUG "%s: smctr_decode_firmware\n", dev->name);
764
765        weight  = *(long *)(tp->ptr_ucode + WEIGHT_OFFSET);
766        tsize   = *(__u8 *)(tp->ptr_ucode + TREE_SIZE_OFFSET);
767        tree    = (DECODE_TREE_NODE *)(tp->ptr_ucode + TREE_OFFSET);
768        ucode   = (__u8 *)(tp->ptr_ucode + TREE_OFFSET
769                        + (tsize * sizeof(DECODE_TREE_NODE)));
770        mem     = (__u16 *)(tp->ram_access);
771
772        while(weight)
773        {
774                branch = ROOT;
775                while((tree + branch)->tag != LEAF && weight)
776                {
777                        branch = *ucode & bit ? (tree + branch)->llink
778                                : (tree + branch)->rlink;
779
780                        bit >>= 1;
781                        weight--;
782
783                        if(bit == 0)
784                        {
785                                bit = 0x80;
786                                ucode++;
787                        }
788                }
789
790                buff |= (tree + branch)->info << shift;
791                shift -= 4;
792
793                if(shift < 0)
794                {
795                        *(mem++) = SWAP_BYTES(buff);
796                        buff    = 0;
797                        shift   = 12;
798                }
799        }
800
801        /* The following assumes the Control Store Memory has
802         * been initialized to zero. If the last partial word
803         * is zero, it will not be written.
804         */
805        if(buff)
806                *(mem++) = SWAP_BYTES(buff);
807
808        return (0);
809}
810
811static int smctr_disable_16bit(struct net_device *dev)
812{
813        return (0);
814}
815
816/*
817 * On Exit, Adapter is:
818 * 1. TRC is in a reset state and un-initialized.
819 * 2. Adapter memory is enabled.
820 * 3. Control Store memory is out of context (-WCSS is 1).
821 */
822static int smctr_disable_adapter_ctrl_store(struct net_device *dev)
823{
824        struct net_local *tp = netdev_priv(dev);
825        int ioaddr = dev->base_addr;
826
827        if(smctr_debug > 10)
828                printk(KERN_DEBUG "%s: smctr_disable_adapter_ctrl_store\n", dev->name);
829
830        tp->trc_mask |= CSR_WCSS;
831        outb(tp->trc_mask, ioaddr + CSR);
832
833        return (0);
834}
835
836static int smctr_disable_bic_int(struct net_device *dev)
837{
838        struct net_local *tp = netdev_priv(dev);
839        int ioaddr = dev->base_addr;
840
841        tp->trc_mask = CSR_MSK_ALL | CSR_MSKCBUSY
842	        | CSR_MSKTINT | CSR_WCSS;
843        outb(tp->trc_mask, ioaddr + CSR);
844
845        return (0);
846}
847
848static int smctr_enable_16bit(struct net_device *dev)
849{
850        struct net_local *tp = netdev_priv(dev);
851        __u8    r;
852
853        if(tp->adapter_bus == BUS_ISA16_TYPE)
854        {
855                r = inb(dev->base_addr + LAAR);
856                outb((r | LAAR_MEM16ENB), dev->base_addr + LAAR);
857        }
858
859        return (0);
860}
861
862/*
863 * To enable the adapter control store memory:
864 * 1. Adapter must be in a RESET state.
865 * 2. Adapter memory must be enabled.
866 * 3. Control Store Memory is in context (-WCSS is 0).
867 */
868static int smctr_enable_adapter_ctrl_store(struct net_device *dev)
869{
870        struct net_local *tp = netdev_priv(dev);
871        int ioaddr = dev->base_addr;
872
873        if(smctr_debug > 10)
874                printk(KERN_DEBUG "%s: smctr_enable_adapter_ctrl_store\n", dev->name);
875
876        smctr_set_trc_reset(ioaddr);
877        smctr_enable_adapter_ram(dev);
878
879        tp->trc_mask &= ~CSR_WCSS;
880        outb(tp->trc_mask, ioaddr + CSR);
881
882        return (0);
883}
884
885static int smctr_enable_adapter_ram(struct net_device *dev)
886{
887        int ioaddr = dev->base_addr;
888        __u8 r;
889
890        if(smctr_debug > 10)
891                printk(KERN_DEBUG "%s: smctr_enable_adapter_ram\n", dev->name);
892
893        r = inb(ioaddr + MSR);
894        outb(MSR_MEMB | r, ioaddr + MSR);
895
896        return (0);
897}
898
899static int smctr_enable_bic_int(struct net_device *dev)
900{
901        struct net_local *tp = netdev_priv(dev);
902        int ioaddr = dev->base_addr;
903        __u8 r;
904
905        switch(tp->bic_type)
906        {
907                case (BIC_584_CHIP):
908                        tp->trc_mask = CSR_MSKCBUSY | CSR_WCSS;
909                        outb(tp->trc_mask, ioaddr + CSR);
910                        r = inb(ioaddr + IRR);
911                        outb(r | IRR_IEN, ioaddr + IRR);
912                        break;
913
914                case (BIC_594_CHIP):
915                        tp->trc_mask = CSR_MSKCBUSY | CSR_WCSS;
916                        outb(tp->trc_mask, ioaddr + CSR);
917                        r = inb(ioaddr + IMCCR);
918                        outb(r | IMCCR_EIL, ioaddr + IMCCR);
919                        break;
920        }
921
922        return (0);
923}
924
925static int __init smctr_chk_isa(struct net_device *dev)
926{
927        struct net_local *tp = netdev_priv(dev);
928        int ioaddr = dev->base_addr;
929        __u8 r1, r2, b, chksum = 0;
930        __u16 r;
931	int i;
932	int err = -ENODEV;
933
934        if(smctr_debug > 10)
935                printk(KERN_DEBUG "%s: smctr_chk_isa %#4x\n", dev->name, ioaddr);
936
937	if((ioaddr & 0x1F) != 0)
938                goto out;
939
940        /* Grab the region so that no one else tries to probe our ioports. */
941	if (!request_region(ioaddr, SMCTR_IO_EXTENT, smctr_name)) {
942		err = -EBUSY;
943		goto out;
944	}
945
946        /* Checksum SMC node address */
947        for(i = 0; i < 8; i++)
948        {
949                b = inb(ioaddr + LAR0 + i);
950                chksum += b;
951        }
952
953        if (chksum != NODE_ADDR_CKSUM)
954                goto out2;
955
956        b = inb(ioaddr + BDID);
957	if(b != BRD_ID_8115T)
958        {
959                printk(KERN_ERR "%s: The adapter found is not supported\n", dev->name);
960                goto out2;
961        }
962
963        /* Check for 8115T Board ID */
964        r2 = 0;
965        for(r = 0; r < 8; r++)
966        {
967            r1 = inb(ioaddr + 0x8 + r);
968            r2 += r1;
969        }
970
971        /* value of RegF adds up the sum to 0xFF */
972        if((r2 != 0xFF) && (r2 != 0xEE))
973                goto out2;
974
975        /* Get adapter ID */
976        tp->board_id = smctr_get_boardid(dev, 0);
977        switch(tp->board_id & 0xffff)
978        {
979                case WD8115TA:
980                        smctr_model = "8115T/A";
981                        break;
982
983                case WD8115T:
984			if(tp->extra_info & CHIP_REV_MASK)
985                                smctr_model = "8115T rev XE";
986                        else
987                                smctr_model = "8115T rev XD";
988                        break;
989
990                default:
991                        smctr_model = "Unknown";
992                        break;
993        }
994
995        /* Store BIC type. */
996        tp->bic_type = BIC_584_CHIP;
997        tp->nic_type = NIC_825_CHIP;
998
999        /* Copy Ram Size */
1000        tp->ram_usable  = CNFG_SIZE_16KB;
1001        tp->ram_size    = CNFG_SIZE_64KB;
1002
1003        /* Get 58x Ram Base */
1004        r1 = inb(ioaddr);
1005        r1 &= 0x3F;
1006
1007        r2 = inb(ioaddr + CNFG_LAAR_584);
1008        r2 &= CNFG_LAAR_MASK;
1009        r2 <<= 3;
1010        r2 |= ((r1 & 0x38) >> 3);
1011
1012        tp->ram_base = ((__u32)r2 << 16) + (((__u32)(r1 & 0x7)) << 13);
1013
1014        /* Get 584 Irq */
1015        r1 = 0;
1016        r1 = inb(ioaddr + CNFG_ICR_583);
1017        r1 &= CNFG_ICR_IR2_584;
1018
1019        r2 = inb(ioaddr + CNFG_IRR_583);
1020        r2 &= CNFG_IRR_IRQS;     /* 0x60 */
1021        r2 >>= 5;
1022
1023        switch(r2)
1024        {
1025                case 0:
1026                        if(r1 == 0)
1027                                dev->irq = 2;
1028                        else
1029                                dev->irq = 10;
1030                        break;
1031
1032                case 1:
1033                        if(r1 == 0)
1034                                dev->irq = 3;
1035                        else
1036                                dev->irq = 11;
1037                        break;
1038
1039                case 2:
1040                        if(r1 == 0)
1041                        {
1042                                if(tp->extra_info & ALTERNATE_IRQ_BIT)
1043                                        dev->irq = 5;
1044                                else
1045                                        dev->irq = 4;
1046                        }
1047                        else
1048                                dev->irq = 15;
1049                        break;
1050
1051                case 3:
1052                        if(r1 == 0)
1053                                dev->irq = 7;
1054                        else
1055                                dev->irq = 4;
1056                        break;
1057
1058                default:
1059                        printk(KERN_ERR "%s: No IRQ found aborting\n", dev->name);
1060                        goto out2;
1061         }
1062
1063        if (request_irq(dev->irq, smctr_interrupt, IRQF_SHARED, smctr_name, dev))
1064                goto out2;
1065
1066        /* Get 58x Rom Base */
1067        r1 = inb(ioaddr + CNFG_BIO_583);
1068        r1 &= 0x3E;
1069        r1 |= 0x40;
1070
1071        tp->rom_base = (__u32)r1 << 13;
1072
1073        /* Get 58x Rom Size */
1074        r1 = inb(ioaddr + CNFG_BIO_583);
1075        r1 &= 0xC0;
1076        if(r1 == 0)
1077                tp->rom_size = ROM_DISABLE;
1078        else
1079        {
1080                r1 >>= 6;
1081                tp->rom_size = (__u16)CNFG_SIZE_8KB << r1;
1082        }
1083
1084        /* Get 58x Boot Status */
1085        r1 = inb(ioaddr + CNFG_GP2);
1086
1087        tp->mode_bits &= (~BOOT_STATUS_MASK);
1088
1089        if(r1 & CNFG_GP2_BOOT_NIBBLE)
1090                tp->mode_bits |= BOOT_TYPE_1;
1091
1092        /* Get 58x Zero Wait State */
1093        tp->mode_bits &= (~ZERO_WAIT_STATE_MASK);
1094
1095        r1 = inb(ioaddr + CNFG_IRR_583);
1096
1097        if(r1 & CNFG_IRR_ZWS)
1098                 tp->mode_bits |= ZERO_WAIT_STATE_8_BIT;
1099
1100        if(tp->board_id & BOARD_16BIT)
1101        {
1102                r1 = inb(ioaddr + CNFG_LAAR_584);
1103
1104                if(r1 & CNFG_LAAR_ZWS)
1105                        tp->mode_bits |= ZERO_WAIT_STATE_16_BIT;
1106        }
1107
1108        /* Get 584 Media Menu */
1109        tp->media_menu = 14;
1110        r1 = inb(ioaddr + CNFG_IRR_583);
1111
1112        tp->mode_bits &= 0xf8ff;       /* (~CNFG_INTERFACE_TYPE_MASK) */
1113        if((tp->board_id & TOKEN_MEDIA) == TOKEN_MEDIA)
1114        {
1115                /* Get Advanced Features */
1116                if(((r1 & 0x6) >> 1) == 0x3)
1117                        tp->media_type |= MEDIA_UTP_16;
1118                else
1119                {
1120                        if(((r1 & 0x6) >> 1) == 0x2)
1121                                tp->media_type |= MEDIA_STP_16;
1122                        else
1123                        {
1124                                if(((r1 & 0x6) >> 1) == 0x1)
1125                                        tp->media_type |= MEDIA_UTP_4;
1126
1127                                else
1128                                        tp->media_type |= MEDIA_STP_4;
1129                        }
1130                }
1131
1132                r1 = inb(ioaddr + CNFG_GP2);
1133                if(!(r1 & 0x2) )           /* GP2_ETRD */
1134                        tp->mode_bits |= EARLY_TOKEN_REL;
1135
1136                /* see if the chip is corrupted
1137                if(smctr_read_584_chksum(ioaddr))
1138                {
1139                        printk(KERN_ERR "%s: EEPROM Checksum Failure\n", dev->name);
1140			free_irq(dev->irq, dev);
1141                        goto out2;
1142                }
1143		*/
1144        }
1145
1146        return (0);
1147
1148out2:
1149	release_region(ioaddr, SMCTR_IO_EXTENT);
1150out:
1151	return err;
1152}
1153
1154static int __init smctr_get_boardid(struct net_device *dev, int mca)
1155{
1156        struct net_local *tp = netdev_priv(dev);
1157        int ioaddr = dev->base_addr;
1158        __u8 r, r1, IdByte;
1159        __u16 BoardIdMask;
1160
1161        tp->board_id = BoardIdMask = 0;
1162
1163	if(mca)
1164	{
1165		BoardIdMask |= (MICROCHANNEL+INTERFACE_CHIP+TOKEN_MEDIA+PAGED_RAM+BOARD_16BIT);
1166		tp->extra_info |= (INTERFACE_594_CHIP+RAM_SIZE_64K+NIC_825_BIT+ALTERNATE_IRQ_BIT+SLOT_16BIT);
1167	}
1168	else
1169	{
1170        	BoardIdMask|=(INTERFACE_CHIP+TOKEN_MEDIA+PAGED_RAM+BOARD_16BIT);
1171        	tp->extra_info |= (INTERFACE_584_CHIP + RAM_SIZE_64K
1172        	        + NIC_825_BIT + ALTERNATE_IRQ_BIT);
1173	}
1174
1175	if(!mca)
1176	{
1177        	r = inb(ioaddr + BID_REG_1);
1178        	r &= 0x0c;
1179       		outb(r, ioaddr + BID_REG_1);
1180        	r = inb(ioaddr + BID_REG_1);
1181
1182        	if(r & BID_SIXTEEN_BIT_BIT)
1183        	{
1184        	        tp->extra_info |= SLOT_16BIT;
1185        	        tp->adapter_bus = BUS_ISA16_TYPE;
1186        	}
1187        	else
1188        	        tp->adapter_bus = BUS_ISA8_TYPE;
1189	}
1190	else
1191		tp->adapter_bus = BUS_MCA_TYPE;
1192
1193        /* Get Board Id Byte */
1194        IdByte = inb(ioaddr + BID_BOARD_ID_BYTE);
1195
1196        /* if Major version > 1.0 then
1197         *      return;
1198         */
1199        if(IdByte & 0xF8)
1200                return (-1);
1201
1202        r1 = inb(ioaddr + BID_REG_1);
1203        r1 &= BID_ICR_MASK;
1204        r1 |= BID_OTHER_BIT;
1205
1206        outb(r1, ioaddr + BID_REG_1);
1207        r1 = inb(ioaddr + BID_REG_3);
1208
1209        r1 &= BID_EAR_MASK;
1210        r1 |= BID_ENGR_PAGE;
1211
1212        outb(r1, ioaddr + BID_REG_3);
1213        r1 = inb(ioaddr + BID_REG_1);
1214        r1 &= BID_ICR_MASK;
1215        r1 |= (BID_RLA | BID_OTHER_BIT);
1216
1217        outb(r1, ioaddr + BID_REG_1);
1218
1219        r1 = inb(ioaddr + BID_REG_1);
1220        while(r1 & BID_RECALL_DONE_MASK)
1221                r1 = inb(ioaddr + BID_REG_1);
1222
1223        r = inb(ioaddr + BID_LAR_0 + BID_REG_6);
1224
1225        /* clear chip rev bits */
1226        tp->extra_info &= ~CHIP_REV_MASK;
1227        tp->extra_info |= ((r & BID_EEPROM_CHIP_REV_MASK) << 6);
1228
1229        r1 = inb(ioaddr + BID_REG_1);
1230        r1 &= BID_ICR_MASK;
1231        r1 |= BID_OTHER_BIT;
1232
1233        outb(r1, ioaddr + BID_REG_1);
1234        r1 = inb(ioaddr + BID_REG_3);
1235
1236        r1 &= BID_EAR_MASK;
1237        r1 |= BID_EA6;
1238
1239        outb(r1, ioaddr + BID_REG_3);
1240        r1 = inb(ioaddr + BID_REG_1);
1241
1242        r1 &= BID_ICR_MASK;
1243        r1 |= BID_RLA;
1244
1245        outb(r1, ioaddr + BID_REG_1);
1246        r1 = inb(ioaddr + BID_REG_1);
1247
1248        while(r1 & BID_RECALL_DONE_MASK)
1249                r1 = inb(ioaddr + BID_REG_1);
1250
1251        return (BoardIdMask);
1252}
1253
1254static int smctr_get_group_address(struct net_device *dev)
1255{
1256        smctr_issue_read_word_cmd(dev, RW_INDIVIDUAL_GROUP_ADDR);
1257
1258        return(smctr_wait_cmd(dev));
1259}
1260
1261static int smctr_get_functional_address(struct net_device *dev)
1262{
1263        smctr_issue_read_word_cmd(dev, RW_FUNCTIONAL_ADDR);
1264
1265        return(smctr_wait_cmd(dev));
1266}
1267
1268/* Calculate number of Non-MAC receive BDB's and data buffers.
1269 * This function must simulate allocateing shared memory exactly
1270 * as the allocate_shared_memory function above.
1271 */
1272static unsigned int smctr_get_num_rx_bdbs(struct net_device *dev)
1273{
1274        struct net_local *tp = netdev_priv(dev);
1275        unsigned int mem_used = 0;
1276
1277        /* Allocate System Control Blocks. */
1278        mem_used += sizeof(SCGBlock);
1279
1280        mem_used += TO_PARAGRAPH_BOUNDRY(mem_used);
1281        mem_used += sizeof(SCLBlock);
1282
1283        mem_used += TO_PARAGRAPH_BOUNDRY(mem_used);
1284        mem_used += sizeof(ACBlock) * tp->num_acbs;
1285
1286        mem_used += TO_PARAGRAPH_BOUNDRY(mem_used);
1287        mem_used += sizeof(ISBlock);
1288
1289        mem_used += TO_PARAGRAPH_BOUNDRY(mem_used);
1290        mem_used += MISC_DATA_SIZE;
1291
1292        /* Allocate transmit FCB's. */
1293        mem_used += TO_PARAGRAPH_BOUNDRY(mem_used);
1294
1295        mem_used += sizeof(FCBlock) * tp->num_tx_fcbs[MAC_QUEUE];
1296        mem_used += sizeof(FCBlock) * tp->num_tx_fcbs[NON_MAC_QUEUE];
1297        mem_used += sizeof(FCBlock) * tp->num_tx_fcbs[BUG_QUEUE];
1298
1299        /* Allocate transmit BDBs. */
1300        mem_used += sizeof(BDBlock) * tp->num_tx_bdbs[MAC_QUEUE];
1301        mem_used += sizeof(BDBlock) * tp->num_tx_bdbs[NON_MAC_QUEUE];
1302        mem_used += sizeof(BDBlock) * tp->num_tx_bdbs[BUG_QUEUE];
1303
1304        /* Allocate receive FCBs. */
1305        mem_used += sizeof(FCBlock) * tp->num_rx_fcbs[MAC_QUEUE];
1306        mem_used += sizeof(FCBlock) * tp->num_rx_fcbs[NON_MAC_QUEUE];
1307
1308        /* Allocate receive BDBs. */
1309        mem_used += sizeof(BDBlock) * tp->num_rx_bdbs[MAC_QUEUE];
1310
1311        /* Allocate MAC transmit buffers.
1312         * MAC transmit buffers don't have to be on an ODD Boundry.
1313         */
1314        mem_used += tp->tx_buff_size[MAC_QUEUE];
1315
1316        /* Allocate BUG transmit buffers. */
1317        mem_used += tp->tx_buff_size[BUG_QUEUE];
1318
1319        /* Allocate MAC receive data buffers.
1320         * MAC receive buffers don't have to be on a 256 byte boundary.
1321         */
1322        mem_used += RX_DATA_BUFFER_SIZE * tp->num_rx_bdbs[MAC_QUEUE];
1323
1324        /* Allocate Non-MAC transmit buffers.
1325         * For maximum Netware performance, put Tx Buffers on
1326         * ODD Boundry,and then restore malloc to Even Boundrys.
1327         */
1328        mem_used += 1L;
1329        mem_used += tp->tx_buff_size[NON_MAC_QUEUE];
1330        mem_used += 1L;
1331
1332        /* CALCULATE NUMBER OF NON-MAC RX BDB'S
1333         * AND NON-MAC RX DATA BUFFERS
1334         *
1335         * Make sure the mem_used offset at this point is the
1336         * same as in allocate_shared memory or the following
1337         * boundary adjustment will be incorrect (i.e. not allocating
1338         * the non-mac receive buffers above cannot change the 256
1339         * byte offset).
1340         *
1341         * Since this cannot be guaranteed, adding the full 256 bytes
1342         * to the amount of shared memory used at this point will guaranteed
1343         * that the rx data buffers do not overflow shared memory.
1344         */
1345        mem_used += 0x100;
1346
1347        return((0xffff - mem_used) / (RX_DATA_BUFFER_SIZE + sizeof(BDBlock)));
1348}
1349
1350static int smctr_get_physical_drop_number(struct net_device *dev)
1351{
1352        smctr_issue_read_word_cmd(dev, RW_PHYSICAL_DROP_NUMBER);
1353
1354        return(smctr_wait_cmd(dev));
1355}
1356
1357static __u8 * smctr_get_rx_pointer(struct net_device *dev, short queue)
1358{
1359        struct net_local *tp = netdev_priv(dev);
1360        BDBlock *bdb;
1361
1362        bdb = (BDBlock *)((__u32)tp->ram_access
1363                + (__u32)(tp->rx_fcb_curr[queue]->trc_bdb_ptr));
1364
1365        tp->rx_fcb_curr[queue]->bdb_ptr = bdb;
1366
1367        return ((__u8 *)bdb->data_block_ptr);
1368}
1369
1370static int smctr_get_station_id(struct net_device *dev)
1371{
1372        smctr_issue_read_word_cmd(dev, RW_INDIVIDUAL_MAC_ADDRESS);
1373
1374        return(smctr_wait_cmd(dev));
1375}
1376
1377/*
1378 * Get the current statistics. This may be called with the card open
1379 * or closed.
1380 */
1381static struct net_device_stats *smctr_get_stats(struct net_device *dev)
1382{
1383        struct net_local *tp = netdev_priv(dev);
1384
1385        return ((struct net_device_stats *)&tp->MacStat);
1386}
1387
1388static FCBlock *smctr_get_tx_fcb(struct net_device *dev, __u16 queue,
1389        __u16 bytes_count)
1390{
1391        struct net_local *tp = netdev_priv(dev);
1392        FCBlock *pFCB;
1393        BDBlock *pbdb;
1394        unsigned short alloc_size;
1395        unsigned short *temp;
1396
1397        if(smctr_debug > 20)
1398                printk(KERN_DEBUG "smctr_get_tx_fcb\n");
1399
1400        /* check if there is enough FCB blocks */
1401        if(tp->num_tx_fcbs_used[queue] >= tp->num_tx_fcbs[queue])
1402                return ((FCBlock *)(-1L));
1403
1404        /* round off the input pkt size to the nearest even number */
1405        alloc_size = (bytes_count + 1) & 0xfffe;
1406
1407        /* check if enough mem */
1408        if((tp->tx_buff_used[queue] + alloc_size) > tp->tx_buff_size[queue])
1409                return ((FCBlock *)(-1L));
1410
1411        /* check if past the end ;
1412         * if exactly enough mem to end of ring, alloc from front.
1413         * this avoids update of curr when curr = end
1414         */
1415        if(((unsigned long)(tp->tx_buff_curr[queue]) + alloc_size)
1416                >= (unsigned long)(tp->tx_buff_end[queue]))
1417        {
1418                /* check if enough memory from ring head */
1419                alloc_size = alloc_size +
1420                        (__u16)((__u32)tp->tx_buff_end[queue]
1421                        - (__u32)tp->tx_buff_curr[queue]);
1422
1423                if((tp->tx_buff_used[queue] + alloc_size)
1424                        > tp->tx_buff_size[queue])
1425                {
1426                        return ((FCBlock *)(-1L));
1427                }
1428
1429                /* ring wrap */
1430                tp->tx_buff_curr[queue] = tp->tx_buff_head[queue];
1431        }
1432
1433        tp->tx_buff_used[queue] += alloc_size;
1434        tp->num_tx_fcbs_used[queue]++;
1435        tp->tx_fcb_curr[queue]->frame_length = bytes_count;
1436        tp->tx_fcb_curr[queue]->memory_alloc = alloc_size;
1437        temp = tp->tx_buff_curr[queue];
1438        tp->tx_buff_curr[queue]
1439                = (__u16 *)((__u32)temp + (__u32)((bytes_count + 1) & 0xfffe));
1440
1441        pbdb = tp->tx_fcb_curr[queue]->bdb_ptr;
1442        pbdb->buffer_length = bytes_count;
1443        pbdb->data_block_ptr = temp;
1444        pbdb->trc_data_block_ptr = TRC_POINTER(temp);
1445
1446        pFCB = tp->tx_fcb_curr[queue];
1447        tp->tx_fcb_curr[queue] = tp->tx_fcb_curr[queue]->next_ptr;
1448
1449        return (pFCB);
1450}
1451
1452static int smctr_get_upstream_neighbor_addr(struct net_device *dev)
1453{
1454        smctr_issue_read_word_cmd(dev, RW_UPSTREAM_NEIGHBOR_ADDRESS);
1455
1456        return(smctr_wait_cmd(dev));
1457}
1458
1459static int smctr_hardware_send_packet(struct net_device *dev,
1460        struct net_local *tp)
1461{
1462        struct tr_statistics *tstat = &tp->MacStat;
1463        struct sk_buff *skb;
1464        FCBlock *fcb;
1465
1466        if(smctr_debug > 10)
1467                printk(KERN_DEBUG"%s: smctr_hardware_send_packet\n", dev->name);
1468
1469        if(tp->status != OPEN)
1470                return (-1);
1471
1472        if(tp->monitor_state_ready != 1)
1473                return (-1);
1474
1475        for(;;)
1476        {
1477                /* Send first buffer from queue */
1478                skb = skb_dequeue(&tp->SendSkbQueue);
1479                if(skb == NULL)
1480                        return (-1);
1481
1482                tp->QueueSkb++;
1483
1484                if(skb->len < SMC_HEADER_SIZE || skb->len > tp->max_packet_size)                        return (-1);
1485
1486                smctr_enable_16bit(dev);
1487                smctr_set_page(dev, (__u8 *)tp->ram_access);
1488
1489                if((fcb = smctr_get_tx_fcb(dev, NON_MAC_QUEUE, skb->len))
1490                        == (FCBlock *)(-1L))
1491                {
1492                        smctr_disable_16bit(dev);
1493                        return (-1);
1494                }
1495
1496                smctr_tx_move_frame(dev, skb,
1497                        (__u8 *)fcb->bdb_ptr->data_block_ptr, skb->len);
1498
1499                smctr_set_page(dev, (__u8 *)fcb);
1500
1501                smctr_trc_send_packet(dev, fcb, NON_MAC_QUEUE);
1502                dev_kfree_skb(skb);
1503
1504                tstat->tx_packets++;
1505
1506                smctr_disable_16bit(dev);
1507        }
1508
1509        return (0);
1510}
1511
1512static int smctr_init_acbs(struct net_device *dev)
1513{
1514        struct net_local *tp = netdev_priv(dev);
1515        unsigned int i;
1516        ACBlock *acb;
1517
1518        if(smctr_debug > 10)
1519                printk(KERN_DEBUG "%s: smctr_init_acbs\n", dev->name);
1520
1521        acb                     = tp->acb_head;
1522        acb->cmd_done_status    = (ACB_COMMAND_DONE | ACB_COMMAND_SUCCESSFUL);
1523        acb->cmd_info           = ACB_CHAIN_END;
1524        acb->cmd                = 0;
1525        acb->subcmd             = 0;
1526        acb->data_offset_lo     = 0;
1527        acb->data_offset_hi     = 0;
1528        acb->next_ptr
1529                = (ACBlock *)(((char *)acb) + sizeof(ACBlock));
1530        acb->trc_next_ptr       = TRC_POINTER(acb->next_ptr);
1531
1532        for(i = 1; i < tp->num_acbs; i++)
1533        {
1534                acb             = acb->next_ptr;
1535                acb->cmd_done_status
1536                        = (ACB_COMMAND_DONE | ACB_COMMAND_SUCCESSFUL);
1537                acb->cmd_info = ACB_CHAIN_END;
1538                acb->cmd        = 0;
1539                acb->subcmd     = 0;
1540                acb->data_offset_lo = 0;
1541                acb->data_offset_hi = 0;
1542                acb->next_ptr
1543                        = (ACBlock *)(((char *)acb) + sizeof(ACBlock));
1544                acb->trc_next_ptr = TRC_POINTER(acb->next_ptr);
1545        }
1546
1547        acb->next_ptr           = tp->acb_head;
1548        acb->trc_next_ptr       = TRC_POINTER(tp->acb_head);
1549        tp->acb_next            = tp->acb_head->next_ptr;
1550        tp->acb_curr            = tp->acb_head->next_ptr;
1551        tp->num_acbs_used       = 0;
1552
1553        return (0);
1554}
1555
1556static int smctr_init_adapter(struct net_device *dev)
1557{
1558        struct net_local *tp = netdev_priv(dev);
1559        int err;
1560
1561        if(smctr_debug > 10)
1562                printk(KERN_DEBUG "%s: smctr_init_adapter\n", dev->name);
1563
1564        tp->status              = CLOSED;
1565        tp->page_offset_mask    = (tp->ram_usable * 1024) - 1;
1566        skb_queue_head_init(&tp->SendSkbQueue);
1567        tp->QueueSkb = MAX_TX_QUEUE;
1568
1569        if(!(tp->group_address_0 & 0x0080))
1570                tp->group_address_0 |= 0x00C0;
1571
1572        if(!(tp->functional_address_0 & 0x00C0))
1573                tp->functional_address_0 |= 0x00C0;
1574
1575        tp->functional_address[0] &= 0xFF7F;
1576
1577        if(tp->authorized_function_classes == 0)
1578                tp->authorized_function_classes = 0x7FFF;
1579
1580        if(tp->authorized_access_priority == 0)
1581                tp->authorized_access_priority = 0x06;
1582
1583        smctr_disable_bic_int(dev);
1584        smctr_set_trc_reset(dev->base_addr);
1585
1586        smctr_enable_16bit(dev);
1587        smctr_set_page(dev, (__u8 *)tp->ram_access);
1588
1589        if(smctr_checksum_firmware(dev))
1590	{
1591                printk(KERN_ERR "%s: Previously loaded firmware is missing\n",dev->name);                return (-ENOENT);
1592        }
1593
1594        if((err = smctr_ram_memory_test(dev)))
1595	{
1596                printk(KERN_ERR "%s: RAM memory test failed.\n", dev->name);
1597                return (-EIO);
1598        }
1599
1600	smctr_set_rx_look_ahead(dev);
1601        smctr_load_node_addr(dev);
1602
1603        /* Initialize adapter for Internal Self Test. */
1604        smctr_reset_adapter(dev);
1605        if((err = smctr_init_card_real(dev)))
1606	{
1607                printk(KERN_ERR "%s: Initialization of card failed (%d)\n",
1608                        dev->name, err);
1609                return (-EINVAL);
1610        }
1611
1612        /* This routine clobbers the TRC's internal registers. */
1613        if((err = smctr_internal_self_test(dev)))
1614	{
1615                printk(KERN_ERR "%s: Card failed internal self test (%d)\n",
1616                        dev->name, err);
1617                return (-EINVAL);
1618        }
1619
1620        /* Re-Initialize adapter's internal registers */
1621        smctr_reset_adapter(dev);
1622        if((err = smctr_init_card_real(dev)))
1623	{
1624                printk(KERN_ERR "%s: Initialization of card failed (%d)\n",
1625                        dev->name, err);
1626                return (-EINVAL);
1627        }
1628
1629        smctr_enable_bic_int(dev);
1630
1631        if((err = smctr_issue_enable_int_cmd(dev, TRC_INTERRUPT_ENABLE_MASK)))
1632                return (err);
1633
1634        smctr_disable_16bit(dev);
1635
1636        return (0);
1637}
1638
1639static int smctr_init_card_real(struct net_device *dev)
1640{
1641        struct net_local *tp = netdev_priv(dev);
1642        int err = 0;
1643
1644        if(smctr_debug > 10)
1645                printk(KERN_DEBUG "%s: smctr_init_card_real\n", dev->name);
1646
1647        tp->sh_mem_used = 0;
1648        tp->num_acbs    = NUM_OF_ACBS;
1649
1650        /* Range Check Max Packet Size */
1651        if(tp->max_packet_size < 256)
1652                tp->max_packet_size = 256;
1653        else
1654        {
1655                if(tp->max_packet_size > NON_MAC_TX_BUFFER_MEMORY)
1656                        tp->max_packet_size = NON_MAC_TX_BUFFER_MEMORY;
1657        }
1658
1659        tp->num_of_tx_buffs = (NON_MAC_TX_BUFFER_MEMORY
1660                / tp->max_packet_size) - 1;
1661
1662        if(tp->num_of_tx_buffs > NUM_NON_MAC_TX_FCBS)
1663                tp->num_of_tx_buffs = NUM_NON_MAC_TX_FCBS;
1664        else
1665        {
1666                if(tp->num_of_tx_buffs == 0)
1667                        tp->num_of_tx_buffs = 1;
1668        }
1669
1670        /* Tx queue constants */
1671        tp->num_tx_fcbs        [BUG_QUEUE]     = NUM_BUG_TX_FCBS;
1672        tp->num_tx_bdbs        [BUG_QUEUE]     = NUM_BUG_TX_BDBS;
1673        tp->tx_buff_size       [BUG_QUEUE]     = BUG_TX_BUFFER_MEMORY;
1674        tp->tx_buff_used       [BUG_QUEUE]     = 0;
1675        tp->tx_queue_status    [BUG_QUEUE]     = NOT_TRANSMITING;
1676
1677        tp->num_tx_fcbs        [MAC_QUEUE]     = NUM_MAC_TX_FCBS;
1678        tp->num_tx_bdbs        [MAC_QUEUE]     = NUM_MAC_TX_BDBS;
1679        tp->tx_buff_size       [MAC_QUEUE]     = MAC_TX_BUFFER_MEMORY;
1680        tp->tx_buff_used       [MAC_QUEUE]     = 0;
1681        tp->tx_queue_status    [MAC_QUEUE]     = NOT_TRANSMITING;
1682
1683        tp->num_tx_fcbs        [NON_MAC_QUEUE] = NUM_NON_MAC_TX_FCBS;
1684        tp->num_tx_bdbs        [NON_MAC_QUEUE] = NUM_NON_MAC_TX_BDBS;
1685        tp->tx_buff_size       [NON_MAC_QUEUE] = NON_MAC_TX_BUFFER_MEMORY;
1686        tp->tx_buff_used       [NON_MAC_QUEUE] = 0;
1687        tp->tx_queue_status    [NON_MAC_QUEUE] = NOT_TRANSMITING;
1688
1689        /* Receive Queue Constants */
1690        tp->num_rx_fcbs[MAC_QUEUE] = NUM_MAC_RX_FCBS;
1691        tp->num_rx_bdbs[MAC_QUEUE] = NUM_MAC_RX_BDBS;
1692
1693        if(tp->extra_info & CHIP_REV_MASK)
1694                tp->num_rx_fcbs[NON_MAC_QUEUE] = 78;    /* 825 Rev. XE */
1695        else
1696                tp->num_rx_fcbs[NON_MAC_QUEUE] = 7;     /* 825 Rev. XD */
1697
1698        tp->num_rx_bdbs[NON_MAC_QUEUE] = smctr_get_num_rx_bdbs(dev);
1699
1700        smctr_alloc_shared_memory(dev);
1701        smctr_init_shared_memory(dev);
1702
1703        if((err = smctr_issue_init_timers_cmd(dev)))
1704                return (err);
1705
1706        if((err = smctr_issue_init_txrx_cmd(dev)))
1707	{
1708                printk(KERN_ERR "%s: Hardware failure\n", dev->name);
1709                return (err);
1710        }
1711
1712        return (0);
1713}
1714
1715static int smctr_init_rx_bdbs(struct net_device *dev)
1716{
1717        struct net_local *tp = netdev_priv(dev);
1718        unsigned int i, j;
1719        BDBlock *bdb;
1720        __u16 *buf;
1721
1722        if(smctr_debug > 10)
1723                printk(KERN_DEBUG "%s: smctr_init_rx_bdbs\n", dev->name);
1724
1725        for(i = 0; i < NUM_RX_QS_USED; i++)
1726        {
1727                bdb = tp->rx_bdb_head[i];
1728                buf = tp->rx_buff_head[i];
1729                bdb->info = (BDB_CHAIN_END | BDB_NO_WARNING);
1730                bdb->buffer_length = RX_DATA_BUFFER_SIZE;
1731                bdb->next_ptr = (BDBlock *)(((char *)bdb) + sizeof(BDBlock));
1732                bdb->data_block_ptr = buf;
1733                bdb->trc_next_ptr = TRC_POINTER(bdb->next_ptr);
1734
1735                if(i == NON_MAC_QUEUE)
1736                        bdb->trc_data_block_ptr = RX_BUFF_TRC_POINTER(buf);
1737                else
1738                        bdb->trc_data_block_ptr = TRC_POINTER(buf);
1739
1740                for(j = 1; j < tp->num_rx_bdbs[i]; j++)
1741                {
1742                        bdb->next_ptr->back_ptr = bdb;
1743                        bdb = bdb->next_ptr;
1744                        buf = (__u16 *)((char *)buf + RX_DATA_BUFFER_SIZE);
1745                        bdb->info = (BDB_NOT_CHAIN_END | BDB_NO_WARNING);
1746                        bdb->buffer_length = RX_DATA_BUFFER_SIZE;
1747                        bdb->next_ptr = (BDBlock *)(((char *)bdb) + sizeof(BDBlock));
1748                        bdb->data_block_ptr = buf;
1749                        bdb->trc_next_ptr = TRC_POINTER(bdb->next_ptr);
1750
1751                        if(i == NON_MAC_QUEUE)
1752                                bdb->trc_data_block_ptr = RX_BUFF_TRC_POINTER(buf);
1753                        else
1754                                bdb->trc_data_block_ptr = TRC_POINTER(buf);
1755                }
1756
1757                bdb->next_ptr           = tp->rx_bdb_head[i];
1758                bdb->trc_next_ptr       = TRC_POINTER(tp->rx_bdb_head[i]);
1759
1760                tp->rx_bdb_head[i]->back_ptr    = bdb;
1761                tp->rx_bdb_curr[i]              = tp->rx_bdb_head[i]->next_ptr;
1762        }
1763
1764        return (0);
1765}
1766
1767static int smctr_init_rx_fcbs(struct net_device *dev)
1768{
1769        struct net_local *tp = netdev_priv(dev);
1770        unsigned int i, j;
1771        FCBlock *fcb;
1772
1773        for(i = 0; i < NUM_RX_QS_USED; i++)
1774        {
1775                fcb               = tp->rx_fcb_head[i];
1776                fcb->frame_status = 0;
1777                fcb->frame_length = 0;
1778                fcb->info         = FCB_CHAIN_END;
1779                fcb->next_ptr     = (FCBlock *)(((char*)fcb) + sizeof(FCBlock));
1780                if(i == NON_MAC_QUEUE)
1781                        fcb->trc_next_ptr = RX_FCB_TRC_POINTER(fcb->next_ptr);
1782                else
1783                        fcb->trc_next_ptr = TRC_POINTER(fcb->next_ptr);
1784
1785                for(j = 1; j < tp->num_rx_fcbs[i]; j++)
1786                {
1787                        fcb->next_ptr->back_ptr = fcb;
1788                        fcb                     = fcb->next_ptr;
1789                        fcb->frame_status       = 0;
1790                        fcb->frame_length       = 0;
1791                        fcb->info               = FCB_WARNING;
1792                        fcb->next_ptr
1793                                = (FCBlock *)(((char *)fcb) + sizeof(FCBlock));
1794
1795                        if(i == NON_MAC_QUEUE)
1796                                fcb->trc_next_ptr
1797                                        = RX_FCB_TRC_POINTER(fcb->next_ptr);
1798                        else
1799                                fcb->trc_next_ptr
1800                                        = TRC_POINTER(fcb->next_ptr);
1801                }
1802
1803                fcb->next_ptr = tp->rx_fcb_head[i];
1804
1805                if(i == NON_MAC_QUEUE)
1806                        fcb->trc_next_ptr = RX_FCB_TRC_POINTER(fcb->next_ptr);
1807                else
1808                        fcb->trc_next_ptr = TRC_POINTER(fcb->next_ptr);
1809
1810                tp->rx_fcb_head[i]->back_ptr    = fcb;
1811                tp->rx_fcb_curr[i]              = tp->rx_fcb_head[i]->next_ptr;
1812        }
1813
1814        return(0);
1815}
1816
1817static int smctr_init_shared_memory(struct net_device *dev)
1818{
1819        struct net_local *tp = netdev_priv(dev);
1820        unsigned int i;
1821        __u32 *iscpb;
1822
1823        if(smctr_debug > 10)
1824                printk(KERN_DEBUG "%s: smctr_init_shared_memory\n", dev->name);
1825
1826        smctr_set_page(dev, (__u8 *)(unsigned int)tp->iscpb_ptr);
1827
1828        /* Initialize Initial System Configuration Point. (ISCP) */
1829        iscpb = (__u32 *)PAGE_POINTER(&tp->iscpb_ptr->trc_scgb_ptr);
1830        *iscpb = (__u32)(SWAP_WORDS(TRC_POINTER(tp->scgb_ptr)));
1831
1832        smctr_set_page(dev, (__u8 *)tp->ram_access);
1833
1834        /* Initialize System Configuration Pointers. (SCP) */
1835        tp->scgb_ptr->config = (SCGB_ADDRESS_POINTER_FORMAT
1836                | SCGB_MULTI_WORD_CONTROL | SCGB_DATA_FORMAT
1837                | SCGB_BURST_LENGTH);
1838
1839        tp->scgb_ptr->trc_sclb_ptr      = TRC_POINTER(tp->sclb_ptr);
1840        tp->scgb_ptr->trc_acb_ptr       = TRC_POINTER(tp->acb_head);
1841        tp->scgb_ptr->trc_isb_ptr       = TRC_POINTER(tp->isb_ptr);
1842        tp->scgb_ptr->isbsiz            = (sizeof(ISBlock)) - 2;
1843
1844        /* Initialize System Control Block. (SCB) */
1845        tp->sclb_ptr->valid_command    = SCLB_VALID | SCLB_CMD_NOP;
1846        tp->sclb_ptr->iack_code        = 0;
1847        tp->sclb_ptr->resume_control   = 0;
1848        tp->sclb_ptr->int_mask_control = 0;
1849        tp->sclb_ptr->int_mask_state   = 0;
1850
1851        /* Initialize Interrupt Status Block. (ISB) */
1852        for(i = 0; i < NUM_OF_INTERRUPTS; i++)
1853        {
1854                tp->isb_ptr->IStatus[i].IType = 0xf0;
1855                tp->isb_ptr->IStatus[i].ISubtype = 0;
1856        }
1857
1858        tp->current_isb_index = 0;
1859
1860        /* Initialize Action Command Block. (ACB) */
1861        smctr_init_acbs(dev);
1862
1863        /* Initialize transmit FCB's and BDB's. */
1864        smctr_link_tx_fcbs_to_bdbs(dev);
1865        smctr_init_tx_bdbs(dev);
1866        smctr_init_tx_fcbs(dev);
1867
1868        /* Initialize receive FCB's and BDB's. */
1869        smctr_init_rx_bdbs(dev);
1870        smctr_init_rx_fcbs(dev);
1871
1872        return (0);
1873}
1874
1875static int smctr_init_tx_bdbs(struct net_device *dev)
1876{
1877        struct net_local *tp = netdev_priv(dev);
1878        unsigned int i, j;
1879        BDBlock *bdb;
1880
1881        for(i = 0; i < NUM_TX_QS_USED; i++)
1882        {
1883                bdb = tp->tx_bdb_head[i];
1884                bdb->info = (BDB_NOT_CHAIN_END | BDB_NO_WARNING);
1885                bdb->next_ptr = (BDBlock *)(((char *)bdb) + sizeof(BDBlock));
1886                bdb->trc_next_ptr = TRC_POINTER(bdb->next_ptr);
1887
1888                for(j = 1; j < tp->num_tx_bdbs[i]; j++)
1889                {
1890                        bdb->next_ptr->back_ptr = bdb;
1891                        bdb = bdb->next_ptr;
1892                        bdb->info = (BDB_NOT_CHAIN_END | BDB_NO_WARNING);
1893                        bdb->next_ptr
1894                                = (BDBlock *)(((char *)bdb) + sizeof( BDBlock));                        bdb->trc_next_ptr = TRC_POINTER(bdb->next_ptr);
1895                }
1896
1897                bdb->next_ptr = tp->tx_bdb_head[i];
1898                bdb->trc_next_ptr = TRC_POINTER(tp->tx_bdb_head[i]);
1899                tp->tx_bdb_head[i]->back_ptr = bdb;
1900        }
1901
1902        return (0);
1903}
1904
1905static int smctr_init_tx_fcbs(struct net_device *dev)
1906{
1907        struct net_local *tp = netdev_priv(dev);
1908        unsigned int i, j;
1909        FCBlock *fcb;
1910
1911        for(i = 0; i < NUM_TX_QS_USED; i++)
1912        {
1913                fcb               = tp->tx_fcb_head[i];
1914                fcb->frame_status = 0;
1915                fcb->frame_length = 0;
1916                fcb->info         = FCB_CHAIN_END;
1917                fcb->next_ptr = (FCBlock *)(((char *)fcb) + sizeof(FCBlock));
1918                fcb->trc_next_ptr = TRC_POINTER(fcb->next_ptr);
1919
1920                for(j = 1; j < tp->num_tx_fcbs[i]; j++)
1921                {
1922                        fcb->next_ptr->back_ptr = fcb;
1923                        fcb                     = fcb->next_ptr;
1924                        fcb->frame_status       = 0;
1925                        fcb->frame_length       = 0;
1926                        fcb->info               = FCB_CHAIN_END;
1927                        fcb->next_ptr
1928                                = (FCBlock *)(((char *)fcb) + sizeof(FCBlock));
1929                        fcb->trc_next_ptr = TRC_POINTER(fcb->next_ptr);
1930                }
1931
1932                fcb->next_ptr           = tp->tx_fcb_head[i];
1933                fcb->trc_next_ptr       = TRC_POINTER(tp->tx_fcb_head[i]);
1934
1935                tp->tx_fcb_head[i]->back_ptr    = fcb;
1936                tp->tx_fcb_end[i]               = tp->tx_fcb_head[i]->next_ptr;
1937                tp->tx_fcb_curr[i]              = tp->tx_fcb_head[i]->next_ptr;
1938                tp->num_tx_fcbs_used[i]         = 0;
1939        }
1940
1941        return (0);
1942}
1943
1944static int smctr_internal_self_test(struct net_device *dev)
1945{
1946        struct net_local *tp = netdev_priv(dev);
1947        int err;
1948
1949        if((err = smctr_issue_test_internal_rom_cmd(dev)))
1950                return (err);
1951
1952        if((err = smctr_wait_cmd(dev)))
1953                return (err);
1954
1955        if(tp->acb_head->cmd_done_status & 0xff)
1956                return (-1);
1957
1958        if((err = smctr_issue_test_hic_cmd(dev)))
1959                return (err);
1960
1961        if((err = smctr_wait_cmd(dev)))
1962                return (err);
1963
1964        if(tp->acb_head->cmd_done_status & 0xff)
1965                return (-1);
1966
1967        if((err = smctr_issue_test_mac_reg_cmd(dev)))
1968                return (err);
1969
1970        if((err = smctr_wait_cmd(dev)))
1971                return (err);
1972
1973        if(tp->acb_head->cmd_done_status & 0xff)
1974                return (-1);
1975
1976        return (0);
1977}
1978
1979/*
1980 * The typical workload of the driver: Handle the network interface interrupts.
1981 */
1982static irqreturn_t smctr_interrupt(int irq, void *dev_id)
1983{
1984        struct net_device *dev = dev_id;
1985        struct net_local *tp;
1986        int ioaddr;
1987        __u16 interrupt_unmask_bits = 0, interrupt_ack_code = 0xff00;
1988        __u16 err1, err = NOT_MY_INTERRUPT;
1989        __u8 isb_type, isb_subtype;
1990        __u16 isb_index;
1991
1992        ioaddr = dev->base_addr;
1993        tp = netdev_priv(dev);
1994
1995        if(tp->status == NOT_INITIALIZED)
1996                return IRQ_NONE;
1997
1998        spin_lock(&tp->lock);
1999
2000        smctr_disable_bic_int(dev);
2001        smctr_enable_16bit(dev);
2002
2003        smctr_clear_int(dev);
2004
2005        /* First read the LSB */
2006        while((tp->isb_ptr->IStatus[tp->current_isb_index].IType & 0xf0) == 0)
2007        {
2008                isb_index       = tp->current_isb_index;
2009                isb_type        = tp->isb_ptr->IStatus[isb_index].IType;
2010                isb_subtype     = tp->isb_ptr->IStatus[isb_index].ISubtype;
2011
2012                (tp->current_isb_index)++;
2013                if(tp->current_isb_index == NUM_OF_INTERRUPTS)
2014                        tp->current_isb_index = 0;
2015
2016                if(isb_type >= 0x10)
2017                {
2018                        smctr_disable_16bit(dev);
2019		        spin_unlock(&tp->lock);
2020                        return IRQ_HANDLED;
2021                }
2022
2023                err = HARDWARE_FAILED;
2024                interrupt_ack_code = isb_index;
2025                tp->isb_ptr->IStatus[isb_index].IType |= 0xf0;
2026
2027                interrupt_unmask_bits |= (1 << (__u16)isb_type);
2028
2029                switch(isb_type)
2030                {
2031                        case ISB_IMC_MAC_TYPE_3:
2032                                smctr_disable_16bit(dev);
2033
2034                                switch(isb_subtype)
2035                                {
2036                                        case 0:
2037                                                tp->monitor_state = MS_MONITOR_FSM_INACTIVE;
2038                                               break;
2039
2040                                        case 1:
2041                                                tp->monitor_state = MS_REPEAT_BEACON_STATE;
2042                                                break;
2043
2044                                        case 2:
2045                                                tp->monitor_state = MS_REPEAT_CLAIM_TOKEN_STATE;
2046                                                break;
2047
2048                                        case 3:
2049                                                tp->monitor_state = MS_TRANSMIT_CLAIM_TOKEN_STATE;                                                break;
2050
2051                                        case 4:
2052                                                tp->monitor_state = MS_STANDBY_MONITOR_STATE;
2053                                                break;
2054
2055                                        case 5:
2056                                                tp->monitor_state = MS_TRANSMIT_BEACON_STATE;
2057                                                break;
2058
2059                                        case 6:
2060                                                tp->monitor_state = MS_ACTIVE_MONITOR_STATE;
2061                                                break;
2062
2063                                        case 7:
2064                                                tp->monitor_state = MS_TRANSMIT_RING_PURGE_STATE;
2065                                                break;
2066
2067                                        case 8:   /* diagnostic state */
2068                                                break;
2069
2070                                        case 9:
2071                                                tp->monitor_state = MS_BEACON_TEST_STATE;
2072                                                if(smctr_lobe_media_test(dev))
2073                                                {
2074                                                        tp->ring_status_flags = RING_STATUS_CHANGED;
2075                                                        tp->ring_status = AUTO_REMOVAL_ERROR;
2076                                                        smctr_ring_status_chg(dev);
2077                                                        smctr_bypass_state(dev);
2078                                                }
2079                                                else
2080                                                        smctr_issue_insert_cmd(dev);
2081                                                break;
2082
2083                                        /* case 0x0a-0xff, illegal states */
2084                                        default:
2085                                                break;
2086                                }
2087
2088                                tp->ring_status_flags = MONITOR_STATE_CHANGED;
2089                                err = smctr_ring_status_chg(dev);
2090
2091                                smctr_enable_16bit(dev);
2092                                break;
2093
2094                        /* Type 0x02 - MAC Error Counters Interrupt
2095                         * One or more MAC Error Counter is half full
2096                         *      MAC Error Counters
2097                         *      Lost_FR_Error_Counter
2098                         *      RCV_Congestion_Counter
2099                         *      FR_copied_Error_Counter
2100                         *      FREQ_Error_Counter
2101                         *      Token_Error_Counter
2102                         *      Line_Error_Counter
2103                         *      Internal_Error_Count
2104                         */
2105                        case ISB_IMC_MAC_ERROR_COUNTERS:
2106                                /* Read 802.5 Error Counters */
2107                                err = smctr_issue_read_ring_status_cmd(dev);
2108                                break;
2109
2110                        /* Type 0x04 - MAC Type 2 Interrupt
2111                         * HOST needs to enqueue MAC Frame for transmission
2112                         * SubType Bit 15 - RQ_INIT_PDU( Request Initialization)                         * Changed from RQ_INIT_PDU to
2113                         * TRC_Status_Changed_Indicate
2114                         */
2115                        case ISB_IMC_MAC_TYPE_2:
2116                                err = smctr_issue_read_ring_status_cmd(dev);
2117                                break;
2118
2119
2120                        /* Type 0x05 - TX Frame Interrupt (FI). */
2121                        case ISB_IMC_TX_FRAME:
2122                                /* BUG QUEUE for TRC stuck receive BUG */
2123                                if(isb_subtype & TX_PENDING_PRIORITY_2)
2124                                {
2125                                        if((err = smctr_tx_complete(dev, BUG_QUEUE)) != SUCCESS)
2126                                                break;
2127                                }
2128
2129                                /* NON-MAC frames only */
2130                                if(isb_subtype & TX_PENDING_PRIORITY_1)
2131                                {
2132                                        if((err = smctr_tx_complete(dev, NON_MAC_QUEUE)) != SUCCESS)
2133                                                break;
2134                                }
2135
2136                                /* MAC frames only */
2137                                if(isb_subtype & TX_PENDING_PRIORITY_0)
2138                                        err = smctr_tx_complete(dev, MAC_QUEUE);                                break;
2139
2140                        /* Type 0x06 - TX END OF QUEUE (FE) */
2141                        case ISB_IMC_END_OF_TX_QUEUE:
2142                                /* BUG queue */
2143                                if(isb_subtype & TX_PENDING_PRIORITY_2)
2144                                {
2145                                        /* ok to clear Receive FIFO overrun
2146                                         * imask send_BUG now completes.
2147                                         */
2148                                        interrupt_unmask_bits |= 0x800;
2149
2150                                        tp->tx_queue_status[BUG_QUEUE] = NOT_TRANSMITING;
2151                                        if((err = smctr_tx_complete(dev, BUG_QUEUE)) != SUCCESS)
2152                                                break;
2153                                        if((err = smctr_restart_tx_chain(dev, BUG_QUEUE)) != SUCCESS)
2154                                                break;
2155                                }
2156
2157                                /* NON-MAC queue only */
2158                                if(isb_subtype & TX_PENDING_PRIORITY_1)
2159                                {
2160                                        tp->tx_queue_status[NON_MAC_QUEUE] = NOT_TRANSMITING;
2161                                        if((err = smctr_tx_complete(dev, NON_MAC_QUEUE)) != SUCCESS)
2162                                                break;
2163                                        if((err = smctr_restart_tx_chain(dev, NON_MAC_QUEUE)) != SUCCESS)
2164                                                break;
2165                                }
2166
2167                                /* MAC queue only */
2168                                if(isb_subtype & TX_PENDING_PRIORITY_0)
2169                                {
2170                                        tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING;
2171                                        if((err = smctr_tx_complete(dev, MAC_QUEUE)) != SUCCESS)
2172                                                break;
2173
2174                                        err = smctr_restart_tx_chain(dev, MAC_QUEUE);
2175                                }
2176                                break;
2177
2178                        /* Type 0x07 - NON-MAC RX Resource Interrupt
2179                         *   Subtype bit 12 - (BW) BDB warning
2180                         *   Subtype bit 13 - (FW) FCB warning
2181                         *   Subtype bit 14 - (BE) BDB End of chain
2182                         *   Subtype bit 15 - (FE) FCB End of chain
2183                         */
2184                        case ISB_IMC_NON_MAC_RX_RESOURCE:
2185                                tp->rx_fifo_overrun_count = 0;
2186                                tp->receive_queue_number = NON_MAC_QUEUE;
2187                                err1 = smctr_rx_frame(dev);
2188
2189                                if(isb_subtype & NON_MAC_RX_RESOURCE_FE)
2190                                {
2191                                        if((err = smctr_issue_resume_rx_fcb_cmd(                                                dev, NON_MAC_QUEUE)) != SUCCESS)                                                break;
2192
2193                                        if(tp->ptr_rx_fcb_overruns)
2194                                                (*tp->ptr_rx_fcb_overruns)++;
2195                                }
2196
2197                                if(isb_subtype & NON_MAC_RX_RESOURCE_BE)
2198                                {
2199                                        if((err = smctr_issue_resume_rx_bdb_cmd(                                                dev, NON_MAC_QUEUE)) != SUCCESS)                                                break;
2200
2201                                        if(tp->ptr_rx_bdb_overruns)
2202                                                (*tp->ptr_rx_bdb_overruns)++;
2203                                }
2204                                err = err1;
2205                                break;
2206
2207                        /* Type 0x08 - MAC RX Resource Interrupt
2208                         *   Subtype bit 12 - (BW) BDB warning
2209                         *   Subtype bit 13 - (FW) FCB warning
2210                         *   Subtype bit 14 - (BE) BDB End of chain
2211                         *   Subtype bit 15 - (FE) FCB End of chain
2212                         */
2213                        case ISB_IMC_MAC_RX_RESOURCE:
2214                                tp->receive_queue_number = MAC_QUEUE;
2215                                err1 = smctr_rx_frame(dev);
2216
2217                                if(isb_subtype & MAC_RX_RESOURCE_FE)
2218                                {
2219                                        if((err = smctr_issue_resume_rx_fcb_cmd(                                                dev, MAC_QUEUE)) != SUCCESS)
2220                                                break;
2221
2222                                        if(tp->ptr_rx_fcb_overruns)
2223                                                (*tp->ptr_rx_fcb_overruns)++;
2224                                }
2225
2226                                if(isb_subtype & MAC_RX_RESOURCE_BE)
2227                                {
2228                                        if((err = smctr_issue_resume_rx_bdb_cmd(                                                dev, MAC_QUEUE)) != SUCCESS)
2229                                                break;
2230
2231                                        if(tp->ptr_rx_bdb_overruns)
2232                                                (*tp->ptr_rx_bdb_overruns)++;
2233                                }
2234                                err = err1;
2235                                break;
2236
2237                        /* Type 0x09 - NON_MAC RX Frame Interrupt */
2238                        case ISB_IMC_NON_MAC_RX_FRAME:
2239                                tp->rx_fifo_overrun_count = 0;
2240                                tp->receive_queue_number = NON_MAC_QUEUE;
2241                                err = smctr_rx_frame(dev);
2242                                break;
2243
2244                        /* Type 0x0A - MAC RX Frame Interrupt */
2245                        case ISB_IMC_MAC_RX_FRAME:
2246                                tp->receive_queue_number = MAC_QUEUE;
2247                                err = smctr_rx_frame(dev);
2248                                break;
2249
2250                        /* Type 0x0B - TRC status
2251                         * TRC has encountered an error condition
2252                         * subtype bit 14 - transmit FIFO underrun
2253                         * subtype bit 15 - receive FIFO overrun
2254                         */
2255                        case ISB_IMC_TRC_FIFO_STATUS:
2256                                if(isb_subtype & TRC_FIFO_STATUS_TX_UNDERRUN)
2257                                {
2258                                        if(tp->ptr_tx_fifo_underruns)
2259                                                (*tp->ptr_tx_fifo_underruns)++;
2260                                }
2261
2262                                if(isb_subtype & TRC_FIFO_STATUS_RX_OVERRUN)
2263                                {
2264                                        /* update overrun stuck receive counter
2265                                         * if >= 3, has to clear it by sending
2266                                         * back to back frames. We pick
2267                                         * DAT(duplicate address MAC frame)
2268                                         */
2269                                        tp->rx_fifo_overrun_count++;
2270
2271                                        if(tp->rx_fifo_overrun_count >= 3)
2272                                        {
2273                                                tp->rx_fifo_overrun_count = 0;
2274
2275                                                /* delay clearing fifo overrun
2276                                                 * imask till send_BUG tx
2277                                                 * complete posted
2278                                                 */
2279                                                interrupt_unmask_bits &= (~0x800);
2280                                                printk(KERN_CRIT "Jay please send bug\n");//                                              smctr_send_bug(dev);
2281                                        }
2282
2283                                        if(tp->ptr_rx_fifo_overruns)
2284                                                (*tp->ptr_rx_fifo_overruns)++;
2285                                }
2286
2287                                err = SUCCESS;
2288                                break;
2289
2290                        /* Type 0x0C - Action Command Status Interrupt
2291                         * Subtype bit 14 - CB end of command chain (CE)
2292                         * Subtype bit 15 - CB command interrupt (CI)
2293                         */
2294                        case ISB_IMC_COMMAND_STATUS:
2295                                err = SUCCESS;
2296                                if(tp->acb_head->cmd == ACB_CMD_HIC_NOP)
2297                                {
2298                                        printk(KERN_ERR "i1\n");
2299                                        smctr_disable_16bit(dev);
2300
2301                                        /* XXXXXXXXXXXXXXXXX */
2302                                /*      err = UM_Interrupt(dev); */
2303
2304                                        smctr_enable_16bit(dev);
2305                                }
2306                                else
2307                                {
2308                                        if((tp->acb_head->cmd
2309                                                == ACB_CMD_READ_TRC_STATUS)
2310                                                && (tp->acb_head->subcmd
2311                                                == RW_TRC_STATUS_BLOCK))
2312                                        {
2313                                                if(tp->ptr_bcn_type != 0)
2314                                                {
2315                                                        *(tp->ptr_bcn_type)
2316                                                                = (__u32)((SBlock *)tp->misc_command_data)->BCN_Type;
2317                                                }
2318
2319                                                if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & ERROR_COUNTERS_CHANGED)
2320                                                {
2321                                                        smctr_update_err_stats(dev);
2322                                                }
2323
2324                                                if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & TI_NDIS_RING_STATUS_CHANGED)
2325                                                {
2326                                                        tp->ring_status
2327                                                                = ((SBlock*)tp->misc_command_data)->TI_NDIS_Ring_Status;
2328                                                        smctr_disable_16bit(dev);
2329                                                        err = smctr_ring_status_chg(dev);
2330                                                        smctr_enable_16bit(dev);
2331                                                        if((tp->ring_status & REMOVE_RECEIVED)
2332                                                                && (tp->config_word0 & NO_AUTOREMOVE))
2333                                                        {
2334                                                                smctr_issue_remove_cmd(dev);
2335                                                        }
2336
2337                                                        if(err != SUCCESS)
2338                                                        {
2339                                                                tp->acb_pending = 0;
2340                                                                break;
2341                                                        }
2342                                                }
2343
2344                                                if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & UNA_CHANGED)
2345                                                {
2346                                                        if(tp->ptr_una)
2347                                                        {
2348                                                                tp->ptr_una[0] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[0]);
2349                                                                tp->ptr_una[1] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[1]);
2350                                                                tp->ptr_una[2] = SWAP_BYTES(((SBlock *)tp->misc_command_data)->UNA[2]);
2351                                                        }
2352
2353                                                }
2354
2355                                                if(((SBlock *)tp->misc_command_data)->Status_CHG_Indicate & READY_TO_SEND_RQ_INIT)                                                {
2356                                                        err = smctr_send_rq_init(dev);
2357                                                }
2358                                        }
2359                                }
2360
2361                                tp->acb_pending = 0;
2362                                break;
2363
2364                        /* Type 0x0D - MAC Type 1 interrupt
2365                         * Subtype -- 00 FR_BCN received at S12
2366                         *            01 FR_BCN received at S21
2367                         *            02 FR_DAT(DA=MA, A<>0) received at S21
2368                         *            03 TSM_EXP at S21
2369                         *            04 FR_REMOVE received at S42
2370                         *            05 TBR_EXP, BR_FLAG_SET at S42
2371                         *            06 TBT_EXP at S53
2372                         */
2373                        case ISB_IMC_MAC_TYPE_1:
2374                                if(isb_subtype > 8)
2375                                {
2376                                        err = HARDWARE_FAILED;
2377                                        break;
2378                                }
2379
2380                                err = SUCCESS;
2381                                switch(isb_subtype)
2382                                {
2383                                        case 0:
2384                                                tp->join_state = JS_BYPASS_STATE;
2385                                                if(tp->status != CLOSED)
2386                                                {
2387                                                        tp->status = CLOSED;
2388                                                        err = smctr_status_chg(dev);
2389                                                }
2390                                                break;
2391
2392                                        case 1:
2393                                                tp->join_state = JS_LOBE_TEST_STATE;
2394                                                break;
2395
2396                                        case 2:
2397                                                tp->join_state = JS_DETECT_MONITOR_PRESENT_STATE;
2398                                                break;
2399
2400                                        case 3:
2401                                                tp->join_state = JS_AWAIT_NEW_MONITOR_STATE;
2402                                                break;
2403
2404                                        case 4:
2405                                                tp->join_state = JS_DUPLICATE_ADDRESS_TEST_STATE;
2406                                                break;
2407
2408                                        case 5:
2409                                                tp->join_state = JS_NEIGHBOR_NOTIFICATION_STATE;
2410                                                break;
2411
2412                                        case 6:
2413                                                tp->join_state = JS_REQUEST_INITIALIZATION_STATE;
2414                                                break;
2415
2416                                        case 7:
2417                                                tp->join_state = JS_JOIN_COMPLETE_STATE;
2418                                                tp->status = OPEN;
2419                                                err = smctr_status_chg(dev);
2420                                                break;
2421
2422                                        case 8:
2423                                                tp->join_state = JS_BYPASS_WAIT_STATE;
2424                                                break;
2425                                }
2426                                break ;
2427
2428                        /* Type 0x0E - TRC Initialization Sequence Interrupt
2429                         * Subtype -- 00-FF Initializatin sequence complete
2430                         */
2431                        case ISB_IMC_TRC_INTRNL_TST_STATUS:
2432                                tp->status = INITIALIZED;
2433                                smctr_disable_16bit(dev);
2434                                err = smctr_status_chg(dev);
2435                                smctr_enable_16bit(dev);
2436                                break;
2437
2438                        /* other interrupt types, illegal */
2439                        default:
2440                                break;
2441                }
2442
2443                if(err != SUCCESS)
2444                        break;
2445        }
2446
2447        /* Checking the ack code instead of the unmask bits here is because :
2448         * while fixing the stuck receive, DAT frame are sent and mask off
2449         * FIFO overrun interrupt temporarily (interrupt_unmask_bits = 0)
2450         * but we still want to issue ack to ISB
2451         */
2452        if(!(interrupt_ack_code & 0xff00))
2453                smctr_issue_int_ack(dev, interrupt_ack_code, interrupt_unmask_bits);
2454
2455        smctr_disable_16bit(dev);
2456        smctr_enable_bic_int(dev);
2457        spin_unlock(&tp->lock);
2458
2459        return IRQ_HANDLED;
2460}
2461
2462static int smctr_issue_enable_int_cmd(struct net_device *dev,
2463        __u16 interrupt_enable_mask)
2464{
2465        struct net_local *tp = netdev_priv(dev);
2466        int err;
2467
2468        if((err = smctr_wait_while_cbusy(dev)))
2469                return (err);
2470
2471        tp->sclb_ptr->int_mask_control  = interrupt_enable_mask;
2472        tp->sclb_ptr->valid_command     = SCLB_VALID | SCLB_CMD_CLEAR_INTERRUPT_MASK;
2473
2474        smctr_set_ctrl_attention(dev);
2475
2476        return (0);
2477}
2478
2479static int smctr_issue_int_ack(struct net_device *dev, __u16 iack_code, __u16 ibits)
2480{
2481        struct net_local *tp = netdev_priv(dev);
2482
2483        if(smctr_wait_while_cbusy(dev))
2484                return (-1);
2485
2486        tp->sclb_ptr->int_mask_control = ibits;
2487        tp->sclb_ptr->iack_code = iack_code << 1; /* use the offset from base */        tp->sclb_ptr->resume_control = 0;
2488        tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_IACK_CODE_VALID | SCLB_CMD_CLEAR_INTERRUPT_MASK;
2489
2490        smctr_set_ctrl_attention(dev);
2491
2492        return (0);
2493}
2494
2495static int smctr_issue_init_timers_cmd(struct net_device *dev)
2496{
2497        struct net_local *tp = netdev_priv(dev);
2498        unsigned int i;
2499        int err;
2500        __u16 *pTimer_Struc = (__u16 *)tp->misc_command_data;
2501
2502        if((err = smctr_wait_while_cbusy(dev)))
2503                return (err);
2504
2505        if((err = smctr_wait_cmd(dev)))
2506                return (err);
2507
2508        tp->config_word0 = THDREN | DMA_TRIGGER | USETPT | NO_AUTOREMOVE;
2509        tp->config_word1 = 0;
2510
2511        if((tp->media_type == MEDIA_STP_16)
2512                || (tp->media_type == MEDIA_UTP_16)
2513                || (tp->media_type == MEDIA_STP_16_UTP_16))
2514        {
2515                tp->config_word0 |= FREQ_16MB_BIT;
2516        }
2517
2518        if(tp->mode_bits & EARLY_TOKEN_REL)
2519                tp->config_word0 |= ETREN;
2520
2521        if(tp->mode_bits & LOOPING_MODE_MASK)
2522                tp->config_word0 |= RX_OWN_BIT;
2523        else
2524                tp->config_word0 &= ~RX_OWN_BIT;
2525
2526        if(tp->receive_mask & PROMISCUOUS_MODE)
2527                tp->config_word0 |= PROMISCUOUS_BIT;
2528        else
2529                tp->config_word0 &= ~PROMISCUOUS_BIT;
2530
2531        if(tp->receive_mask & ACCEPT_ERR_PACKETS)
2532                tp->config_word0 |= SAVBAD_BIT;
2533        else
2534                tp->config_word0 &= ~SAVBAD_BIT;
2535
2536        if(tp->receive_mask & ACCEPT_ATT_MAC_FRAMES)
2537                tp->config_word0 |= RXATMAC;
2538        else
2539                tp->config_word0 &= ~RXATMAC;
2540
2541        if(tp->receive_mask & ACCEPT_MULTI_PROM)
2542                tp->config_word1 |= MULTICAST_ADDRESS_BIT;
2543        else
2544                tp->config_word1 &= ~MULTICAST_ADDRESS_BIT;
2545
2546        if(tp->receive_mask & ACCEPT_SOURCE_ROUTING_SPANNING)
2547                tp->config_word1 |= SOURCE_ROUTING_SPANNING_BITS;
2548        else
2549        {
2550                if(tp->receive_mask & ACCEPT_SOURCE_ROUTING)
2551                        tp->config_word1 |= SOURCE_ROUTING_EXPLORER_BIT;
2552                else
2553                        tp->config_word1 &= ~SOURCE_ROUTING_SPANNING_BITS;
2554        }
2555
2556        if((tp->media_type == MEDIA_STP_16)
2557                || (tp->media_type == MEDIA_UTP_16)
2558                || (tp->media_type == MEDIA_STP_16_UTP_16))
2559        {
2560                tp->config_word1 |= INTERFRAME_SPACING_16;
2561        }
2562        else
2563                tp->config_word1 |= INTERFRAME_SPACING_4;
2564
2565        *pTimer_Struc++ = tp->config_word0;
2566        *pTimer_Struc++ = tp->config_word1;
2567
2568        if((tp->media_type == MEDIA_STP_4)
2569                || (tp->media_type == MEDIA_UTP_4)
2570                || (tp->media_type == MEDIA_STP_4_UTP_4))
2571        {
2572                *pTimer_Struc++ = 0x00FA;       /* prescale */
2573                *pTimer_Struc++ = 0x2710;       /* TPT_limit */
2574                *pTimer_Struc++ = 0x2710;       /* TQP_limit */
2575                *pTimer_Struc++ = 0x0A28;       /* TNT_limit */
2576                *pTimer_Struc++ = 0x3E80;       /* TBT_limit */
2577                *pTimer_Struc++ = 0x3A98;       /* TSM_limit */
2578                *pTimer_Struc++ = 0x1B58;       /* TAM_limit */
2579                *pTimer_Struc++ = 0x00C8;       /* TBR_limit */
2580                *pTimer_Struc++ = 0x07D0;       /* TER_limit */
2581                *pTimer_Struc++ = 0x000A;       /* TGT_limit */
2582                *pTimer_Struc++ = 0x1162;       /* THT_limit */
2583                *pTimer_Struc++ = 0x07D0;       /* TRR_limit */
2584                *pTimer_Struc++ = 0x1388;       /* TVX_limit */
2585                *pTimer_Struc++ = 0x0000;       /* reserved */
2586        }
2587        else
2588        {
2589                *pTimer_Struc++ = 0x03E8;       /* prescale */
2590                *pTimer_Struc++ = 0x9C40;       /* TPT_limit */
2591                *pTimer_Struc++ = 0x9C40;       /* TQP_limit */
2592                *pTimer_Struc++ = 0x0A28;       /* TNT_limit */
2593                *pTimer_Struc++ = 0x3E80;       /* TBT_limit */
2594                *pTimer_Struc++ = 0x3A98;       /* TSM_limit */
2595                *pTimer_Struc++ = 0x1B58;       /* TAM_limit */
2596                *pTimer_Struc++ = 0x00C8;       /* TBR_limit */
2597                *pTimer_Struc++ = 0x07D0;       /* TER_limit */
2598                *pTimer_Struc++ = 0x000A;       /* TGT_limit */
2599                *pTimer_Struc++ = 0x4588;       /* THT_limit */
2600                *pTimer_Struc++ = 0x1F40;       /* TRR_limit */
2601                *pTimer_Struc++ = 0x4E20;       /* TVX_limit */
2602                *pTimer_Struc++ = 0x0000;       /* reserved */
2603        }
2604
2605        /* Set node address. */
2606        *pTimer_Struc++ = dev->dev_addr[0] << 8
2607                | (dev->dev_addr[1] & 0xFF);
2608        *pTimer_Struc++ = dev->dev_addr[2] << 8
2609                | (dev->dev_addr[3] & 0xFF);
2610        *pTimer_Struc++ = dev->dev_addr[4] << 8
2611                | (dev->dev_addr[5] & 0xFF);
2612
2613        /* Set group address. */
2614        *pTimer_Struc++ = tp->group_address_0 << 8
2615                | tp->group_address_0 >> 8;
2616        *pTimer_Struc++ = tp->group_address[0] << 8
2617                | tp->group_address[0] >> 8;
2618        *pTimer_Struc++ = tp->group_address[1] << 8
2619                | tp->group_address[1] >> 8;
2620
2621        /* Set functional address. */
2622        *pTimer_Struc++ = tp->functional_address_0 << 8
2623                | tp->functional_address_0 >> 8;
2624        *pTimer_Struc++ = tp->functional_address[0] << 8
2625                | tp->functional_address[0] >> 8;
2626        *pTimer_Struc++ = tp->functional_address[1] << 8
2627                | tp->functional_address[1] >> 8;
2628
2629        /* Set Bit-Wise group address. */
2630        *pTimer_Struc++ = tp->bitwise_group_address[0] << 8
2631                | tp->bitwise_group_address[0] >> 8;
2632        *pTimer_Struc++ = tp->bitwise_group_address[1] << 8
2633                | tp->bitwise_group_address[1] >> 8;
2634
2635        /* Set ring number address. */
2636        *pTimer_Struc++ = tp->source_ring_number;
2637        *pTimer_Struc++ = tp->target_ring_number;
2638
2639        /* Physical drop number. */
2640        *pTimer_Struc++ = (unsigned short)0;
2641        *pTimer_Struc++ = (unsigned short)0;
2642
2643        /* Product instance ID. */
2644        for(i = 0; i < 9; i++)
2645                *pTimer_Struc++ = (unsigned short)0;
2646
2647        err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_INIT_TRC_TIMERS, 0);
2648
2649        return (err);
2650}
2651
2652static int smctr_issue_init_txrx_cmd(struct net_device *dev)
2653{
2654        struct net_local *tp = netdev_priv(dev);
2655        unsigned int i;
2656        int err;
2657        void **txrx_ptrs = (void *)tp->misc_command_data;
2658
2659        if((err = smctr_wait_while_cbusy(dev)))
2660                return (err);
2661
2662        if((err = smctr_wait_cmd(dev)))
2663	{
2664                printk(KERN_ERR "%s: Hardware failure\n", dev->name);
2665                return (err);
2666        }
2667
2668        /* Initialize Transmit Queue Pointers that are used, to point to
2669         * a single FCB.
2670         */
2671        for(i = 0; i < NUM_TX_QS_USED; i++)
2672                *txrx_ptrs++ = (void *)TRC_POINTER(tp->tx_fcb_head[i]);
2673
2674        /* Initialize Transmit Queue Pointers that are NOT used to ZERO. */
2675        for(; i < MAX_TX_QS; i++)
2676                *txrx_ptrs++ = (void *)0;
2677
2678        /* Initialize Receive Queue Pointers (MAC and Non-MAC) that are
2679         * used, to point to a single FCB and a BDB chain of buffers.
2680         */
2681        for(i = 0; i < NUM_RX_QS_USED; i++)
2682        {
2683                *txrx_ptrs++ = (void *)TRC_POINTER(tp->rx_fcb_head[i]);
2684                *txrx_ptrs++ = (void *)TRC_POINTER(tp->rx_bdb_head[i]);
2685        }
2686
2687        /* Initialize Receive Queue Pointers that are NOT used to ZERO. */
2688        for(; i < MAX_RX_QS; i++)
2689        {
2690                *txrx_ptrs++ = (void *)0;
2691                *txrx_ptrs++ = (void *)0;
2692        }
2693
2694        err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_INIT_TX_RX, 0);
2695
2696        return (err);
2697}
2698
2699static int smctr_issue_insert_cmd(struct net_device *dev)
2700{
2701        int err;
2702
2703        err = smctr_setup_single_cmd(dev, ACB_CMD_INSERT, ACB_SUB_CMD_NOP);
2704
2705        return (err);
2706}
2707
2708static int smctr_issue_read_ring_status_cmd(struct net_device *dev)
2709{
2710        int err;
2711
2712        if((err = smctr_wait_while_cbusy(dev)))
2713                return (err);
2714
2715        if((err = smctr_wait_cmd(dev)))
2716                return (err);
2717
2718        err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_READ_TRC_STATUS,
2719                RW_TRC_STATUS_BLOCK);
2720
2721        return (err);
2722}
2723
2724static int smctr_issue_read_word_cmd(struct net_device *dev, __u16 aword_cnt)
2725{
2726        int err;
2727
2728        if((err = smctr_wait_while_cbusy(dev)))
2729                return (err);
2730
2731        if((err = smctr_wait_cmd(dev)))
2732                return (err);
2733
2734        err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_MCT_READ_VALUE,
2735                aword_cnt);
2736
2737        return (err);
2738}
2739
2740static int smctr_issue_remove_cmd(struct net_device *dev)
2741{
2742        struct net_local *tp = netdev_priv(dev);
2743        int err;
2744
2745        if((err = smctr_wait_while_cbusy(dev)))
2746                return (err);
2747
2748        tp->sclb_ptr->resume_control    = 0;
2749        tp->sclb_ptr->valid_command     = SCLB_VALID | SCLB_CMD_REMOVE;
2750
2751        smctr_set_ctrl_attention(dev);
2752
2753        return (0);
2754}
2755
2756static int smctr_issue_resume_acb_cmd(struct net_device *dev)
2757{
2758        struct net_local *tp = netdev_priv(dev);
2759        int err;
2760
2761        if((err = smctr_wait_while_cbusy(dev)))
2762                return (err);
2763
2764        tp->sclb_ptr->resume_control = SCLB_RC_ACB;
2765        tp->sclb_ptr->valid_command  = SCLB_VALID | SCLB_RESUME_CONTROL_VALID;
2766
2767        tp->acb_pending = 1;
2768
2769        smctr_set_ctrl_attention(dev);
2770
2771        return (0);
2772}
2773
2774static int smctr_issue_resume_rx_bdb_cmd(struct net_device *dev, __u16 queue)
2775{
2776        struct net_local *tp = netdev_priv(dev);
2777        int err;
2778
2779        if((err = smctr_wait_while_cbusy(dev)))
2780                return (err);
2781
2782        if(queue == MAC_QUEUE)
2783                tp->sclb_ptr->resume_control = SCLB_RC_RX_MAC_BDB;
2784        else
2785                tp->sclb_ptr->resume_control = SCLB_RC_RX_NON_MAC_BDB;
2786
2787        tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_RESUME_CONTROL_VALID;
2788
2789        smctr_set_ctrl_attention(dev);
2790
2791        return (0);
2792}
2793
2794static int smctr_issue_resume_rx_fcb_cmd(struct net_device *dev, __u16 queue)
2795{
2796        struct net_local *tp = netdev_priv(dev);
2797
2798        if(smctr_debug > 10)
2799                printk(KERN_DEBUG "%s: smctr_issue_resume_rx_fcb_cmd\n", dev->name);
2800
2801        if(smctr_wait_while_cbusy(dev))
2802                return (-1);
2803
2804        if(queue == MAC_QUEUE)
2805                tp->sclb_ptr->resume_control = SCLB_RC_RX_MAC_FCB;
2806        else
2807                tp->sclb_ptr->resume_control = SCLB_RC_RX_NON_MAC_FCB;
2808
2809        tp->sclb_ptr->valid_command = SCLB_VALID | SCLB_RESUME_CONTROL_VALID;
2810
2811        smctr_set_ctrl_attention(dev);
2812
2813        return (0);
2814}
2815
2816static int smctr_issue_resume_tx_fcb_cmd(struct net_device *dev, __u16 queue)
2817{
2818        struct net_local *tp = netdev_priv(dev);
2819
2820        if(smctr_debug > 10)
2821                printk(KERN_DEBUG "%s: smctr_issue_resume_tx_fcb_cmd\n", dev->name);
2822
2823        if(smctr_wait_while_cbusy(dev))
2824                return (-1);
2825
2826        tp->sclb_ptr->resume_control = (SCLB_RC_TFCB0 << queue);
2827        tp->sclb_ptr->valid_command = SCLB_RESUME_CONTROL_VALID | SCLB_VALID;
2828
2829        smctr_set_ctrl_attention(dev);
2830
2831        return (0);
2832}
2833
2834static int smctr_issue_test_internal_rom_cmd(struct net_device *dev)
2835{
2836        int err;
2837
2838        err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST,
2839                TRC_INTERNAL_ROM_TEST);
2840
2841        return (err);
2842}
2843
2844static int smctr_issue_test_hic_cmd(struct net_device *dev)
2845{
2846        int err;
2847
2848        err = smctr_setup_single_cmd(dev, ACB_CMD_HIC_TEST,
2849                TRC_HOST_INTERFACE_REG_TEST);
2850
2851        return (err);
2852}
2853
2854static int smctr_issue_test_mac_reg_cmd(struct net_device *dev)
2855{
2856        int err;
2857
2858        err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST,
2859                TRC_MAC_REGISTERS_TEST);
2860
2861        return (err);
2862}
2863
2864static int smctr_issue_trc_loopback_cmd(struct net_device *dev)
2865{
2866        int err;
2867
2868        err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST,
2869                TRC_INTERNAL_LOOPBACK);
2870
2871        return (err);
2872}
2873
2874static int smctr_issue_tri_loopback_cmd(struct net_device *dev)
2875{
2876        int err;
2877
2878        err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST,
2879                TRC_TRI_LOOPBACK);
2880
2881        return (err);
2882}
2883
2884static int smctr_issue_write_byte_cmd(struct net_device *dev,
2885        short aword_cnt, void *byte)
2886{
2887	struct net_local *tp = netdev_priv(dev);
2888        unsigned int iword, ibyte;
2889	int err;
2890
2891        if((err = smctr_wait_while_cbusy(dev)))
2892                return (err);
2893
2894        if((err = smctr_wait_cmd(dev)))
2895                return (err);
2896
2897        for(iword = 0, ibyte = 0; iword < (unsigned int)(aword_cnt & 0xff);
2898        	iword++, ibyte += 2)
2899        {
2900                tp->misc_command_data[iword] = (*((__u8 *)byte + ibyte) << 8)
2901			| (*((__u8 *)byte + ibyte + 1));
2902        }
2903
2904        return (smctr_setup_single_cmd_w_data(dev, ACB_CMD_MCT_WRITE_VALUE,
2905		aword_cnt));
2906}
2907
2908static int smctr_issue_write_word_cmd(struct net_device *dev,
2909        short aword_cnt, void *word)
2910{
2911        struct net_local *tp = netdev_priv(dev);
2912        unsigned int i, err;
2913
2914        if((err = smctr_wait_while_cbusy(dev)))
2915                return (err);
2916
2917        if((err = smctr_wait_cmd(dev)))
2918                return (err);
2919
2920        for(i = 0; i < (unsigned int)(aword_cnt & 0xff); i++)
2921                tp->misc_command_data[i] = *((__u16 *)word + i);
2922
2923        err = smctr_setup_single_cmd_w_data(dev, ACB_CMD_MCT_WRITE_VALUE,
2924                aword_cnt);
2925
2926        return (err);
2927}
2928
2929static int smctr_join_complete_state(struct net_device *dev)
2930{
2931        int err;
2932
2933        err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE,
2934                JS_JOIN_COMPLETE_STATE);
2935
2936        return (err);
2937}
2938
2939static int smctr_link_tx_fcbs_to_bdbs(struct net_device *dev)
2940{
2941        struct net_local *tp = netdev_priv(dev);
2942        unsigned int i, j;
2943        FCBlock *fcb;
2944        BDBlock *bdb;
2945
2946        for(i = 0; i < NUM_TX_QS_USED; i++)
2947        {
2948                fcb = tp->tx_fcb_head[i];
2949                bdb = tp->tx_bdb_head[i];
2950
2951                for(j = 0; j < tp->num_tx_fcbs[i]; j++)
2952                {
2953                        fcb->bdb_ptr            = bdb;
2954                        fcb->trc_bdb_ptr        = TRC_POINTER(bdb);
2955                        fcb = (FCBlock *)((char *)fcb + sizeof(FCBlock));
2956                        bdb = (BDBlock *)((char *)bdb + sizeof(BDBlock));
2957                }
2958        }
2959
2960        return (0);
2961}
2962
2963static int smctr_load_firmware(struct net_device *dev)
2964{
2965        struct net_local *tp = netdev_priv(dev);
2966        __u16 i, checksum = 0;
2967        int err = 0;
2968
2969        if(smctr_debug > 10)
2970                printk(KERN_DEBUG "%s: smctr_load_firmware\n", dev->name);
2971
2972        tp->ptr_ucode           = smctr_code;
2973        tp->num_of_tx_buffs     = 4;
2974        tp->mode_bits          |= UMAC;
2975        tp->receive_mask        = 0;
2976        tp->max_packet_size     = 4177;
2977
2978        /* Can only upload the firmware once per adapter reset. */
2979        if(tp->microcode_version != 0)
2980                return (UCODE_PRESENT);
2981
2982        /* Verify the firmware exists and is there in the right amount. */
2983        if((tp->ptr_ucode == 0L)
2984                || (*(tp->ptr_ucode + UCODE_VERSION_OFFSET) < UCODE_VERSION))
2985        {
2986                return (UCODE_NOT_PRESENT);
2987        }
2988
2989        /* UCODE_SIZE is not included in Checksum. */
2990        for(i = 0; i < *((__u16 *)(tp->ptr_ucode + UCODE_SIZE_OFFSET)); i += 2)
2991                checksum += *((__u16 *)(tp->ptr_ucode + 2 + i));
2992        if(checksum)
2993                return (UCODE_NOT_PRESENT);
2994
2995        /* At this point we have a valid firmware image, lets kick it on up. */
2996        smctr_enable_adapter_ram(dev);
2997        smctr_enable_16bit(dev);
2998        smctr_set_page(dev, (__u8 *)tp->ram_access);
2999
3000        if((smctr_checksum_firmware(dev))
3001                || (*(tp->ptr_ucode + UCODE_VERSION_OFFSET)
3002                > tp->microcode_version))
3003        {
3004                smctr_enable_adapter_ctrl_store(dev);
3005
3006                /* Zero out ram space for firmware. */
3007                for(i = 0; i < CS_RAM_SIZE; i += 2)
3008                        *((__u16 *)(tp->ram_access + i)) = 0;
3009
3010                smctr_decode_firmware(dev);
3011
3012                tp->microcode_version = *(tp->ptr_ucode + UCODE_VERSION_OFFSET);                *((__u16 *)(tp->ram_access + CS_RAM_VERSION_OFFSET))
3013                        = (tp->microcode_version << 8);
3014                *((__u16 *)(tp->ram_access + CS_RAM_CHECKSUM_OFFSET))
3015                        = ~(tp->microcode_version << 8) + 1;
3016
3017                smctr_disable_adapter_ctrl_store(dev);
3018
3019                if(smctr_checksum_firmware(dev))
3020                        err = HARDWARE_FAILED;
3021        }
3022        else
3023                err = UCODE_PRESENT;
3024
3025        smctr_disable_16bit(dev);
3026
3027        return (err);
3028}
3029
3030static int smctr_load_node_addr(struct net_device *dev)
3031{
3032        int ioaddr = dev->base_addr;
3033        unsigned int i;
3034        __u8 r;
3035
3036        for(i = 0; i < 6; i++)
3037        {
3038                r = inb(ioaddr + LAR0 + i);
3039                dev->dev_addr[i] = (char)r;
3040        }
3041        dev->addr_len = 6;
3042
3043        return (0);
3044}
3045
3046/* Lobe Media Test.
3047 * During the transmission of the initial 1500 lobe media MAC frames,
3048 * the phase lock loop in the 805 chip may lock, and then un-lock, causing
3049 * the 825 to go into a PURGE state. When performing a PURGE, the MCT
3050 * microcode will not transmit any frames given to it by the host, and
3051 * will consequently cause a timeout.
3052 *
3053 * NOTE 1: If the monitor_state is MS_BEACON_TEST_STATE, all transmit
3054 * queues other then the one used for the lobe_media_test should be
3055 * disabled.!?
3056 *
3057 * NOTE 2: If the monitor_state is MS_BEACON_TEST_STATE and the receive_mask
3058 * has any multi-cast or promiscous bits set, the receive_mask needs to
3059 * be changed to clear the multi-cast or promiscous mode bits, the lobe_test
3060 * run, and then the receive mask set back to its original value if the test
3061 * is successful.
3062 */
3063static int smctr_lobe_media_test(struct net_device *dev)
3064{
3065        struct net_local *tp = netdev_priv(dev);
3066        unsigned int i, perror = 0;
3067        unsigned short saved_rcv_mask;
3068
3069        if(smctr_debug > 10)
3070                printk(KERN_DEBUG "%s: smctr_lobe_media_test\n", dev->name);
3071
3072        /* Clear receive mask for lobe test. */
3073        saved_rcv_mask          = tp->receive_mask;
3074        tp->receive_mask        = 0;
3075
3076        smctr_chg_rx_mask(dev);
3077
3078        /* Setup the lobe media test. */
3079        smctr_lobe_media_test_cmd(dev);
3080        if(smctr_wait_cmd(dev))
3081        {
3082                smctr_reset_adapter(dev);
3083                tp->status = CLOSED;
3084                return (LOBE_MEDIA_TEST_FAILED);
3085        }
3086
3087        /* Tx lobe media test frames. */
3088        for(i = 0; i < 1500; ++i)
3089        {
3090                if(smctr_send_lobe_media_test(dev))
3091                {
3092                        if(perror)
3093                        {
3094                                smctr_reset_adapter(dev);
3095                                tp->state = CLOSED;
3096                                return (LOBE_MEDIA_TEST_FAILED);
3097                        }
3098                        else
3099                        {
3100                                perror = 1;
3101                                if(smctr_lobe_media_test_cmd(dev))
3102                                {
3103                                        smctr_reset_adapter(dev);
3104                                        tp->state = CLOSED;
3105                                        return (LOBE_MEDIA_TEST_FAILED);
3106                                }
3107                        }
3108                }
3109        }
3110
3111        if(smctr_send_dat(dev))
3112        {
3113                if(smctr_send_dat(dev))
3114                {
3115                        smctr_reset_adapter(dev);
3116                        tp->state = CLOSED;
3117                        return (LOBE_MEDIA_TEST_FAILED);
3118                }
3119        }
3120
3121        /* Check if any frames received during test. */
3122        if((tp->rx_fcb_curr[MAC_QUEUE]->frame_status)
3123                || (tp->rx_fcb_curr[NON_MAC_QUEUE]->frame_status))
3124        {
3125                smctr_reset_adapter(dev);
3126                tp->state = CLOSED;
3127                return (LOBE_MEDIA_TEST_FAILED);
3128        }
3129
3130        /* Set receive mask to "Promisc" mode. */
3131        tp->receive_mask = saved_rcv_mask;
3132
3133        smctr_chg_rx_mask(dev);
3134
3135        return (0);
3136}
3137
3138static int smctr_lobe_media_test_cmd(struct net_device *dev)
3139{
3140        struct net_local *tp = netdev_priv(dev);
3141        int err;
3142
3143        if(smctr_debug > 10)
3144                printk(KERN_DEBUG "%s: smctr_lobe_media_test_cmd\n", dev->name);
3145
3146        /* Change to lobe media test state. */
3147        if(tp->monitor_state != MS_BEACON_TEST_STATE)
3148        {
3149                smctr_lobe_media_test_state(dev);
3150                if(smctr_wait_cmd(dev))
3151                {
3152                        printk(KERN_ERR "Lobe Failed test state\n");
3153                        return (LOBE_MEDIA_TEST_FAILED);
3154                }
3155        }
3156
3157        err = smctr_setup_single_cmd(dev, ACB_CMD_MCT_TEST,
3158                TRC_LOBE_MEDIA_TEST);
3159
3160        return (err);
3161}
3162
3163static int smctr_lobe_media_test_state(struct net_device *dev)
3164{
3165        int err;
3166
3167        err = smctr_setup_single_cmd(dev, ACB_CMD_CHANGE_JOIN_STATE,
3168                JS_LOBE_TEST_STATE);
3169
3170        return (err);
3171}
3172
3173static int smctr_make_8025_hdr(struct net_device *dev,
3174        MAC_HEADER *rmf, MAC_HEADER *tmf, __u16 ac_fc)
3175{
3176        tmf->ac = MSB(ac_fc);                 /* msb is access control */
3177        tmf->fc = LSB(ac_fc);                 /* lsb is frame control */
3178
3179        tmf->sa[0] = dev->dev_addr[0];
3180        tmf->sa[1] = dev->dev_addr[1];
3181        tmf->sa[2] = dev->dev_addr[2];
3182        tmf->sa[3] = dev->dev_addr[3];
3183        tmf->sa[4] = dev->dev_addr[4];
3184        tmf->sa[5] = dev->dev_addr[5];
3185
3186        switch(tmf->vc)
3187        {
3188		/* Send RQ_INIT to RPS */
3189                case RQ_INIT:
3190                        tmf->da[0] = 0xc0;
3191                        tmf->da[1] = 0x00;
3192                        tmf->da[2] = 0x00;
3193                        tmf->da[3] = 0x00;
3194                        tmf->da[4] = 0x00;
3195                        tmf->da[5] = 0x02;
3196                        break;
3197
3198		/* Send RPT_TX_FORWARD to CRS */
3199                case RPT_TX_FORWARD:
3200                        tmf->da[0] = 0xc0;
3201                        tmf->da[1] = 0x00;
3202                        tmf->da[2] = 0x00;
3203                        tmf->da[3] = 0x00;
3204                        tmf->da[4] = 0x00;
3205                        tmf->da[5] = 0x10;
3206                        break;
3207
3208		/* Everything else goes to sender */
3209                default:
3210                        tmf->da[0] = rmf->sa[0];
3211                        tmf->da[1] = rmf->sa[1];
3212                        tmf->da[2] = rmf->sa[2];
3213                        tmf->da[3] = rmf->sa[3];
3214                        tmf->da[4] = rmf->sa[4];
3215                        tmf->da[5] = rmf->sa[5];
3216                        break;
3217        }
3218
3219        return (0);
3220}
3221
3222static int smctr_make_access_pri(struct net_device *dev, MAC_SUB_VECTOR *tsv)
3223{
3224        struct net_local *tp = netdev_priv(dev);
3225
3226        tsv->svi = AUTHORIZED_ACCESS_PRIORITY;
3227        tsv->svl = S_AUTHORIZED_ACCESS_PRIORITY;
3228
3229        tsv->svv[0] = MSB(tp->authorized_access_priority);
3230        tsv->svv[1] = LSB(tp->authorized_access_priority);
3231
3232	return (0);
3233}
3234
3235static int smctr_make_addr_mod(struct net_device *dev, MAC_SUB_VECTOR *tsv)
3236{
3237        tsv->svi = ADDRESS_MODIFER;
3238        tsv->svl = S_ADDRESS_MODIFER;
3239
3240        tsv->svv[0] = 0;
3241        tsv->svv[1] = 0;
3242
3243        return (0);
3244}
3245
3246static int smctr_make_auth_funct_class(struct net_device *dev,
3247        MAC_SUB_VECTOR *tsv)
3248{
3249        struct net_local *tp = netdev_priv(dev);
3250
3251        tsv->svi = AUTHORIZED_FUNCTION_CLASS;
3252        tsv->svl = S_AUTHORIZED_FUNCTION_CLASS;
3253
3254        tsv->svv[0] = MSB(tp->authorized_function_classes);
3255        tsv->svv[1] = LSB(tp->authorized_function_classes);
3256
3257        return (0);
3258}
3259
3260static int smctr_make_corr(struct net_device *dev,
3261        MAC_SUB_VECTOR *tsv, __u16 correlator)
3262{
3263        tsv->svi = CORRELATOR;
3264        tsv->svl = S_CORRELATOR;
3265
3266        tsv->svv[0] = MSB(correlator);
3267        tsv->svv[1] = LSB(correlator);
3268
3269        return (0);
3270}
3271
3272static int smctr_make_funct_addr(struct net_device *dev, MAC_SUB_VECTOR *tsv)
3273{
3274        struct net_local *tp = netdev_priv(dev);
3275
3276        smctr_get_functional_address(dev);
3277
3278        tsv->svi = FUNCTIONAL_ADDRESS;
3279        tsv->svl = S_FUNCTIONAL_ADDRESS;
3280
3281        tsv->svv[0] = MSB(tp->misc_command_data[0]);
3282        tsv->svv[1] = LSB(tp->misc_command_data[0]);
3283
3284        tsv->svv[2] = MSB(tp->misc_command_data[1]);
3285        tsv->svv[3] = LSB(tp->misc_command_data[1]);
3286
3287        return (0);
3288}
3289
3290static int smctr_make_group_addr(struct net_device *dev, MAC_SUB_VECTOR *tsv)
3291{
3292        struct net_local *tp = netdev_priv(dev);
3293
3294        smctr_get_group_address(dev);
3295
3296        tsv->svi = GROUP_ADDRESS;
3297        tsv->svl = S_GROUP_ADDRESS;
3298
3299        tsv->svv[0] = MSB(tp->misc_command_data[0]);
3300        tsv->svv[1] = LSB(tp->misc_command_data[0]);
3301
3302        tsv->svv[2] = MSB(tp->misc_command_data[1]);
3303        tsv->svv[3] = LSB(tp->misc_command_data[1]);
3304
3305        /* Set Group Address Sub-vector to all zeros if only the
3306         * Group Address/Functional Address Indicator is set.
3307         */
3308        if(tsv->svv[0] == 0x80 && tsv->svv[1] == 0x00
3309        	&& tsv->svv[2] == 0x00 && tsv->svv[3] == 0x00)
3310                tsv->svv[0] = 0x00;
3311
3312        return (0);
3313}
3314
3315static int smctr_make_phy_drop_num(struct net_device *dev,
3316        MAC_SUB_VECTOR *tsv)
3317{
3318        struct net_local *tp = netdev_priv(dev);
3319
3320        smctr_get_physical_drop_number(dev);
3321
3322        tsv->svi = PHYSICAL_DROP;
3323        tsv->svl = S_PHYSICAL_DROP;
3324
3325        tsv->svv[0] = MSB(tp->misc_command_data[0]);
3326        tsv->svv[1] = LSB(tp->misc_command_data[0]);
3327
3328        tsv->svv[2] = MSB(tp->misc_command_data[1]);
3329        tsv->svv[3] = LSB(tp->misc_command_data[1]);
3330
3331        return (0);
3332}
3333
3334static int smctr_make_product_id(struct net_device *dev, MAC_SUB_VECTOR *tsv)
3335{
3336        int i;
3337
3338        tsv->svi = PRODUCT_INSTANCE_ID;
3339        tsv->svl = S_PRODUCT_INSTANCE_ID;
3340
3341        for(i = 0; i < 18; i++)
3342                tsv->svv[i] = 0xF0;
3343
3344        return (0);
3345}
3346
3347static int smctr_make_station_id(struct net_device *dev, MAC_SUB_VECTOR *tsv)
3348{
3349        struct net_local *tp = netdev_priv(dev);
3350
3351        smctr_get_station_id(dev);
3352
3353        tsv->svi = STATION_IDENTIFER;
3354        tsv->svl = S_STATION_IDENTIFER;
3355
3356        tsv->svv[0] = MSB(tp->misc_command_data[0]);
3357        tsv->svv[1] = LSB(tp->misc_command_data[0]);
3358
3359        tsv->svv[2] = MSB(tp->misc_command_data[1]);
3360        tsv->svv[3] = LSB(tp->misc_command_data[1]);
3361
3362        tsv->svv[4] = MSB(tp->misc_command_data[2]);
3363        tsv->svv[5] = LSB(tp->misc_command_data[2]);
3364
3365        return (0);
3366}
3367
3368static int smctr_make_ring_station_status(struct net_device *dev,
3369        MAC_SUB_VECTOR * tsv)
3370{
3371        tsv->svi = RING_STATION_STATUS;
3372        tsv->svl = S_RING_STATION_STATUS;
3373
3374        tsv->svv[0] = 0;
3375        tsv->svv[1] = 0;
3376        tsv->svv[2] = 0;
3377        tsv->svv[3] = 0;
3378        tsv->svv[4] = 0;
3379        tsv->svv[5] = 0;
3380
3381        return (0);
3382}
3383
3384static int smctr_make_ring_station_version(struct net_device *dev,
3385        MAC_SUB_VECTOR *tsv)
3386{
3387        struct net_local *tp = netdev_priv(dev);
3388
3389        tsv->svi = RING_STATION_VERSION_NUMBER;
3390        tsv->svl = S_RING_STATION_VERSION_NUMBER;
3391
3392        tsv->svv[0] = 0xe2;            /* EBCDIC - S */
3393        tsv->svv[1] = 0xd4;            /* EBCDIC - M */
3394        tsv->svv[2] = 0xc3;            /* EBCDIC - C */
3395        tsv->svv[3] = 0x40;            /* EBCDIC -   */
3396        tsv->svv[4] = 0xe5;            /* EBCDIC - V */
3397        tsv->svv[5] = 0xF0 + (tp->microcode_version >> 4);
3398        tsv->svv[6] = 0xF0 + (tp->microcode_version & 0x0f);
3399        tsv->svv[7] = 0x40;            /* EBCDIC -   */
3400        tsv->svv[8] = 0xe7;            /* EBCDIC - X */
3401
3402        if(tp->extra_info & CHIP_REV_MASK)
3403                tsv->svv[9] = 0xc5;    /* EBCDIC - E */
3404        else
3405                tsv->svv[9] = 0xc4;    /* EBCDIC - D */
3406
3407        return (0);
3408}
3409
3410static int smctr_make_tx_status_code(struct net_device *dev,
3411        MAC_SUB_VECTOR *tsv, __u16 tx_fstatus)
3412{
3413        tsv->svi = TRANSMIT_STATUS_CODE;
3414        tsv->svl = S_TRANSMIT_STATUS_CODE;
3415
3416        tsv->svv[0] = ((tx_fstatus & 0x0100 >> 6) || IBM_PASS_SOURCE_ADDR);
3417
3418        /* Stripped frame status of Transmitted Frame */
3419        tsv->svv[1] = tx_fstatus & 0xff;
3420
3421        return (0);
3422}
3423
3424static int smctr_make_upstream_neighbor_addr(struct net_device *dev,
3425        MAC_SUB_VECTOR *tsv)
3426{
3427        struct net_local *tp = netdev_priv(dev);
3428
3429        smctr_get_upstream_neighbor_addr(dev);
3430
3431        tsv->svi = UPSTREAM_NEIGHBOR_ADDRESS;
3432        tsv->svl = S_UPSTREAM_NEIGHBOR_ADDRESS;
3433
3434        tsv->svv[0] = MSB(tp->misc_command_data[0]);
3435        tsv->svv[1] = LSB(tp->misc_command_data[0]);
3436
3437        tsv->svv[2] = MSB(tp->misc_command_data[1]);
3438        tsv->svv[3] = LSB(tp->misc_command_data[1]);
3439
3440        tsv->svv[4] = MSB(tp->misc_command_data[2]);
3441        tsv->svv[5] = LSB(tp->misc_command_data[2]);
3442
3443        return (0);
3444}
3445
3446static int smctr_make_wrap_data(struct net_device *dev, MAC_SUB_VECTOR *tsv)
3447{
3448        tsv->svi = WRAP_DATA;
3449        tsv->svl = S_WRAP_DATA;
3450
3451        return (0);
3452}
3453
3454/*
3455 * Open/initialize the board. This is called sometime after
3456 * booting when the 'ifconfig' program is run.
3457 *
3458 * This routine should set everything up anew at each open, even
3459 * registers that "should" only need to be set once at boot, so that
3460 * there is non-reboot way to recover if something goes wrong.
3461 */
3462static int smctr_open(struct net_device *dev)
3463{
3464        int err;
3465
3466        if(smctr_debug > 10)
3467                printk(KERN_DEBUG "%s: smctr_open\n", dev->name);
3468
3469        err = smctr_init_adapter(dev);
3470        if(err < 0)
3471                return (err);
3472
3473        return (err);
3474}
3475
3476/* Interrupt driven open of Token card. */
3477static int smctr_open_tr(struct net_device *dev)
3478{
3479        struct net_local *tp = netdev_priv(dev);
3480        unsigned long flags;
3481        int err;
3482
3483        if(smctr_debug > 10)
3484                printk(KERN_DEBUG "%s: smctr_open_tr\n", dev->name);
3485
3486        /* Now we can actually open the adapter. */
3487        if(tp->status == OPEN)
3488                return (0);
3489        if(tp->status != INITIALIZED)
3490                return (-1);
3491
3492	spin_lock_irqsave(&tp->lock, flags);
3493
3494        smctr_set_page(dev, (__u8 *)tp->ram_access);
3495
3496        if((err = smctr_issue_resume_rx_fcb_cmd(dev, (short)MAC_QUEUE)))
3497                goto out;
3498
3499        if((err = smctr_issue_resume_rx_bdb_cmd(dev, (short)MAC_QUEUE)))
3500                goto out;
3501
3502        if((err = smctr_issue_resume_rx_fcb_cmd(dev, (short)NON_MAC_QUEUE)))
3503                goto out;
3504
3505        if((err = smctr_issue_resume_rx_bdb_cmd(dev, (short)NON_MAC_QUEUE)))
3506                goto out;
3507
3508        tp->status = CLOSED;
3509
3510        /* Insert into the Ring or Enter Loopback Mode. */
3511        if((tp->mode_bits & LOOPING_MODE_MASK) == LOOPBACK_MODE_1)
3512        {
3513                tp->status = CLOSED;
3514
3515                if(!(err = smctr_issue_trc_loopback_cmd(dev)))
3516                {
3517                        if(!(err = smctr_wait_cmd(dev)))
3518                                tp->status = OPEN;
3519                }
3520
3521                smctr_status_chg(dev);
3522        }
3523        else
3524        {
3525                if((tp->mode_bits & LOOPING_MODE_MASK) == LOOPBACK_MODE_2)
3526                {
3527                        tp->status = CLOSED;
3528                        if(!(err = smctr_issue_tri_loopback_cmd(dev)))
3529                        {
3530                                if(!(err = smctr_wait_cmd(dev)))
3531                                        tp->status = OPEN;
3532                        }
3533
3534                        smctr_status_chg(dev);
3535                }
3536                else
3537                {
3538                        if((tp->mode_bits & LOOPING_MODE_MASK)
3539                                == LOOPBACK_MODE_3)
3540                        {
3541                                tp->status = CLOSED;
3542                                if(!(err = smctr_lobe_media_test_cmd(dev)))
3543                                {
3544                                        if(!(err = smctr_wait_cmd(dev)))
3545                                                tp->status = OPEN;
3546                                }
3547                                smctr_status_chg(dev);
3548                        }
3549                        else
3550                        {
3551                                if(!(err = smctr_lobe_media_test(dev)))
3552                                        err = smctr_issue_insert_cmd(dev);
3553				else
3554                                {
3555                                        if(err == LOBE_MEDIA_TEST_FAILED)
3556                                                printk(KERN_WARNING "%s: Lobe Media Test Failure - Check cable?\n", dev->name);
3557                                }
3558                        }
3559                }
3560        }
3561
3562out:
3563        spin_unlock_irqrestore(&tp->lock, flags);
3564
3565        return (err);
3566}
3567
3568/* Check for a network adapter of this type,
3569 * and return device structure if one exists.
3570 */
3571struct net_device __init *smctr_probe(int unit)
3572{
3573	struct net_device *dev = alloc_trdev(sizeof(struct net_local));
3574	static const unsigned ports[] = {
3575		0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, 0x300,
3576		0x320, 0x340, 0x360, 0x380, 0
3577	};
3578	const unsigned *port;
3579        int err = 0;
3580
3581	if (!dev)
3582		return ERR_PTR(-ENOMEM);
3583
3584	SET_MODULE_OWNER(dev);
3585
3586	if (unit >= 0) {
3587		sprintf(dev->name, "tr%d", unit);
3588		netdev_boot_setup_check(dev);
3589	}
3590
3591        if (dev->base_addr > 0x1ff)    /* Check a single specified location. */
3592		err = smctr_probe1(dev, dev->base_addr);
3593        else if(dev->base_addr != 0)  /* Don't probe at all. */
3594                err =-ENXIO;
3595	else {
3596		for (port = ports; *port; port++) {
3597			err = smctr_probe1(dev, *port);
3598			if (!err)
3599				break;
3600		}
3601	}
3602	if (err)
3603		goto out;
3604	err = register_netdev(dev);
3605	if (err)
3606		goto out1;
3607	return dev;
3608out1:
3609#ifdef CONFIG_MCA_LEGACY
3610	{ struct net_local *tp = netdev_priv(dev);
3611	  if (tp->slot_num)
3612		mca_mark_as_unused(tp->slot_num);
3613	}
3614#endif
3615	release_region(dev->base_addr, SMCTR_IO_EXTENT);
3616	free_irq(dev->irq, dev);
3617out:
3618	free_netdev(dev);
3619	return ERR_PTR(err);
3620}
3621
3622
3623static int __init smctr_probe1(struct net_device *dev, int ioaddr)
3624{
3625        static unsigned version_printed;
3626        struct net_local *tp = netdev_priv(dev);
3627        int err;
3628        __u32 *ram;
3629
3630        if(smctr_debug && version_printed++ == 0)
3631                printk(version);
3632
3633        spin_lock_init(&tp->lock);
3634        dev->base_addr = ioaddr;
3635
3636	/* Actually detect an adapter now. */
3637        err = smctr_chk_isa(dev);
3638        if(err < 0)
3639        {
3640		if ((err = smctr_chk_mca(dev)) < 0) {
3641			err = -ENODEV;
3642			goto out;
3643		}
3644        }
3645
3646        tp = netdev_priv(dev);
3647        dev->mem_start = tp->ram_base;
3648        dev->mem_end = dev->mem_start + 0x10000;
3649        ram = (__u32 *)phys_to_virt(dev->mem_start);
3650        tp->ram_access = *(__u32 *)&ram;
3651	tp->status = NOT_INITIALIZED;
3652
3653        err = smctr_load_firmware(dev);
3654        if(err != UCODE_PRESENT && err != SUCCESS)
3655        {
3656                printk(KERN_ERR "%s: Firmware load failed (%d)\n", dev->name, err);
3657		err = -EIO;
3658		goto out;
3659        }
3660
3661	/* Allow user to specify ring speed on module insert. */
3662	if(ringspeed == 4)
3663		tp->media_type = MEDIA_UTP_4;
3664	else
3665		tp->media_type = MEDIA_UTP_16;
3666
3667        printk(KERN_INFO "%s: %s %s at Io %#4x, Irq %d, Rom %#4x, Ram %#4x.\n",
3668                dev->name, smctr_name, smctr_model,
3669                (unsigned int)dev->base_addr,
3670                dev->irq, tp->rom_base, tp->ram_base);
3671
3672        dev->open               = smctr_open;
3673        dev->stop               = smctr_close;
3674        dev->hard_start_xmit    = smctr_send_packet;
3675        dev->tx_timeout		= smctr_timeout;
3676        dev->watchdog_timeo	= HZ;
3677        dev->get_stats          = smctr_get_stats;
3678        dev->set_multicast_list = &smctr_set_multicast_list;
3679        return (0);
3680
3681out:
3682	return err;
3683}
3684
3685static int smctr_process_rx_packet(MAC_HEADER *rmf, __u16 size,
3686        struct net_device *dev, __u16 rx_status)
3687{
3688        struct net_local *tp = netdev_priv(dev);
3689        struct sk_buff *skb;
3690        __u16 rcode, correlator;
3691        int err = 0;
3692        __u8 xframe = 1;
3693        __u16 tx_fstatus;
3694
3695        rmf->vl = SWAP_BYTES(rmf->vl);
3696        if(rx_status & FCB_RX_STATUS_DA_MATCHED)
3697        {
3698                switch(rmf->vc)
3699                {
3700                        /* Received MAC Frames Processed by RS. */
3701                        case INIT:
3702                                if((rcode = smctr_rcv_init(dev, rmf, &correlator)) == HARDWARE_FAILED)
3703                                {
3704                                        return (rcode);
3705                                }
3706
3707                                if((err = smctr_send_rsp(dev, rmf, rcode,
3708                                        correlator)))
3709                                {
3710                                        return (err);
3711                                }
3712                                break;
3713
3714                        case CHG_PARM:
3715                                if((rcode = smctr_rcv_chg_param(dev, rmf,
3716                                        &correlator)) ==HARDWARE_FAILED)
3717                                {
3718                                        return (rcode);
3719                                }
3720
3721                                if((err = smctr_send_rsp(dev, rmf, rcode,
3722                                        correlator)))
3723                                {
3724                                        return (err);
3725                                }
3726                                break;
3727
3728                        case RQ_ADDR:
3729                                if((rcode = smctr_rcv_rq_addr_state_attch(dev,
3730                                        rmf, &correlator)) != POSITIVE_ACK)
3731                                {
3732                                        if(rcode == HARDWARE_FAILED)
3733                                                return (rcode);
3734                                        else
3735                                                return (smctr_send_rsp(dev, rmf,
3736                                                        rcode, correlator));
3737                                }
3738
3739                                if((err = smctr_send_rpt_addr(dev, rmf,
3740                                        correlator)))
3741                                {
3742                                        return (err);
3743                                }
3744                                break;
3745
3746                        case RQ_ATTCH:
3747                                if((rcode = smctr_rcv_rq_addr_state_attch(dev,
3748                                        rmf, &correlator)) != POSITIVE_ACK)
3749                                {
3750                                        if(rcode == HARDWARE_FAILED)
3751                                                return (rcode);
3752                                        else
3753                                                return (smctr_send_rsp(dev, rmf,
3754                                                        rcode,
3755                                                        correlator));
3756                                }
3757
3758                                if((err = smctr_send_rpt_attch(dev, rmf,
3759                                        correlator)))
3760                                {
3761                                        return (err);
3762                                }
3763                                break;
3764
3765                        case RQ_STATE:
3766                                if((rcode = smctr_rcv_rq_addr_state_attch(dev,
3767                                        rmf, &correlator)) != POSITIVE_ACK)
3768                                {
3769                                        if(rcode == HARDWARE_FAILED)
3770                                                return (rcode);
3771                                        else
3772                                                return (smctr_send_rsp(dev, rmf,
3773                                                        rcode,
3774                                                        correlator));
3775                                }
3776
3777                                if((err = smctr_send_rpt_state(dev, rmf,
3778                                        correlator)))
3779                                {
3780                                        return (err);
3781                                }
3782                                break;
3783
3784                        case TX_FORWARD:
3785                                if((rcode = smctr_rcv_tx_forward(dev, rmf))
3786                                        != POSITIVE_ACK)
3787                                {
3788                                        if(rcode == HARDWARE_FAILED)
3789                                                return (rcode);
3790                                        else
3791                                                return (smctr_send_rsp(dev, rmf,
3792                                                        rcode,
3793                                                        correlator));
3794                                }
3795
3796                                if((err = smctr_send_tx_forward(dev, rmf,
3797                                        &tx_fstatus)) == HARDWARE_FAILED)
3798                                {
3799                                        return (err);
3800                                }
3801
3802                                if(err == A_FRAME_WAS_FORWARDED)
3803                                {
3804                                        if((err = smctr_send_rpt_tx_forward(dev,
3805						rmf, tx_fstatus))
3806                                                == HARDWARE_FAILED)
3807                                        {
3808                                                return (err);
3809                                        }
3810                                }
3811                                break;
3812
3813                        /* Received MAC Frames Processed by CRS/REM/RPS. */
3814                        case RSP:
3815                        case RQ_INIT:
3816                        case RPT_NEW_MON:
3817                        case RPT_SUA_CHG:
3818                        case RPT_ACTIVE_ERR:
3819                        case RPT_NN_INCMP:
3820                        case RPT_ERROR:
3821                        case RPT_ATTCH:
3822                        case RPT_STATE:
3823                        case RPT_ADDR:
3824                                break;
3825
3826                        /* Rcvd Att. MAC Frame (if RXATMAC set) or UNKNOWN */
3827                        default:
3828                                xframe = 0;
3829                                if(!(tp->receive_mask & ACCEPT_ATT_MAC_FRAMES))
3830                                {
3831                                        rcode = smctr_rcv_unknown(dev, rmf,
3832                                                &correlator);
3833                                        if((err = smctr_send_rsp(dev, rmf,rcode,
3834                                                correlator)))
3835                                        {
3836                                                return (err);
3837                                        }
3838                                }
3839
3840                                break;
3841                }
3842        }
3843        else
3844        {
3845                /* 1. DA doesn't match (Promiscuous Mode).
3846                 * 2. Parse for Extended MAC Frame Type.
3847                 */
3848                switch(rmf->vc)
3849                {
3850                        case RSP:
3851                        case INIT:
3852                        case RQ_INIT:
3853                        case RQ_ADDR:
3854                        case RQ_ATTCH:
3855                        case RQ_STATE:
3856                        case CHG_PARM:
3857                        case RPT_ADDR:
3858                        case RPT_ERROR:
3859                        case RPT_ATTCH:
3860                        case RPT_STATE:
3861                        case RPT_NEW_MON:
3862                        case RPT_SUA_CHG:
3863                        case RPT_NN_INCMP:
3864                        case RPT_ACTIVE_ERR:
3865                                break;
3866
3867                        default:
3868                                xframe = 0;
3869                                break;
3870                }
3871        }
3872
3873        /* NOTE: UNKNOWN MAC frames will NOT be passed up unless
3874         * ACCEPT_ATT_MAC_FRAMES is set.
3875         */
3876        if(((tp->receive_mask & ACCEPT_ATT_MAC_FRAMES)
3877                && (xframe == (__u8)0))
3878                || ((tp->receive_mask & ACCEPT_EXT_MAC_FRAMES)
3879                && (xframe == (__u8)1)))
3880        {
3881                rmf->vl = SWAP_BYTES(rmf->vl);
3882
3883                if (!(skb = dev_alloc_skb(size)))
3884			return -ENOMEM;
3885                skb->len = size;
3886
3887                /* Slide data into a sleek skb. */
3888                skb_put(skb, skb->len);
3889                skb_copy_to_linear_data(skb, rmf, skb->len);
3890
3891                /* Update Counters */
3892                tp->MacStat.rx_packets++;
3893                tp->MacStat.rx_bytes += skb->len;
3894
3895                /* Kick the packet on up. */
3896                skb->protocol = tr_type_trans(skb, dev);
3897                netif_rx(skb);
3898		dev->last_rx = jiffies;
3899                err = 0;
3900        }
3901
3902        return (err);
3903}
3904
3905/* Adapter RAM test. Incremental word ODD boundary data test. */
3906static int smctr_ram_memory_test(struct net_device *dev)
3907{
3908        struct net_local *tp = netdev_priv(dev);
3909        __u16 page, pages_of_ram, start_pattern = 0, word_pattern = 0,
3910                word_read = 0, err_word = 0, err_pattern = 0;
3911        unsigned int err_offset;
3912        __u32 j, pword;
3913        __u8 err = 0;
3914
3915        if(smctr_debug > 10)
3916                printk(KERN_DEBUG "%s: smctr_ram_memory_test\n", dev->name);
3917
3918        start_pattern   = 0x0001;
3919        pages_of_ram    = tp->ram_size / tp->ram_usable;
3920        pword           = tp->ram_access;
3921
3922        /* Incremental word ODD boundary test. */
3923        for(page = 0; (page < pages_of_ram) && (~err);
3924                page++, start_pattern += 0x8000)
3925        {
3926                smctr_set_page(dev, (__u8 *)(tp->ram_access
3927                        + (page * tp->ram_usable * 1024) + 1));
3928                word_pattern = start_pattern;
3929
3930                for(j = 1; j < (__u32)(tp->ram_usable * 1024) - 1; j += 2)
3931                        *(__u16 *)(pword + j) = word_pattern++;
3932
3933                word_pattern = start_pattern;
3934
3935                for(j = 1; j < (__u32)(tp->ram_usable * 1024) - 1
3936                        && (~err); j += 2, word_pattern++)
3937                {
3938                        word_read = *(__u16 *)(pword + j);
3939                        if(word_read != word_pattern)
3940                        {
3941                                err             = (__u8)1;
3942                                err_offset      = j;
3943                                err_word        = word_read;
3944                                err_pattern     = word_pattern;
3945                                return (RAM_TEST_FAILED);
3946                        }
3947                }
3948        }
3949
3950        /* Zero out memory. */
3951        for(page = 0; page < pages_of_ram && (~err); page++)
3952        {
3953                smctr_set_page(dev, (__u8 *)(tp->ram_access
3954                        + (page * tp->ram_usable * 1024)));
3955                word_pattern = 0;
3956
3957                for(j = 0; j < (__u32)tp->ram_usable * 1024; j +=2)
3958                        *(__u16 *)(pword + j) = word_pattern;
3959
3960                for(j =0; j < (__u32)tp->ram_usable * 1024
3961                        && (~err); j += 2)
3962                {
3963                        word_read = *(__u16 *)(pword + j);
3964                        if(word_read != word_pattern)
3965                        {
3966                                err             = (__u8)1;
3967                                err_offset      = j;
3968                                err_word        = word_read;
3969                                err_pattern     = word_pattern;
3970                                return (RAM_TEST_FAILED);
3971                        }
3972                }
3973        }
3974
3975        smctr_set_page(dev, (__u8 *)tp->ram_access);
3976
3977        return (0);
3978}
3979
3980static int smctr_rcv_chg_param(struct net_device *dev, MAC_HEADER *rmf,
3981        __u16 *correlator)
3982{
3983        MAC_SUB_VECTOR *rsv;
3984        signed short vlen;
3985        __u16 rcode = POSITIVE_ACK;
3986        unsigned int svectors = F_NO_SUB_VECTORS_FOUND;
3987
3988        /* This Frame can only come from a CRS */
3989        if((rmf->dc_sc & SC_MASK) != SC_CRS)
3990                return(E_INAPPROPRIATE_SOURCE_CLASS);
3991
3992        /* Remove MVID Length from total length. */
3993        vlen = (signed short)rmf->vl - 4;
3994
3995        /* Point to First SVID */
3996        rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER));
3997
3998        /* Search for Appropriate SVID's. */
3999        while((vlen > 0) && (rcode == POSITIVE_ACK))
4000        {
4001                switch(rsv->svi)
4002                {
4003                        case CORRELATOR:
4004                                svectors |= F_CORRELATOR;
4005                                rcode = smctr_set_corr(dev, rsv, correlator);
4006                                break;
4007
4008                        case LOCAL_RING_NUMBER:
4009                                svectors |= F_LOCAL_RING_NUMBER;
4010                                rcode = smctr_set_local_ring_num(dev, rsv);
4011                                break;
4012
4013                        case ASSIGN_PHYSICAL_DROP:
4014                                svectors |= F_ASSIGN_PHYSICAL_DROP;
4015                                rcode = smctr_set_phy_drop(dev, rsv);
4016                                break;
4017
4018                        case ERROR_TIMER_VALUE:
4019                                svectors |= F_ERROR_TIMER_VALUE;
4020                                rcode = smctr_set_error_timer_value(dev, rsv);
4021                                break;
4022
4023                        case AUTHORIZED_FUNCTION_CLASS:
4024                                svectors |= F_AUTHORIZED_FUNCTION_CLASS;
4025                                rcode = smctr_set_auth_funct_class(dev, rsv);
4026                                break;
4027
4028                        case AUTHORIZED_ACCESS_PRIORITY:
4029                                svectors |= F_AUTHORIZED_ACCESS_PRIORITY;
4030                                rcode = smctr_set_auth_access_pri(dev, rsv);
4031                                break;
4032
4033                        default:
4034                                rcode = E_SUB_VECTOR_UNKNOWN;
4035                                break;
4036                }
4037
4038                /* Let Sender Know if SUM of SV length's is
4039                 * larger then length in MVID length field
4040                 */
4041                if((vlen -= rsv->svl) < 0)
4042                        rcode = E_VECTOR_LENGTH_ERROR;
4043
4044                rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl);
4045        }
4046
4047        if(rcode == POSITIVE_ACK)
4048        {
4049                /* Let Sender Know if MVID length field
4050                 * is larger then SUM of SV length's
4051                 */
4052                if(vlen != 0)
4053                        rcode = E_VECTOR_LENGTH_ERROR;
4054                else
4055		{
4056                	/* Let Sender Know if Expected SVID Missing */
4057                	if((svectors & R_CHG_PARM) ^ R_CHG_PARM)
4058                        	rcode = E_MISSING_SUB_VECTOR;
4059		}
4060        }
4061
4062        return (rcode);
4063}
4064
4065static int smctr_rcv_init(struct net_device *dev, MAC_HEADER *rmf,
4066        __u16 *correlator)
4067{
4068        MAC_SUB_VECTOR *rsv;
4069        signed short vlen;
4070        __u16 rcode = POSITIVE_ACK;
4071        unsigned int svectors = F_NO_SUB_VECTORS_FOUND;
4072
4073        /* This Frame can only come from a RPS */
4074        if((rmf->dc_sc & SC_MASK) != SC_RPS)
4075                return (E_INAPPROPRIATE_SOURCE_CLASS);
4076
4077        /* Remove MVID Length from total length. */
4078        vlen = (signed short)rmf->vl - 4;
4079
4080        /* Point to First SVID */
4081        rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER));
4082
4083        /* Search for Appropriate SVID's */
4084        while((vlen > 0) && (rcode == POSITIVE_ACK))
4085        {
4086                switch(rsv->svi)
4087                {
4088                        case CORRELATOR:
4089                                svectors |= F_CORRELATOR;
4090                                rcode = smctr_set_corr(dev, rsv, correlator);
4091                                break;
4092
4093                        case LOCAL_RING_NUMBER:
4094                                svectors |= F_LOCAL_RING_NUMBER;
4095                                rcode = smctr_set_local_ring_num(dev, rsv);
4096                                break;
4097
4098                        case ASSIGN_PHYSICAL_DROP:
4099                                svectors |= F_ASSIGN_PHYSICAL_DROP;
4100                                rcode = smctr_set_phy_drop(dev, rsv);
4101                                break;
4102
4103                        case ERROR_TIMER_VALUE:
4104                                svectors |= F_ERROR_TIMER_VALUE;
4105                                rcode = smctr_set_error_timer_value(dev, rsv);
4106                                break;
4107
4108                        default:
4109                                rcode = E_SUB_VECTOR_UNKNOWN;
4110                                break;
4111                }
4112
4113                /* Let Sender Know if SUM of SV length's is
4114                 * larger then length in MVID length field
4115		 */
4116                if((vlen -= rsv->svl) < 0)
4117                        rcode = E_VECTOR_LENGTH_ERROR;
4118
4119                rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl);
4120        }
4121
4122        if(rcode == POSITIVE_ACK)
4123        {
4124                /* Let Sender Know if MVID length field
4125                 * is larger then SUM of SV length's
4126                 */
4127                if(vlen != 0)
4128                        rcode = E_VECTOR_LENGTH_ERROR;
4129                else
4130		{
4131                	/* Let Sender Know if Expected SV Missing */
4132                	if((svectors & R_INIT) ^ R_INIT)
4133                        	rcode = E_MISSING_SUB_VECTOR;
4134		}
4135        }
4136
4137        return (rcode);
4138}
4139
4140static int smctr_rcv_tx_forward(struct net_device *dev, MAC_HEADER *rmf)
4141{
4142        MAC_SUB_VECTOR *rsv;
4143        signed short vlen;
4144        __u16 rcode = POSITIVE_ACK;
4145        unsigned int svectors = F_NO_SUB_VECTORS_FOUND;
4146
4147        /* This Frame can only come from a CRS */
4148        if((rmf->dc_sc & SC_MASK) != SC_CRS)
4149                return (E_INAPPROPRIATE_SOURCE_CLASS);
4150
4151        /* Remove MVID Length from total length */
4152        vlen = (signed short)rmf->vl - 4;
4153
4154        /* Point to First SVID */
4155        rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER));
4156
4157        /* Search for Appropriate SVID's */
4158        while((vlen > 0) && (rcode == POSITIVE_ACK))
4159        {
4160                switch(rsv->svi)
4161                {
4162                        case FRAME_FORWARD:
4163                                svectors |= F_FRAME_FORWARD;
4164                                rcode = smctr_set_frame_forward(dev, rsv,
4165					rmf->dc_sc);
4166                                break;
4167
4168                        default:
4169                                rcode = E_SUB_VECTOR_UNKNOWN;
4170                                break;
4171                }
4172
4173                /* Let Sender Know if SUM of SV length's is
4174                 * larger then length in MVID length field
4175		 */
4176                if((vlen -= rsv->svl) < 0)
4177                        rcode = E_VECTOR_LENGTH_ERROR;
4178
4179                rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl);
4180        }
4181
4182        if(rcode == POSITIVE_ACK)
4183        {
4184                /* Let Sender Know if MVID length field
4185                 * is larger then SUM of SV length's
4186                 */
4187                if(vlen != 0)
4188                        rcode = E_VECTOR_LENGTH_ERROR;
4189                else
4190		{
4191                	/* Let Sender Know if Expected SV Missing */
4192                	if((svectors & R_TX_FORWARD) ^ R_TX_FORWARD)
4193                        	rcode = E_MISSING_SUB_VECTOR;
4194		}
4195        }
4196
4197        return (rcode);
4198}
4199
4200static int smctr_rcv_rq_addr_state_attch(struct net_device *dev,
4201        MAC_HEADER *rmf, __u16 *correlator)
4202{
4203        MAC_SUB_VECTOR *rsv;
4204        signed short vlen;
4205        __u16 rcode = POSITIVE_ACK;
4206        unsigned int svectors = F_NO_SUB_VECTORS_FOUND;
4207
4208        /* Remove MVID Length from total length */
4209        vlen = (signed short)rmf->vl - 4;
4210
4211        /* Point to First SVID */
4212        rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER));
4213
4214        /* Search for Appropriate SVID's */
4215        while((vlen > 0) && (rcode == POSITIVE_ACK))
4216        {
4217                switch(rsv->svi)
4218                {
4219                        case CORRELATOR:
4220                                svectors |= F_CORRELATOR;
4221                                rcode = smctr_set_corr(dev, rsv, correlator);
4222                                break;
4223
4224                        default:
4225                                rcode = E_SUB_VECTOR_UNKNOWN;
4226                                break;
4227                }
4228
4229                /* Let Sender Know if SUM of SV length's is
4230                 * larger then length in MVID length field
4231                 */
4232                if((vlen -= rsv->svl) < 0)
4233                        rcode = E_VECTOR_LENGTH_ERROR;
4234
4235                rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl);
4236        }
4237
4238        if(rcode == POSITIVE_ACK)
4239        {
4240                /* Let Sender Know if MVID length field
4241                 * is larger then SUM of SV length's
4242                 */
4243                if(vlen != 0)
4244                        rcode = E_VECTOR_LENGTH_ERROR;
4245                else
4246		{
4247                	/* Let Sender Know if Expected SVID Missing */
4248                	if((svectors & R_RQ_ATTCH_STATE_ADDR)
4249				^ R_RQ_ATTCH_STATE_ADDR)
4250                        	rcode = E_MISSING_SUB_VECTOR;
4251			}
4252        }
4253
4254        return (rcode);
4255}
4256
4257static int smctr_rcv_unknown(struct net_device *dev, MAC_HEADER *rmf,
4258        __u16 *correlator)
4259{
4260        MAC_SUB_VECTOR *rsv;
4261        signed short vlen;
4262
4263        *correlator = 0;
4264
4265        /* Remove MVID Length from total length */
4266        vlen = (signed short)rmf->vl - 4;
4267
4268        /* Point to First SVID */
4269        rsv = (MAC_SUB_VECTOR *)((__u32)rmf + sizeof(MAC_HEADER));
4270
4271        /* Search for CORRELATOR for RSP to UNKNOWN */
4272        while((vlen > 0) && (*correlator == 0))
4273        {
4274                switch(rsv->svi)
4275                {
4276                        case CORRELATOR:
4277                                smctr_set_corr(dev, rsv, correlator);
4278                                break;
4279
4280                        default:
4281                                break;
4282                }
4283
4284                vlen -= rsv->svl;
4285                rsv = (MAC_SUB_VECTOR *)((__u32)rsv + rsv->svl);
4286        }
4287
4288        return (E_UNRECOGNIZED_VECTOR_ID);
4289}
4290
4291/*
4292 * Reset the 825 NIC and exit w:
4293 * 1. The NIC reset cleared (non-reset state), halted and un-initialized.
4294 * 2. TINT masked.
4295 * 3. CBUSY masked.
4296 * 4. TINT clear.
4297 * 5. CBUSY clear.
4298 */
4299static int smctr_reset_adapter(struct net_device *dev)
4300{
4301        struct net_local *tp = netdev_priv(dev);
4302        int ioaddr = dev->base_addr;
4303
4304        /* Reseting the NIC will put it in a halted and un-initialized state. */        smctr_set_trc_reset(ioaddr);
4305        mdelay(200); /* ~2 ms */
4306
4307        smctr_clear_trc_reset(ioaddr);
4308        mdelay(200); /* ~2 ms */
4309
4310        /* Remove any latched interrupts that occurred prior to reseting the
4311         * adapter or possibily caused by line glitches due to the reset.
4312         */
4313        outb(tp->trc_mask | CSR_CLRTINT | CSR_CLRCBUSY, ioaddr + CSR);
4314
4315        return (0);
4316}
4317
4318static int smctr_restart_tx_chain(struct net_device *dev, short queue)
4319{
4320        struct net_local *tp = netdev_priv(dev);
4321        int err = 0;
4322
4323        if(smctr_debug > 10)
4324                printk(KERN_DEBUG "%s: smctr_restart_tx_chain\n", dev->name);
4325
4326        if(tp->num_tx_fcbs_used[queue] != 0
4327                && tp->tx_queue_status[queue] == NOT_TRANSMITING)
4328        {
4329                tp->tx_queue_status[queue] = TRANSMITING;
4330                err = smctr_issue_resume_tx_fcb_cmd(dev, queue);
4331        }
4332
4333        return (err);
4334}
4335
4336static int smctr_ring_status_chg(struct net_device *dev)
4337{
4338        struct net_local *tp = netdev_priv(dev);
4339
4340        if(smctr_debug > 10)
4341                printk(KERN_DEBUG "%s: smctr_ring_status_chg\n", dev->name);
4342
4343        /* Check for ring_status_flag: whenever MONITOR_STATE_BIT
4344         * Bit is set, check value of monitor_state, only then we
4345         * enable and start transmit/receive timeout (if and only
4346         * if it is MS_ACTIVE_MONITOR_STATE or MS_STANDBY_MONITOR_STATE)
4347         */
4348        if(tp->ring_status_flags == MONITOR_STATE_CHANGED)
4349        {
4350                if((tp->monitor_state == MS_ACTIVE_MONITOR_STATE)
4351                        || (tp->monitor_state == MS_STANDBY_MONITOR_STATE))
4352                {
4353                        tp->monitor_state_ready = 1;
4354                }
4355                else
4356                {
4357                        /* if adapter is NOT in either active monitor
4358                         * or standby monitor state => Disable
4359                         * transmit/receive timeout.
4360                         */
4361                        tp->monitor_state_ready = 0;
4362
4363			/* Ring speed problem, switching to auto mode. */
4364			if(tp->monitor_state == MS_MONITOR_FSM_INACTIVE
4365				&& !tp->cleanup)
4366			{
4367				printk(KERN_INFO "%s: Incorrect ring speed switching.\n",
4368					dev->name);
4369				smctr_set_ring_speed(dev);
4370			}
4371                }
4372        }
4373
4374        if(!(tp->ring_status_flags & RING_STATUS_CHANGED))
4375                return (0);
4376
4377        switch(tp->ring_status)
4378        {
4379                case RING_RECOVERY:
4380                        printk(KERN_INFO "%s: Ring Recovery\n", dev->name);
4381                        tp->current_ring_status |= RING_RECOVERY;
4382                        break;
4383
4384                case SINGLE_STATION:
4385                        printk(KERN_INFO "%s: Single Statinon\n", dev->name);
4386                        tp->current_ring_status |= SINGLE_STATION;
4387                        break;
4388
4389                case COUNTER_OVERFLOW:
4390                        printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
4391                        tp->current_ring_status |= COUNTER_OVERFLOW;
4392                        break;
4393
4394                case REMOVE_RECEIVED:
4395                        printk(KERN_INFO "%s: Remove Received\n", dev->name);
4396                        tp->current_ring_status |= REMOVE_RECEIVED;
4397                        break;
4398
4399                case AUTO_REMOVAL_ERROR:
4400                        printk(KERN_INFO "%s: Auto Remove Error\n", dev->name);
4401                        tp->current_ring_status |= AUTO_REMOVAL_ERROR;
4402                        break;
4403
4404                case LOBE_WIRE_FAULT:
4405                        printk(KERN_INFO "%s: Lobe Wire Fault\n", dev->name);
4406                        tp->current_ring_status |= LOBE_WIRE_FAULT;
4407                        break;
4408
4409                case TRANSMIT_BEACON:
4410                        printk(KERN_INFO "%s: Transmit Beacon\n", dev->name);
4411                        tp->current_ring_status |= TRANSMIT_BEACON;
4412                        break;
4413
4414                case SOFT_ERROR:
4415                        printk(KERN_INFO "%s: Soft Error\n", dev->name);
4416                        tp->current_ring_status |= SOFT_ERROR;
4417                        break;
4418
4419                case HARD_ERROR:
4420                        printk(KERN_INFO "%s: Hard Error\n", dev->name);
4421                        tp->current_ring_status |= HARD_ERROR;
4422                        break;
4423
4424                case SIGNAL_LOSS:
4425                        printk(KERN_INFO "%s: Signal Loss\n", dev->name);
4426                        tp->current_ring_status |= SIGNAL_LOSS;
4427                        break;
4428
4429                default:
4430			printk(KERN_INFO "%s: Unknown ring status change\n",
4431				dev->name);
4432                        break;
4433        }
4434
4435        return (0);
4436}
4437
4438static int smctr_rx_frame(struct net_device *dev)
4439{
4440        struct net_local *tp = netdev_priv(dev);
4441        __u16 queue, status, rx_size, err = 0;
4442        __u8 *pbuff;
4443
4444        if(smctr_debug > 10)
4445                printk(KERN_DEBUG "%s: smctr_rx_frame\n", dev->name);
4446
4447        queue = tp->receive_queue_number;
4448
4449        while((status = tp->rx_fcb_curr[queue]->frame_status) != SUCCESS)
4450        {
4451                err = HARDWARE_FAILED;
4452
4453                if(((status & 0x007f) == 0)
4454                        || ((tp->receive_mask & ACCEPT_ERR_PACKETS) != 0))
4455                {
4456                        /* frame length less the CRC (4 bytes) + FS (1 byte) */
4457                        rx_size = tp->rx_fcb_curr[queue]->frame_length - 5;
4458
4459                        pbuff = smctr_get_rx_pointer(dev, queue);
4460
4461                        smctr_set_page(dev, pbuff);
4462                        smctr_disable_16bit(dev);
4463
4464                        /* pbuff points to addr within one page */
4465                        pbuff = (__u8 *)PAGE_POINTER(pbuff);
4466
4467                        if(queue == NON_MAC_QUEUE)
4468                        {
4469                                struct sk_buff *skb;
4470
4471                                skb = dev_alloc_skb(rx_size);
4472				if (skb) {
4473                                	skb_put(skb, rx_size);
4474
4475					skb_copy_to_linear_data(skb, pbuff, rx_size);
4476
4477                                	/* Update Counters */
4478                                	tp->MacStat.rx_packets++;
4479                                	tp->MacStat.rx_bytes += skb->len;
4480
4481                                	/* Kick the packet on up. */
4482                                	skb->protocol = tr_type_trans(skb, dev);
4483                                	netif_rx(skb);
4484					dev->last_rx = jiffies;
4485				} else {
4486				}
4487                        }
4488                        else
4489                                smctr_process_rx_packet((MAC_HEADER *)pbuff,
4490                                        rx_size, dev, status);
4491                }
4492
4493                smctr_enable_16bit(dev);
4494                smctr_set_page(dev, (__u8 *)tp->ram_access);
4495                smctr_update_rx_chain(dev, queue);
4496
4497                if(err != SUCCESS)
4498                        break;
4499        }
4500
4501        return (err);
4502}
4503
4504static int smctr_send_dat(struct net_device *dev)
4505{
4506        struct net_local *tp = netdev_priv(dev);
4507        unsigned int i, err;
4508        MAC_HEADER *tmf;
4509        FCBlock *fcb;
4510
4511        if(smctr_debug > 10)
4512                printk(KERN_DEBUG "%s: smctr_send_dat\n", dev->name);
4513
4514        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE,
4515                sizeof(MAC_HEADER))) == (FCBlock *)(-1L))
4516        {
4517                return (OUT_OF_RESOURCES);
4518        }
4519
4520        /* Initialize DAT Data Fields. */
4521        tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
4522        tmf->ac = MSB(AC_FC_DAT);
4523        tmf->fc = LSB(AC_FC_DAT);
4524
4525        for(i = 0; i < 6; i++)
4526        {
4527                tmf->sa[i] = dev->dev_addr[i];
4528                tmf->da[i] = dev->dev_addr[i];
4529
4530        }
4531
4532        tmf->vc        = DAT;
4533        tmf->dc_sc     = DC_RS | SC_RS;
4534        tmf->vl        = 4;
4535        tmf->vl        = SWAP_BYTES(tmf->vl);
4536
4537        /* Start Transmit. */
4538        if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE)))
4539                return (err);
4540
4541        /* Wait for Transmit to Complete */
4542        for(i = 0; i < 10000; i++)
4543        {
4544                if(fcb->frame_status & FCB_COMMAND_DONE)
4545                        break;
4546                mdelay(1);
4547        }
4548
4549        /* Check if GOOD frame Tx'ed. */
4550        if(!(fcb->frame_status &  FCB_COMMAND_DONE)
4551                || fcb->frame_status & (FCB_TX_STATUS_E | FCB_TX_AC_BITS))
4552        {
4553                return (INITIALIZE_FAILED);
4554        }
4555
4556        /* De-allocated Tx FCB and Frame Buffer
4557         * The FCB must be de-allocated manually if executing with
4558         * interrupts disabled, other wise the ISR (LM_Service_Events)
4559         * will de-allocate it when the interrupt occurs.
4560         */
4561        tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING;
4562        smctr_update_tx_chain(dev, fcb, MAC_QUEUE);
4563
4564        return (0);
4565}
4566
4567static void smctr_timeout(struct net_device *dev)
4568{
4569	/*
4570         * If we get here, some higher level has decided we are broken.
4571         * There should really be a "kick me" function call instead.
4572         *
4573         * Resetting the token ring adapter takes a long time so just
4574         * fake transmission time and go on trying. Our own timeout
4575         * routine is in sktr_timer_chk()
4576         */
4577        dev->trans_start = jiffies;
4578        netif_wake_queue(dev);
4579}
4580
4581/*
4582 * Gets skb from system, queues it and checks if it can be sent
4583 */
4584static int smctr_send_packet(struct sk_buff *skb, struct net_device *dev)
4585{
4586        struct net_local *tp = netdev_priv(dev);
4587
4588        if(smctr_debug > 10)
4589                printk(KERN_DEBUG "%s: smctr_send_packet\n", dev->name);
4590
4591        /*
4592         * Block a transmit overlap
4593         */
4594
4595        netif_stop_queue(dev);
4596
4597        if(tp->QueueSkb == 0)
4598                return (1);     /* Return with tbusy set: queue full */
4599
4600        tp->QueueSkb--;
4601        skb_queue_tail(&tp->SendSkbQueue, skb);
4602        smctr_hardware_send_packet(dev, tp);
4603        if(tp->QueueSkb > 0)
4604		netif_wake_queue(dev);
4605
4606        return (0);
4607}
4608
4609static int smctr_send_lobe_media_test(struct net_device *dev)
4610{
4611        struct net_local *tp = netdev_priv(dev);
4612	MAC_SUB_VECTOR *tsv;
4613	MAC_HEADER *tmf;
4614        FCBlock *fcb;
4615	__u32 i;
4616	int err;
4617
4618        if(smctr_debug > 15)
4619                printk(KERN_DEBUG "%s: smctr_send_lobe_media_test\n", dev->name);
4620
4621        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(struct trh_hdr)
4622                + S_WRAP_DATA + S_WRAP_DATA)) == (FCBlock *)(-1L))
4623        {
4624                return (OUT_OF_RESOURCES);
4625        }
4626
4627        /* Initialize DAT Data Fields. */
4628        tmf = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
4629        tmf->ac = MSB(AC_FC_LOBE_MEDIA_TEST);
4630        tmf->fc = LSB(AC_FC_LOBE_MEDIA_TEST);
4631
4632        for(i = 0; i < 6; i++)
4633        {
4634                tmf->da[i] = 0;
4635                tmf->sa[i] = dev->dev_addr[i];
4636        }
4637
4638        tmf->vc        = LOBE_MEDIA_TEST;
4639        tmf->dc_sc     = DC_RS | SC_RS;
4640        tmf->vl        = 4;
4641
4642        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
4643        smctr_make_wrap_data(dev, tsv);
4644        tmf->vl += tsv->svl;
4645
4646        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4647        smctr_make_wrap_data(dev, tsv);
4648        tmf->vl += tsv->svl;
4649
4650        /* Start Transmit. */
4651        tmf->vl = SWAP_BYTES(tmf->vl);
4652        if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE)))
4653                return (err);
4654
4655        /* Wait for Transmit to Complete. (10 ms). */
4656        for(i=0; i < 10000; i++)
4657        {
4658                if(fcb->frame_status & FCB_COMMAND_DONE)
4659                        break;
4660                mdelay(1);
4661        }
4662
4663        /* Check if GOOD frame Tx'ed */
4664        if(!(fcb->frame_status & FCB_COMMAND_DONE)
4665                || fcb->frame_status & (FCB_TX_STATUS_E | FCB_TX_AC_BITS))
4666        {
4667                return (LOBE_MEDIA_TEST_FAILED);
4668        }
4669
4670        /* De-allocated Tx FCB and Frame Buffer
4671         * The FCB must be de-allocated manually if executing with
4672         * interrupts disabled, other wise the ISR (LM_Service_Events)
4673         * will de-allocate it when the interrupt occurs.
4674         */
4675        tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING;
4676        smctr_update_tx_chain(dev, fcb, MAC_QUEUE);
4677
4678        return (0);
4679}
4680
4681static int smctr_send_rpt_addr(struct net_device *dev, MAC_HEADER *rmf,
4682        __u16 correlator)
4683{
4684        MAC_HEADER *tmf;
4685        MAC_SUB_VECTOR *tsv;
4686        FCBlock *fcb;
4687
4688        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
4689		+ S_CORRELATOR + S_PHYSICAL_DROP + S_UPSTREAM_NEIGHBOR_ADDRESS
4690		+ S_ADDRESS_MODIFER + S_GROUP_ADDRESS + S_FUNCTIONAL_ADDRESS))
4691		== (FCBlock *)(-1L))
4692        {
4693                return (0);
4694        }
4695
4696        tmf 		= (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
4697        tmf->vc    	= RPT_ADDR;
4698        tmf->dc_sc 	= (rmf->dc_sc & SC_MASK) << 4;
4699        tmf->vl    	= 4;
4700
4701        smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_ADDR);
4702
4703        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
4704        smctr_make_corr(dev, tsv, correlator);
4705
4706        tmf->vl += tsv->svl;
4707        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4708        smctr_make_phy_drop_num(dev, tsv);
4709
4710        tmf->vl += tsv->svl;
4711        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4712        smctr_make_upstream_neighbor_addr(dev, tsv);
4713
4714        tmf->vl += tsv->svl;
4715        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4716        smctr_make_addr_mod(dev, tsv);
4717
4718        tmf->vl += tsv->svl;
4719        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4720        smctr_make_group_addr(dev, tsv);
4721
4722        tmf->vl += tsv->svl;
4723        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4724        smctr_make_funct_addr(dev, tsv);
4725
4726        tmf->vl += tsv->svl;
4727
4728        /* Subtract out MVID and MVL which is
4729         * include in both vl and MAC_HEADER
4730         */
4731/*      fcb->frame_length           = tmf->vl + sizeof(MAC_HEADER) - 4;
4732        fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4;
4733*/
4734        tmf->vl = SWAP_BYTES(tmf->vl);
4735
4736        return (smctr_trc_send_packet(dev, fcb, MAC_QUEUE));
4737}
4738
4739static int smctr_send_rpt_attch(struct net_device *dev, MAC_HEADER *rmf,
4740        __u16 correlator)
4741{
4742        MAC_HEADER *tmf;
4743        MAC_SUB_VECTOR *tsv;
4744        FCBlock *fcb;
4745
4746        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
4747		+ S_CORRELATOR + S_PRODUCT_INSTANCE_ID + S_FUNCTIONAL_ADDRESS
4748		+ S_AUTHORIZED_FUNCTION_CLASS + S_AUTHORIZED_ACCESS_PRIORITY))
4749		== (FCBlock *)(-1L))
4750        {
4751                return (0);
4752        }
4753
4754        tmf 	   = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
4755        tmf->vc    = RPT_ATTCH;
4756        tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4;
4757        tmf->vl    = 4;
4758
4759        smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_ATTCH);
4760
4761        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
4762        smctr_make_corr(dev, tsv, correlator);
4763
4764        tmf->vl += tsv->svl;
4765        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4766        smctr_make_product_id(dev, tsv);
4767
4768        tmf->vl += tsv->svl;
4769        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4770        smctr_make_funct_addr(dev, tsv);
4771
4772        tmf->vl += tsv->svl;
4773        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4774        smctr_make_auth_funct_class(dev, tsv);
4775
4776        tmf->vl += tsv->svl;
4777        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4778        smctr_make_access_pri(dev, tsv);
4779
4780        tmf->vl += tsv->svl;
4781
4782        /* Subtract out MVID and MVL which is
4783         * include in both vl and MAC_HEADER
4784         */
4785/*      fcb->frame_length           = tmf->vl + sizeof(MAC_HEADER) - 4;
4786        fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4;
4787*/
4788        tmf->vl = SWAP_BYTES(tmf->vl);
4789
4790        return (smctr_trc_send_packet(dev, fcb, MAC_QUEUE));
4791}
4792
4793static int smctr_send_rpt_state(struct net_device *dev, MAC_HEADER *rmf,
4794        __u16 correlator)
4795{
4796        MAC_HEADER *tmf;
4797        MAC_SUB_VECTOR *tsv;
4798        FCBlock *fcb;
4799
4800        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
4801		+ S_CORRELATOR + S_RING_STATION_VERSION_NUMBER
4802		+ S_RING_STATION_STATUS + S_STATION_IDENTIFER))
4803		== (FCBlock *)(-1L))
4804        {
4805                return (0);
4806        }
4807
4808        tmf 	   = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
4809        tmf->vc    = RPT_STATE;
4810        tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4;
4811        tmf->vl    = 4;
4812
4813        smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_STATE);
4814
4815        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
4816        smctr_make_corr(dev, tsv, correlator);
4817
4818        tmf->vl += tsv->svl;
4819        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4820        smctr_make_ring_station_version(dev, tsv);
4821
4822        tmf->vl += tsv->svl;
4823        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4824        smctr_make_ring_station_status(dev, tsv);
4825
4826        tmf->vl += tsv->svl;
4827        tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4828        smctr_make_station_id(dev, tsv);
4829
4830        tmf->vl += tsv->svl;
4831
4832        /* Subtract out MVID and MVL which is
4833         * include in both vl and MAC_HEADER
4834         */
4835/*      fcb->frame_length           = tmf->vl + sizeof(MAC_HEADER) - 4;
4836        fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4;
4837*/
4838        tmf->vl = SWAP_BYTES(tmf->vl);
4839
4840        return (smctr_trc_send_packet(dev, fcb, MAC_QUEUE));
4841}
4842
4843static int smctr_send_rpt_tx_forward(struct net_device *dev,
4844        MAC_HEADER *rmf, __u16 tx_fstatus)
4845{
4846        MAC_HEADER *tmf;
4847        MAC_SUB_VECTOR *tsv;
4848        FCBlock *fcb;
4849
4850        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
4851		+ S_TRANSMIT_STATUS_CODE)) == (FCBlock *)(-1L))
4852        {
4853                return (0);
4854        }
4855
4856        tmf 	   = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
4857        tmf->vc    = RPT_TX_FORWARD;
4858        tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4;
4859        tmf->vl    = 4;
4860
4861        smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RPT_TX_FORWARD);
4862
4863        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
4864        smctr_make_tx_status_code(dev, tsv, tx_fstatus);
4865
4866        tmf->vl += tsv->svl;
4867
4868        /* Subtract out MVID and MVL which is
4869         * include in both vl and MAC_HEADER
4870         */
4871/*      fcb->frame_length           = tmf->vl + sizeof(MAC_HEADER) - 4;
4872        fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4;
4873*/
4874        tmf->vl = SWAP_BYTES(tmf->vl);
4875
4876        return(smctr_trc_send_packet(dev, fcb, MAC_QUEUE));
4877}
4878
4879static int smctr_send_rsp(struct net_device *dev, MAC_HEADER *rmf,
4880        __u16 rcode, __u16 correlator)
4881{
4882        MAC_HEADER *tmf;
4883        MAC_SUB_VECTOR *tsv;
4884        FCBlock *fcb;
4885
4886        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
4887		+ S_CORRELATOR + S_RESPONSE_CODE)) == (FCBlock *)(-1L))
4888        {
4889                return (0);
4890        }
4891
4892        tmf 	   = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
4893        tmf->vc    = RSP;
4894        tmf->dc_sc = (rmf->dc_sc & SC_MASK) << 4;
4895        tmf->vl    = 4;
4896
4897        smctr_make_8025_hdr(dev, rmf, tmf, AC_FC_RSP);
4898
4899        tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
4900        smctr_make_corr(dev, tsv, correlator);
4901
4902        return (0);
4903}
4904
4905static int smctr_send_rq_init(struct net_device *dev)
4906{
4907        struct net_local *tp = netdev_priv(dev);
4908        MAC_HEADER *tmf;
4909        MAC_SUB_VECTOR *tsv;
4910        FCBlock *fcb;
4911	unsigned int i, count = 0;
4912	__u16 fstatus;
4913	int err;
4914
4915        do {
4916        	if(((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, sizeof(MAC_HEADER)
4917			+ S_PRODUCT_INSTANCE_ID + S_UPSTREAM_NEIGHBOR_ADDRESS
4918			+ S_RING_STATION_VERSION_NUMBER + S_ADDRESS_MODIFER))
4919			== (FCBlock *)(-1L)))
4920                {
4921                        return (0);
4922                }
4923
4924                tmf 	   = (MAC_HEADER *)fcb->bdb_ptr->data_block_ptr;
4925                tmf->vc    = RQ_INIT;
4926                tmf->dc_sc = DC_RPS | SC_RS;
4927                tmf->vl    = 4;
4928
4929                smctr_make_8025_hdr(dev, NULL, tmf, AC_FC_RQ_INIT);
4930
4931                tsv = (MAC_SUB_VECTOR *)((__u32)tmf + sizeof(MAC_HEADER));
4932                smctr_make_product_id(dev, tsv);
4933
4934                tmf->vl += tsv->svl;
4935                tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4936                smctr_make_upstream_neighbor_addr(dev, tsv);
4937
4938                tmf->vl += tsv->svl;
4939                tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4940                smctr_make_ring_station_version(dev, tsv);
4941
4942                tmf->vl += tsv->svl;
4943                tsv = (MAC_SUB_VECTOR *)((__u32)tsv + tsv->svl);
4944                smctr_make_addr_mod(dev, tsv);
4945
4946                tmf->vl += tsv->svl;
4947
4948                /* Subtract out MVID and MVL which is
4949                 * include in both vl and MAC_HEADER
4950                 */
4951/*              fcb->frame_length           = tmf->vl + sizeof(MAC_HEADER) - 4;
4952                fcb->bdb_ptr->buffer_length = tmf->vl + sizeof(MAC_HEADER) - 4;
4953*/
4954                tmf->vl = SWAP_BYTES(tmf->vl);
4955
4956                if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE)))
4957                        return (err);
4958
4959                /* Wait for Transmit to Complete */
4960      		for(i = 0; i < 10000; i++)
4961		{
4962          		if(fcb->frame_status & FCB_COMMAND_DONE)
4963              			break;
4964          		mdelay(1);
4965      		}
4966
4967                /* Check if GOOD frame Tx'ed */
4968                fstatus = fcb->frame_status;
4969
4970                if(!(fstatus & FCB_COMMAND_DONE))
4971                        return (HARDWARE_FAILED);
4972
4973                if(!(fstatus & FCB_TX_STATUS_E))
4974                        count++;
4975
4976                /* De-allocated Tx FCB and Frame Buffer
4977                 * The FCB must be de-allocated manually if executing with
4978                 * interrupts disabled, other wise the ISR (LM_Service_Events)
4979                 * will de-allocate it when the interrupt occurs.
4980                 */
4981                tp->tx_queue_status[MAC_QUEUE] = NOT_TRANSMITING;
4982                smctr_update_tx_chain(dev, fcb, MAC_QUEUE);
4983        } while(count < 4 && ((fstatus & FCB_TX_AC_BITS) ^ FCB_TX_AC_BITS));
4984
4985	return (smctr_join_complete_state(dev));
4986}
4987
4988static int smctr_send_tx_forward(struct net_device *dev, MAC_HEADER *rmf,
4989        __u16 *tx_fstatus)
4990{
4991        struct net_local *tp = netdev_priv(dev);
4992        FCBlock *fcb;
4993        unsigned int i;
4994	int err;
4995
4996        /* Check if this is the END POINT of the Transmit Forward Chain. */
4997        if(rmf->vl <= 18)
4998                return (0);
4999
5000        /* Allocate Transmit FCB only by requesting 0 bytes
5001         * of data buffer.
5002         */
5003        if((fcb = smctr_get_tx_fcb(dev, MAC_QUEUE, 0)) == (FCBlock *)(-1L))
5004                return (0);
5005
5006        /* Set pointer to Transmit Frame Buffer to the data
5007         * portion of the received TX Forward frame, making
5008         * sure to skip over the Vector Code (vc) and Vector
5009         * length (vl).
5010         */
5011        fcb->bdb_ptr->trc_data_block_ptr = TRC_POINTER((__u32)rmf
5012		+ sizeof(MAC_HEADER) + 2);
5013        fcb->bdb_ptr->data_block_ptr     = (__u16 *)((__u32)rmf
5014		+ sizeof(MAC_HEADER) + 2);
5015
5016        fcb->frame_length                = rmf->vl - 4 - 2;
5017        fcb->bdb_ptr->buffer_length      = rmf->vl - 4 - 2;
5018
5019        if((err = smctr_trc_send_packet(dev, fcb, MAC_QUEUE)))
5020                return (err);
5021
5022        /* Wait for Transmit to Complete */
5023   	for(i = 0; i < 10000; i++)
5024	{
5025       		if(fcb->frame_status & FCB_COMMAND_DONE)
5026           		break;
5027        	mdelay(1);
5028   	}
5029
5030        /* Check if GOOD frame Tx'ed */
5031        if(!(fcb->frame_status & FCB_COMMAND_DONE))
5032        {
5033                if((err = smctr_issue_resume_tx_fcb_cmd(dev, MAC_QUEUE)))
5034                        return (err);
5035
5036      		for(i = 0; i < 10000; i++)
5037		{
5038          		if(fcb->frame_status & FCB_COMMAND_DONE)
5039              			break;
5040        		mdelay(1);
5041      		}
5042
5043                if(!(fcb->frame_status & FCB_COMMAND_DONE))
5044                        return (HARDWARE_FAILED);
5045        }
5046
5047        *tx_fstatus = fcb->frame_status;
5048
5049        return (A_FRAME_WAS_FORWARDED);
5050}
5051
5052static int smctr_set_auth_access_pri(struct net_device *dev,
5053        MAC_SUB_VECTOR *rsv)
5054{
5055        struct net_local *tp = netdev_priv(dev);
5056
5057        if(rsv->svl != S_AUTHORIZED_ACCESS_PRIORITY)
5058                return (E_SUB_VECTOR_LENGTH_ERROR);
5059
5060        tp->authorized_access_priority = (rsv->svv[0] << 8 | rsv->svv[1]);
5061
5062        return (POSITIVE_ACK);
5063}
5064
5065static int smctr_set_auth_funct_class(struct net_device *dev,
5066        MAC_SUB_VECTOR *rsv)
5067{
5068        struct net_local *tp = netdev_priv(dev);
5069
5070        if(rsv->svl != S_AUTHORIZED_FUNCTION_CLASS)
5071                return (E_SUB_VECTOR_LENGTH_ERROR);
5072
5073        tp->authorized_function_classes = (rsv->svv[0] << 8 | rsv->svv[1]);
5074
5075        return (POSITIVE_ACK);
5076}
5077
5078static int smctr_set_corr(struct net_device *dev, MAC_SUB_VECTOR *rsv,
5079        __u16 *correlator)
5080{
5081        if(rsv->svl != S_CORRELATOR)
5082                return (E_SUB_VECTOR_LENGTH_ERROR);
5083
5084        *correlator = (rsv->svv[0] << 8 | rsv->svv[1]);
5085
5086        return (POSITIVE_ACK);
5087}
5088
5089static int smctr_set_error_timer_value(struct net_device *dev,
5090        MAC_SUB_VECTOR *rsv)
5091{
5092	__u16 err_tval;
5093	int err;
5094
5095        if(rsv->svl != S_ERROR_TIMER_VALUE)
5096                return (E_SUB_VECTOR_LENGTH_ERROR);
5097
5098        err_tval = (rsv->svv[0] << 8 | rsv->svv[1])*10;
5099
5100        smctr_issue_write_word_cmd(dev, RW_TER_THRESHOLD, &err_tval);
5101
5102        if((err = smctr_wait_cmd(dev)))
5103                return (err);
5104
5105        return (POSITIVE_ACK);
5106}
5107
5108static int smctr_set_frame_forward(struct net_device *dev,
5109        MAC_SUB_VECTOR *rsv, __u8 dc_sc)
5110{
5111        if((rsv->svl < 2) || (rsv->svl > S_FRAME_FORWARD))
5112                return (E_SUB_VECTOR_LENGTH_ERROR);
5113
5114        if((dc_sc & DC_MASK) != DC_CRS)
5115        {
5116                if(rsv->svl >= 2 && rsv->svl < 20)
5117                	return (E_TRANSMIT_FORWARD_INVALID);
5118
5119                if((rsv->svv[0] != 0) || (rsv->svv[1] != 0))
5120                        return (E_TRANSMIT_FORWARD_INVALID);
5121        }
5122
5123        return (POSITIVE_ACK);
5124}
5125
5126static int smctr_set_local_ring_num(struct net_device *dev,
5127        MAC_SUB_VECTOR *rsv)
5128{
5129        struct net_local *tp = netdev_priv(dev);
5130
5131        if(rsv->svl != S_LOCAL_RING_NUMBER)
5132                return (E_SUB_VECTOR_LENGTH_ERROR);
5133
5134        if(tp->ptr_local_ring_num)
5135                *(__u16 *)(tp->ptr_local_ring_num)
5136			= (rsv->svv[0] << 8 | rsv->svv[1]);
5137
5138        return (POSITIVE_ACK);
5139}
5140
5141static unsigned short smctr_set_ctrl_attention(struct net_device *dev)
5142{
5143        struct net_local *tp = netdev_priv(dev);
5144        int ioaddr = dev->base_addr;
5145
5146        if(tp->bic_type == BIC_585_CHIP)
5147                outb((tp->trc_mask | HWR_CA), ioaddr + HWR);
5148        else
5149        {
5150                outb((tp->trc_mask | CSR_CA), ioaddr + CSR);
5151                outb(tp->trc_mask, ioaddr + CSR);
5152        }
5153
5154        return (0);
5155}
5156
5157static void smctr_set_multicast_list(struct net_device *dev)
5158{
5159        if(smctr_debug > 10)
5160                printk(KERN_DEBUG "%s: smctr_set_multicast_list\n", dev->name);
5161
5162        return;
5163}
5164
5165static int smctr_set_page(struct net_device *dev, __u8 *buf)
5166{
5167        struct net_local *tp = netdev_priv(dev);
5168        __u8 amask;
5169        __u32 tptr;
5170
5171        tptr = (__u32)buf - (__u32)tp->ram_access;
5172        amask = (__u8)((tptr & PR_PAGE_MASK) >> 8);
5173        outb(amask, dev->base_addr + PR);
5174
5175        return (0);
5176}
5177
5178static int smctr_set_phy_drop(struct net_device *dev, MAC_SUB_VECTOR *rsv)
5179{
5180	int err;
5181
5182        if(rsv->svl != S_PHYSICAL_DROP)
5183                return (E_SUB_VECTOR_LENGTH_ERROR);
5184
5185        smctr_issue_write_byte_cmd(dev, RW_PHYSICAL_DROP_NUMBER, &rsv->svv[0]);
5186        if((err = smctr_wait_cmd(dev)))
5187                return (err);
5188
5189        return (POSITIVE_ACK);
5190}
5191
5192/* Reset the ring speed to the opposite of what it was. This auto-pilot
5193 * mode requires a complete reset and re-init of the adapter.
5194 */
5195static int smctr_set_ring_speed(struct net_device *dev)
5196{
5197        struct net_local *tp = netdev_priv(dev);
5198	int err;
5199
5200        if(tp->media_type == MEDIA_UTP_16)
5201                tp->media_type = MEDIA_UTP_4;
5202        else
5203                tp->media_type = MEDIA_UTP_16;
5204
5205        smctr_enable_16bit(dev);
5206
5207        /* Re-Initialize adapter's internal registers */
5208        smctr_reset_adapter(dev);
5209
5210        if((err = smctr_init_card_real(dev)))
5211                return (err);
5212
5213        smctr_enable_bic_int(dev);
5214
5215        if((err = smctr_issue_enable_int_cmd(dev, TRC_INTERRUPT_ENABLE_MASK)))
5216                return (err);
5217
5218        smctr_disable_16bit(dev);
5219
5220	return (0);
5221}
5222
5223static int smctr_set_rx_look_ahead(struct net_device *dev)
5224{
5225        struct net_local *tp = netdev_priv(dev);
5226        __u16 sword, rword;
5227
5228        if(smctr_debug > 10)
5229                printk(KERN_DEBUG "%s: smctr_set_rx_look_ahead_flag\n", dev->name);
5230
5231        tp->adapter_flags &= ~(FORCED_16BIT_MODE);
5232        tp->adapter_flags |= RX_VALID_LOOKAHEAD;
5233
5234        if(tp->adapter_bus == BUS_ISA16_TYPE)
5235        {
5236                sword = *((__u16 *)(tp->ram_access));
5237                *((__u16 *)(tp->ram_access)) = 0x1234;
5238
5239                smctr_disable_16bit(dev);
5240                rword = *((__u16 *)(tp->ram_access));
5241                smctr_enable_16bit(dev);
5242
5243                if(rword != 0x1234)
5244                        tp->adapter_flags |= FORCED_16BIT_MODE;
5245
5246                *((__u16 *)(tp->ram_access)) = sword;
5247        }
5248
5249        return (0);
5250}
5251
5252static int smctr_set_trc_reset(int ioaddr)
5253{
5254        __u8 r;
5255
5256        r = inb(ioaddr + MSR);
5257        outb(MSR_RST | r, ioaddr + MSR);
5258
5259        return (0);
5260}
5261
5262/*
5263 * This function can be called if the adapter is busy or not.
5264 */
5265static int smctr_setup_single_cmd(struct net_device *dev,
5266        __u16 command, __u16 subcommand)
5267{
5268        struct net_local *tp = netdev_priv(dev);
5269        unsigned int err;
5270
5271        if(smctr_debug > 10)
5272                printk(KERN_DEBUG "%s: smctr_setup_single_cmd\n", dev->name);
5273
5274        if((err = smctr_wait_while_cbusy(dev)))
5275                return (err);
5276
5277        if((err = (unsigned int)smctr_wait_cmd(dev)))
5278                return (err);
5279
5280        tp->acb_head->cmd_done_status   = 0;
5281        tp->acb_head->cmd               = command;
5282        tp->acb_head->subcmd            = subcommand;
5283
5284        err = smctr_issue_resume_acb_cmd(dev);
5285
5286        return (err);
5287}
5288
5289/*
5290 * This function can not be called with the adapter busy.
5291 */
5292static int smctr_setup_single_cmd_w_data(struct net_device *dev,
5293        __u16 command, __u16 subcommand)
5294{
5295        struct net_local *tp = netdev_priv(dev);
5296
5297        tp->acb_head->cmd_done_status   = ACB_COMMAND_NOT_DONE;
5298        tp->acb_head->cmd               = command;
5299        tp->acb_head->subcmd            = subcommand;
5300        tp->acb_head->data_offset_lo
5301                = (__u16)TRC_POINTER(tp->misc_command_data);
5302
5303        return(smctr_issue_resume_acb_cmd(dev));
5304}
5305
5306static char *smctr_malloc(struct net_device *dev, __u16 size)
5307{
5308        struct net_local *tp = netdev_priv(dev);
5309        char *m;
5310
5311        m = (char *)(tp->ram_access + tp->sh_mem_used);
5312        tp->sh_mem_used += (__u32)size;
5313
5314        return (m);
5315}
5316
5317static int smctr_status_chg(struct net_device *dev)
5318{
5319        struct net_local *tp = netdev_priv(dev);
5320
5321        if(smctr_debug > 10)
5322                printk(KERN_DEBUG "%s: smctr_status_chg\n", dev->name);
5323
5324        switch(tp->status)
5325        {
5326                case OPEN:
5327                        break;
5328
5329                case CLOSED:
5330                        break;
5331
5332                case INITIALIZED:
5333                        tp->group_address_0 = 0;
5334                        tp->group_address[0] = 0;
5335                        tp->group_address[1] = 0;
5336                        tp->functional_address_0 = 0;
5337                        tp->functional_address[0] = 0;
5338                        tp->functional_address[1] = 0;
5339                        smctr_open_tr(dev);
5340                        break;
5341
5342                default:
5343                        printk(KERN_INFO "%s: status change unknown %x\n",
5344                                dev->name, tp->status);
5345                        break;
5346        }
5347
5348        return (0);
5349}
5350
5351static int smctr_trc_send_packet(struct net_device *dev, FCBlock *fcb,
5352        __u16 queue)
5353{
5354        struct net_local *tp = netdev_priv(dev);
5355        int err = 0;
5356
5357        if(smctr_debug > 10)
5358                printk(KERN_DEBUG "%s: smctr_trc_send_packet\n", dev->name);
5359
5360        fcb->info = FCB_CHAIN_END | FCB_ENABLE_TFS;
5361        if(tp->num_tx_fcbs[queue] != 1)
5362                fcb->back_ptr->info = FCB_INTERRUPT_ENABLE | FCB_ENABLE_TFS;
5363
5364        if(tp->tx_queue_status[queue] == NOT_TRANSMITING)
5365        {
5366                tp->tx_queue_status[queue] = TRANSMITING;
5367                err = smctr_issue_resume_tx_fcb_cmd(dev, queue);
5368        }
5369
5370        return (err);
5371}
5372
5373static __u16 smctr_tx_complete(struct net_device *dev, __u16 queue)
5374{
5375        struct net_local *tp = netdev_priv(dev);
5376        __u16 status, err = 0;
5377        int cstatus;
5378
5379        if(smctr_debug > 10)
5380                printk(KERN_DEBUG "%s: smctr_tx_complete\n", dev->name);
5381
5382        while((status = tp->tx_fcb_end[queue]->frame_status) != SUCCESS)
5383        {
5384                if(status & 0x7e00 )
5385                {
5386                        err = HARDWARE_FAILED;
5387                        break;
5388                }
5389
5390                if((err = smctr_update_tx_chain(dev, tp->tx_fcb_end[queue],
5391                        queue)) != SUCCESS)
5392                        break;
5393
5394                smctr_disable_16bit(dev);
5395
5396                if(tp->mode_bits & UMAC)
5397                {
5398                        if(!(status & (FCB_TX_STATUS_AR1 | FCB_TX_STATUS_AR2)))
5399                                cstatus = NO_SUCH_DESTINATION;
5400                        else
5401                        {
5402                                if(!(status & (FCB_TX_STATUS_CR1 | FCB_TX_STATUS_CR2)))
5403                                        cstatus = DEST_OUT_OF_RESOURCES;
5404                                else
5405                                {
5406                                        if(status & FCB_TX_STATUS_E)
5407                                                cstatus = MAX_COLLISIONS;
5408                                        else
5409                                                cstatus = SUCCESS;
5410                                }
5411                        }
5412                }
5413                else
5414                        cstatus = SUCCESS;
5415
5416                if(queue == BUG_QUEUE)
5417                        err = SUCCESS;
5418
5419                smctr_enable_16bit(dev);
5420                if(err != SUCCESS)
5421                        break;
5422        }
5423
5424        return (err);
5425}
5426
5427static unsigned short smctr_tx_move_frame(struct net_device *dev,
5428        struct sk_buff *skb, __u8 *pbuff, unsigned int bytes)
5429{
5430        struct net_local *tp = netdev_priv(dev);
5431        unsigned int ram_usable;
5432        __u32 flen, len, offset = 0;
5433        __u8 *frag, *page;
5434
5435        if(smctr_debug > 10)
5436                printk(KERN_DEBUG "%s: smctr_tx_move_frame\n", dev->name);
5437
5438        ram_usable = ((unsigned int)tp->ram_usable) << 10;
5439        frag       = skb->data;
5440        flen       = skb->len;
5441
5442        while(flen > 0 && bytes > 0)
5443        {
5444                smctr_set_page(dev, pbuff);
5445
5446                offset = SMC_PAGE_OFFSET(pbuff);
5447
5448                if(offset + flen > ram_usable)
5449                        len = ram_usable - offset;
5450                else
5451                        len = flen;
5452
5453                if(len > bytes)
5454                        len = bytes;
5455
5456                page = (char *) (offset + tp->ram_access);
5457                memcpy(page, frag, len);
5458
5459                flen -=len;
5460                bytes -= len;
5461                frag += len;
5462                pbuff += len;
5463        }
5464
5465        return (0);
5466}
5467
5468/* Update the error statistic counters for this adapter. */
5469static int smctr_update_err_stats(struct net_device *dev)
5470{
5471        struct net_local *tp = netdev_priv(dev);
5472        struct tr_statistics *tstat = &tp->MacStat;
5473
5474        if(tstat->internal_errors)
5475                tstat->internal_errors
5476                        += *(tp->misc_command_data + 0) & 0x00ff;
5477
5478        if(tstat->line_errors)
5479                tstat->line_errors += *(tp->misc_command_data + 0) >> 8;
5480
5481        if(tstat->A_C_errors)
5482                tstat->A_C_errors += *(tp->misc_command_data + 1) & 0x00ff;
5483
5484        if(tstat->burst_errors)
5485                tstat->burst_errors += *(tp->misc_command_data + 1) >> 8;
5486
5487        if(tstat->abort_delimiters)
5488                tstat->abort_delimiters += *(tp->misc_command_data + 2) >> 8;
5489
5490        if(tstat->recv_congest_count)
5491                tstat->recv_congest_count
5492                        += *(tp->misc_command_data + 3) & 0x00ff;
5493
5494        if(tstat->lost_frames)
5495                tstat->lost_frames
5496                        += *(tp->misc_command_data + 3) >> 8;
5497
5498        if(tstat->frequency_errors)
5499                tstat->frequency_errors += *(tp->misc_command_data + 4) & 0x00ff;
5500
5501        if(tstat->frame_copied_errors)
5502                 tstat->frame_copied_errors
5503                        += *(tp->misc_command_data + 4) >> 8;
5504
5505        if(tstat->token_errors)
5506                tstat->token_errors += *(tp->misc_command_data + 5) >> 8;
5507
5508        return (0);
5509}
5510
5511static int smctr_update_rx_chain(struct net_device *dev, __u16 queue)
5512{
5513        struct net_local *tp = netdev_priv(dev);
5514        FCBlock *fcb;
5515        BDBlock *bdb;
5516        __u16 size, len;
5517
5518        fcb = tp->rx_fcb_curr[queue];
5519        len = fcb->frame_length;
5520
5521        fcb->frame_status = 0;
5522        fcb->info = FCB_CHAIN_END;
5523        fcb->back_ptr->info = FCB_WARNING;
5524
5525        tp->rx_fcb_curr[queue] = tp->rx_fcb_curr[queue]->next_ptr;
5526
5527        /* update RX BDBs */
5528        size = (len >> RX_BDB_SIZE_SHIFT);
5529        if(len & RX_DATA_BUFFER_SIZE_MASK)
5530                size += sizeof(BDBlock);
5531        size &= (~RX_BDB_SIZE_MASK);
5532
5533        /* check if wrap around */
5534        bdb = (BDBlock *)((__u32)(tp->rx_bdb_curr[queue]) + (__u32)(size));
5535        if((__u32)bdb >= (__u32)tp->rx_bdb_end[queue])
5536        {
5537                bdb = (BDBlock *)((__u32)(tp->rx_bdb_head[queue])
5538                        + (__u32)(bdb) - (__u32)(tp->rx_bdb_end[queue]));
5539        }
5540
5541        bdb->back_ptr->info = BDB_CHAIN_END;
5542        tp->rx_bdb_curr[queue]->back_ptr->info = BDB_NOT_CHAIN_END;
5543        tp->rx_bdb_curr[queue] = bdb;
5544
5545        return (0);
5546}
5547
5548static int smctr_update_tx_chain(struct net_device *dev, FCBlock *fcb,
5549        __u16 queue)
5550{
5551        struct net_local *tp = netdev_priv(dev);
5552
5553        if(smctr_debug > 20)
5554                printk(KERN_DEBUG "smctr_update_tx_chain\n");
5555
5556        if(tp->num_tx_fcbs_used[queue] <= 0)
5557                return (HARDWARE_FAILED);
5558        else
5559        {
5560                if(tp->tx_buff_used[queue] < fcb->memory_alloc)
5561                {
5562                        tp->tx_buff_used[queue] = 0;
5563                        return (HARDWARE_FAILED);
5564                }
5565
5566                tp->tx_buff_used[queue] -= fcb->memory_alloc;
5567
5568                /* if all transmit buffer are cleared
5569                 * need to set the tx_buff_curr[] to tx_buff_head[]
5570                 * otherwise, tx buffer will be segregate and cannot
5571                 * accommodate and buffer greater than (curr - head) and
5572                 * (end - curr) since we do not allow wrap around allocation.
5573                 */
5574                if(tp->tx_buff_used[queue] == 0)
5575                        tp->tx_buff_curr[queue] = tp->tx_buff_head[queue];
5576
5577                tp->num_tx_fcbs_used[queue]--;
5578                fcb->frame_status = 0;
5579                tp->tx_fcb_end[queue] = fcb->next_ptr;
5580		netif_wake_queue(dev);
5581                return (0);
5582        }
5583}
5584
5585static int smctr_wait_cmd(struct net_device *dev)
5586{
5587        struct net_local *tp = netdev_priv(dev);
5588        unsigned int loop_count = 0x20000;
5589
5590        if(smctr_debug > 10)
5591                printk(KERN_DEBUG "%s: smctr_wait_cmd\n", dev->name);
5592
5593        while(loop_count)
5594        {
5595                if(tp->acb_head->cmd_done_status & ACB_COMMAND_DONE)
5596                        break;
5597		udelay(1);
5598                loop_count--;
5599        }
5600
5601        if(loop_count == 0)
5602                return(HARDWARE_FAILED);
5603
5604        if(tp->acb_head->cmd_done_status & 0xff)
5605                return(HARDWARE_FAILED);
5606
5607        return (0);
5608}
5609
5610static int smctr_wait_while_cbusy(struct net_device *dev)
5611{
5612        struct net_local *tp = netdev_priv(dev);
5613        unsigned int timeout = 0x20000;
5614        int ioaddr = dev->base_addr;
5615        __u8 r;
5616
5617        if(tp->bic_type == BIC_585_CHIP)
5618        {
5619                while(timeout)
5620                {
5621                        r = inb(ioaddr + HWR);
5622                        if((r & HWR_CBUSY) == 0)
5623                                break;
5624                        timeout--;
5625                }
5626        }
5627        else
5628        {
5629                while(timeout)
5630                {
5631                        r = inb(ioaddr + CSR);
5632                        if((r & CSR_CBUSY) == 0)
5633                                break;
5634                        timeout--;
5635                }
5636        }
5637
5638        if(timeout)
5639                return (0);
5640        else
5641                return (HARDWARE_FAILED);
5642}
5643
5644#ifdef MODULE
5645
5646static struct net_device* dev_smctr[SMCTR_MAX_ADAPTERS];
5647static int io[SMCTR_MAX_ADAPTERS];
5648static int irq[SMCTR_MAX_ADAPTERS];
5649
5650MODULE_LICENSE("GPL");
5651
5652module_param_array(io, int, NULL, 0);
5653module_param_array(irq, int, NULL, 0);
5654module_param(ringspeed, int, 0);
5655
5656static struct net_device * __init setup_card(int n)
5657{
5658	struct net_device *dev = alloc_trdev(sizeof(struct net_local));
5659	int err;
5660
5661	if (!dev)
5662		return ERR_PTR(-ENOMEM);
5663
5664	dev->irq = irq[n];
5665	err = smctr_probe1(dev, io[n]);
5666	if (err)
5667		goto out;
5668
5669	err = register_netdev(dev);
5670	if (err)
5671		goto out1;
5672	return dev;
5673 out1:
5674#ifdef CONFIG_MCA_LEGACY
5675	{ struct net_local *tp = netdev_priv(dev);
5676	  if (tp->slot_num)
5677		mca_mark_as_unused(tp->slot_num);
5678	}
5679#endif
5680	release_region(dev->base_addr, SMCTR_IO_EXTENT);
5681	free_irq(dev->irq, dev);
5682out:
5683	free_netdev(dev);
5684	return ERR_PTR(err);
5685}
5686
5687int __init init_module(void)
5688{
5689        int i, found = 0;
5690	struct net_device *dev;
5691
5692        for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) {
5693		dev = io[0]? setup_card(i) : smctr_probe(-1);
5694		if (!IS_ERR(dev)) {
5695			++found;
5696			dev_smctr[i] = dev;
5697		}
5698        }
5699
5700        return found ? 0 : -ENODEV;
5701}
5702
5703void __exit cleanup_module(void)
5704{
5705        int i;
5706
5707        for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) {
5708		struct net_device *dev = dev_smctr[i];
5709
5710		if (dev) {
5711
5712			unregister_netdev(dev);
5713#ifdef CONFIG_MCA_LEGACY
5714			{ struct net_local *tp = netdev_priv(dev);
5715			if (tp->slot_num)
5716				mca_mark_as_unused(tp->slot_num);
5717			}
5718#endif
5719			release_region(dev->base_addr, SMCTR_IO_EXTENT);
5720			if (dev->irq)
5721				free_irq(dev->irq, dev);
5722
5723			free_netdev(dev);
5724		}
5725        }
5726}
5727#endif /* MODULE */
5728