Subversion Repositories HelenOS

Rev

Rev 4708 | Rev 4743 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4708 Rev 4723
1
/*
1
/*
2
 * Copyright (c) 1987,1997, 2006, Vrije Universiteit, Amsterdam, The Netherlands All rights reserved. Redistribution and use of the MINIX 3 operating system in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
2
 * Copyright (c) 1987,1997, 2006, Vrije Universiteit, Amsterdam, The Netherlands All rights reserved. Redistribution and use of the MINIX 3 operating system in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
3
 *
3
 *
4
 * * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
4
 * * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
5
 * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
5
 * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
6
 * * Neither the name of the Vrije Universiteit nor the names of the software authors or contributors may be used to endorse or promote products derived from this software without specific prior written permission.
6
 * * Neither the name of the Vrije Universiteit nor the names of the software authors or contributors may be used to endorse or promote products derived from this software without specific prior written permission.
7
 * * Any deviations from these conditions require written permission from the copyright holder in advance
7
 * * Any deviations from these conditions require written permission from the copyright holder in advance
8
 *
8
 *
9
 *
9
 *
10
 * Disclaimer
10
 * Disclaimer
11
 *
11
 *
12
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS, AUTHORS, AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
12
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS, AUTHORS, AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
13
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
13
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
14
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
14
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
15
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ANY AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
15
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ANY AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
16
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
17
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
17
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
18
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
18
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
19
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
19
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
20
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
21
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
21
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
 *
22
 *
23
 * Changes:
23
 * Changes:
24
 *  2009 Lukas Mejdrech ported to HelenOS
24
 *  2009 Lukas Mejdrech ported to HelenOS
25
 */
25
 */
26
 
26
 
27
/** @addtogroup dp8390
27
/** @addtogroup dp8390
28
 *  @{
28
 *  @{
29
 */
29
 */
30
 
30
 
-
 
31
/** @file
-
 
32
 *  \todo
-
 
33
 */
-
 
34
 
31
#include <assert.h>
35
#include <assert.h>
32
#include <errno.h>
36
#include <errno.h>
33
 
37
 
34
#include "../../include/byteorder.h"
38
#include "../../include/byteorder.h"
35
 
39
 
36
#include "../../structures/packet/packet.h"
40
#include "../../structures/packet/packet.h"
37
#include "../../structures/packet/packet_client.h"
41
#include "../../structures/packet/packet_client.h"
38
 
42
 
39
#include "../netif.h"
43
#include "../netif.h"
40
 
44
 
41
#include "dp8390_drv.h"
45
#include "dp8390_drv.h"
42
#include "dp8390_port.h"
46
#include "dp8390_port.h"
43
 
47
 
44
/*
48
/*
45
 * dp8390.c
49
 * dp8390.c
46
 *
50
 *
47
 * Created: before Dec 28, 1992 by Philip Homburg <philip@f-mnx.phicoh.com>
51
 * Created: before Dec 28, 1992 by Philip Homburg <philip@f-mnx.phicoh.com>
48
 *
52
 *
49
 * Modified Mar 10 1994 by Philip Homburg
53
 * Modified Mar 10 1994 by Philip Homburg
50
 *  Become a generic dp8390 driver.
54
 *  Become a generic dp8390 driver.
51
 *
55
 *
52
 * Modified Dec 20 1996 by G. Falzoni <falzoni@marina.scn.de>
56
 * Modified Dec 20 1996 by G. Falzoni <falzoni@marina.scn.de>
53
 *  Added support for 3c503 boards.
57
 *  Added support for 3c503 boards.
54
 */
58
 */
55
 
59
 
56
#include "local.h"
60
#include "local.h"
57
#include "dp8390.h"
61
#include "dp8390.h"
58
 
62
 
59
int queue_packet( dpeth_t * dep, packet_t packet );
63
int queue_packet( dpeth_t * dep, packet_t packet );
60
static void outsb( port_t port, void * buf, size_t size );
64
static void outsb( port_t port, void * buf, size_t size );
61
static void outsw( port_t port, void * buf, size_t size );
65
static void outsw( port_t port, void * buf, size_t size );
62
 
66
 
63
//static u16_t eth_ign_proto;
67
//static u16_t eth_ign_proto;
64
//static char *progname;
68
//static char *progname;
65
 
69
 
66
/* Configuration */
70
/* Configuration */
67
/*typedef struct dp_conf
71
/*typedef struct dp_conf
68
{
72
{
69
    port_t dpc_port;
73
    port_t dpc_port;
70
    int dpc_irq;
74
    int dpc_irq;
71
    phys_bytes dpc_mem;
75
    phys_bytes dpc_mem;
72
    char *dpc_envvar;
76
    char *dpc_envvar;
73
} dp_conf_t;
77
} dp_conf_t;
74
*/
78
*/
75
//dp_conf_t dp_conf[]=  /* Card addresses */
79
//dp_conf_t dp_conf[]=  /* Card addresses */
76
//{
80
//{
77
    /* I/O port, IRQ,  Buffer address,  Env. var. */
81
    /* I/O port, IRQ,  Buffer address,  Env. var. */
78
/*  {  0x280,     3,    0xD0000,        "DPETH0"    },
82
/*  {  0x280,     3,    0xD0000,        "DPETH0"    },
79
    {  0x300,     5,    0xC8000,        "DPETH1"    },
83
    {  0x300,     5,    0xC8000,        "DPETH1"    },
80
    {  0x380,    10,    0xD8000,        "DPETH2"    },
84
    {  0x380,    10,    0xD8000,        "DPETH2"    },
81
};
85
};
82
*/
86
*/
83
/* Test if dp_conf has exactly DE_PORT_NR entries.  If not then you will see
87
/* Test if dp_conf has exactly DE_PORT_NR entries.  If not then you will see
84
 * the error: "array size is negative".
88
 * the error: "array size is negative".
85
 */
89
 */
86
//extern int ___dummy[DE_PORT_NR == sizeof(dp_conf)/sizeof(dp_conf[0]) ? 1 : -1];
90
//extern int ___dummy[DE_PORT_NR == sizeof(dp_conf)/sizeof(dp_conf[0]) ? 1 : -1];
87
 
91
 
88
/* Card inits configured out? */
92
/* Card inits configured out? */
89
#if !ENABLE_WDETH
93
#if !ENABLE_WDETH
90
#define wdeth_probe(dep)    (0)
94
#define wdeth_probe(dep)    (0)
91
#endif
95
#endif
92
#if !ENABLE_NE2000
96
#if !ENABLE_NE2000
93
#define ne_probe(dep)       (0)
97
#define ne_probe(dep)       (0)
94
#endif
98
#endif
95
#if !ENABLE_3C503
99
#if !ENABLE_3C503
96
#define el2_probe(dep)      (0)
100
#define el2_probe(dep)      (0)
97
#endif
101
#endif
98
 
102
 
99
/* Some clones of the dp8390 and the PC emulator 'Bochs' require the CR_STA
103
/* Some clones of the dp8390 and the PC emulator 'Bochs' require the CR_STA
100
 * on writes to the CR register. Additional CR_STAs do not appear to hurt
104
 * on writes to the CR register. Additional CR_STAs do not appear to hurt
101
 * genuine dp8390s
105
 * genuine dp8390s
102
 */
106
 */
103
#define CR_EXTRA    CR_STA
107
#define CR_EXTRA    CR_STA
104
 
108
 
105
//#if ENABLE_PCI
109
//#if ENABLE_PCI
106
//_PROTOTYPE( static void pci_conf, (void)              );
110
//_PROTOTYPE( static void pci_conf, (void)              );
107
//#endif
111
//#endif
108
//_PROTOTYPE( static void do_vwrite, (message *mp, int from_int,
112
//_PROTOTYPE( static void do_vwrite, (message *mp, int from_int,
109
//                          int vectored)   );
113
//                          int vectored)   );
110
//_PROTOTYPE( static void do_vwrite_s, (message *mp, int from_int)  );
114
//_PROTOTYPE( static void do_vwrite_s, (message *mp, int from_int)  );
111
//_PROTOTYPE( static void do_vread, (message *mp, int vectored)     );
115
//_PROTOTYPE( static void do_vread, (message *mp, int vectored)     );
112
//_PROTOTYPE( static void do_vread_s, (message *mp)         );
116
//_PROTOTYPE( static void do_vread_s, (message *mp)         );
113
//_PROTOTYPE( static void do_init, (message *mp)                );
117
//_PROTOTYPE( static void do_init, (message *mp)                );
114
//_PROTOTYPE( static void do_int, (dpeth_t *dep)                );
118
//_PROTOTYPE( static void do_int, (dpeth_t *dep)                );
115
//_PROTOTYPE( static void do_getstat, (message *mp)         );
119
//_PROTOTYPE( static void do_getstat, (message *mp)         );
116
//_PROTOTYPE( static void do_getstat_s, (message *mp)           );
120
//_PROTOTYPE( static void do_getstat_s, (message *mp)           );
117
//_PROTOTYPE( static void do_getname, (message *mp)         );
121
//_PROTOTYPE( static void do_getname, (message *mp)         );
118
//_PROTOTYPE( static void do_stop, (message *mp)                );
122
//_PROTOTYPE( static void do_stop, (message *mp)                );
119
_PROTOTYPE( static void dp_init, (dpeth_t *dep)             );
123
_PROTOTYPE( static void dp_init, (dpeth_t *dep)             );
120
//_PROTOTYPE( static void dp_confaddr, (dpeth_t *dep)           );
124
//_PROTOTYPE( static void dp_confaddr, (dpeth_t *dep)           );
121
_PROTOTYPE( static void dp_reinit, (dpeth_t *dep)           );
125
_PROTOTYPE( static void dp_reinit, (dpeth_t *dep)           );
122
_PROTOTYPE( static void dp_reset, (dpeth_t *dep)            );
126
_PROTOTYPE( static void dp_reset, (dpeth_t *dep)            );
123
//_PROTOTYPE( static void dp_check_ints, (dpeth_t *dep)         );
127
//_PROTOTYPE( static void dp_check_ints, (dpeth_t *dep)         );
124
_PROTOTYPE( static void dp_recv, (dpeth_t *dep)             );
128
_PROTOTYPE( static void dp_recv, (dpeth_t *dep)             );
125
_PROTOTYPE( static void dp_send, (dpeth_t *dep)             );
129
_PROTOTYPE( static void dp_send, (dpeth_t *dep)             );
126
//_PROTOTYPE( static void dp8390_stop, (void)               );
130
//_PROTOTYPE( static void dp8390_stop, (void)               );
127
_PROTOTYPE( static void dp_getblock, (dpeth_t *dep, int page,
131
_PROTOTYPE( static void dp_getblock, (dpeth_t *dep, int page,
128
                size_t offset, size_t size, void *dst)  );
132
                size_t offset, size_t size, void *dst)  );
129
_PROTOTYPE( static void dp_pio8_getblock, (dpeth_t *dep, int page,
133
_PROTOTYPE( static void dp_pio8_getblock, (dpeth_t *dep, int page,
130
                size_t offset, size_t size, void *dst)  );
134
                size_t offset, size_t size, void *dst)  );
131
_PROTOTYPE( static void dp_pio16_getblock, (dpeth_t *dep, int page,
135
_PROTOTYPE( static void dp_pio16_getblock, (dpeth_t *dep, int page,
132
                size_t offset, size_t size, void *dst)  );
136
                size_t offset, size_t size, void *dst)  );
133
_PROTOTYPE( static int dp_pkt2user, (dpeth_t *dep, int page,
137
_PROTOTYPE( static int dp_pkt2user, (dpeth_t *dep, int page,
134
                            int length) );
138
                            int length) );
135
//_PROTOTYPE( static int dp_pkt2user_s, (dpeth_t *dep, int page,
139
//_PROTOTYPE( static int dp_pkt2user_s, (dpeth_t *dep, int page,
136
//                          int length) );
140
//                          int length) );
137
_PROTOTYPE( static void dp_user2nic, (dpeth_t *dep, iovec_dat_t *iovp,
141
_PROTOTYPE( static void dp_user2nic, (dpeth_t *dep, iovec_dat_t *iovp,
138
        vir_bytes offset, int nic_addr, vir_bytes count)    );
142
        vir_bytes offset, int nic_addr, vir_bytes count)    );
139
//_PROTOTYPE( static void dp_user2nic_s, (dpeth_t *dep, iovec_dat_s_t *iovp, 
143
//_PROTOTYPE( static void dp_user2nic_s, (dpeth_t *dep, iovec_dat_s_t *iovp, 
140
//      vir_bytes offset, int nic_addr, vir_bytes count)    );
144
//      vir_bytes offset, int nic_addr, vir_bytes count)    );
141
_PROTOTYPE( static void dp_pio8_user2nic, (dpeth_t *dep,
145
_PROTOTYPE( static void dp_pio8_user2nic, (dpeth_t *dep,
142
                iovec_dat_t *iovp, vir_bytes offset,
146
                iovec_dat_t *iovp, vir_bytes offset,
143
                int nic_addr, vir_bytes count)      );
147
                int nic_addr, vir_bytes count)      );
144
//_PROTOTYPE( static void dp_pio8_user2nic_s, (dpeth_t *dep,
148
//_PROTOTYPE( static void dp_pio8_user2nic_s, (dpeth_t *dep,
145
//              iovec_dat_s_t *iovp, vir_bytes offset,
149
//              iovec_dat_s_t *iovp, vir_bytes offset,
146
//              int nic_addr, vir_bytes count)      );
150
//              int nic_addr, vir_bytes count)      );
147
_PROTOTYPE( static void dp_pio16_user2nic, (dpeth_t *dep,
151
_PROTOTYPE( static void dp_pio16_user2nic, (dpeth_t *dep,
148
                iovec_dat_t *iovp, vir_bytes offset,
152
                iovec_dat_t *iovp, vir_bytes offset,
149
                int nic_addr, vir_bytes count)      );
153
                int nic_addr, vir_bytes count)      );
150
//_PROTOTYPE( static void dp_pio16_user2nic_s, (dpeth_t *dep,
154
//_PROTOTYPE( static void dp_pio16_user2nic_s, (dpeth_t *dep,
151
//              iovec_dat_s_t *iovp, vir_bytes offset,
155
//              iovec_dat_s_t *iovp, vir_bytes offset,
152
//              int nic_addr, vir_bytes count)      );
156
//              int nic_addr, vir_bytes count)      );
153
_PROTOTYPE( static void dp_nic2user, (dpeth_t *dep, int nic_addr,
157
_PROTOTYPE( static void dp_nic2user, (dpeth_t *dep, int nic_addr,
154
        iovec_dat_t *iovp, vir_bytes offset, vir_bytes count)   );
158
        iovec_dat_t *iovp, vir_bytes offset, vir_bytes count)   );
155
//_PROTOTYPE( static void dp_nic2user_s, (dpeth_t *dep, int nic_addr, 
159
//_PROTOTYPE( static void dp_nic2user_s, (dpeth_t *dep, int nic_addr, 
156
//      iovec_dat_s_t *iovp, vir_bytes offset, vir_bytes count) );
160
//      iovec_dat_s_t *iovp, vir_bytes offset, vir_bytes count) );
157
_PROTOTYPE( static void dp_pio8_nic2user, (dpeth_t *dep, int nic_addr,
161
_PROTOTYPE( static void dp_pio8_nic2user, (dpeth_t *dep, int nic_addr,
158
        iovec_dat_t *iovp, vir_bytes offset, vir_bytes count)   );
162
        iovec_dat_t *iovp, vir_bytes offset, vir_bytes count)   );
159
//_PROTOTYPE( static void dp_pio8_nic2user_s, (dpeth_t *dep, int nic_addr, 
163
//_PROTOTYPE( static void dp_pio8_nic2user_s, (dpeth_t *dep, int nic_addr, 
160
//      iovec_dat_s_t *iovp, vir_bytes offset, vir_bytes count) );
164
//      iovec_dat_s_t *iovp, vir_bytes offset, vir_bytes count) );
161
_PROTOTYPE( static void dp_pio16_nic2user, (dpeth_t *dep, int nic_addr,
165
_PROTOTYPE( static void dp_pio16_nic2user, (dpeth_t *dep, int nic_addr,
162
        iovec_dat_t *iovp, vir_bytes offset, vir_bytes count)   );
166
        iovec_dat_t *iovp, vir_bytes offset, vir_bytes count)   );
163
//_PROTOTYPE( static void dp_pio16_nic2user_s, (dpeth_t *dep, int nic_addr, 
167
//_PROTOTYPE( static void dp_pio16_nic2user_s, (dpeth_t *dep, int nic_addr, 
164
//      iovec_dat_s_t *iovp, vir_bytes offset, vir_bytes count) );
168
//      iovec_dat_s_t *iovp, vir_bytes offset, vir_bytes count) );
165
_PROTOTYPE( static void dp_next_iovec, (iovec_dat_t *iovp)      );
169
_PROTOTYPE( static void dp_next_iovec, (iovec_dat_t *iovp)      );
166
//_PROTOTYPE( static void dp_next_iovec_s, (iovec_dat_s_t *iovp)        );
170
//_PROTOTYPE( static void dp_next_iovec_s, (iovec_dat_s_t *iovp)        );
167
_PROTOTYPE( static void conf_hw, (dpeth_t *dep)             );
171
_PROTOTYPE( static void conf_hw, (dpeth_t *dep)             );
168
//_PROTOTYPE( static void update_conf, (dpeth_t *dep, dp_conf_t *dcp)   );
172
//_PROTOTYPE( static void update_conf, (dpeth_t *dep, dp_conf_t *dcp)   );
169
_PROTOTYPE( static void map_hw_buffer, (dpeth_t *dep)           );
173
_PROTOTYPE( static void map_hw_buffer, (dpeth_t *dep)           );
170
//_PROTOTYPE( static int calc_iovec_size, (iovec_dat_t *iovp)       );
174
//_PROTOTYPE( static int calc_iovec_size, (iovec_dat_t *iovp)       );
171
//_PROTOTYPE( static int calc_iovec_size_s, (iovec_dat_s_t *iovp)       );
175
//_PROTOTYPE( static int calc_iovec_size_s, (iovec_dat_s_t *iovp)       );
172
_PROTOTYPE( static void reply, (dpeth_t *dep, int err, int may_block)   );
176
_PROTOTYPE( static void reply, (dpeth_t *dep, int err, int may_block)   );
173
//_PROTOTYPE( static void mess_reply, (message *req, message *reply)    );
177
//_PROTOTYPE( static void mess_reply, (message *req, message *reply)    );
174
_PROTOTYPE( static void get_userdata, (int user_proc,
178
_PROTOTYPE( static void get_userdata, (int user_proc,
175
        vir_bytes user_addr, vir_bytes count, void *loc_addr)   );
179
        vir_bytes user_addr, vir_bytes count, void *loc_addr)   );
176
//_PROTOTYPE( static void get_userdata_s, (int user_proc,
180
//_PROTOTYPE( static void get_userdata_s, (int user_proc,
177
//      cp_grant_id_t grant, vir_bytes offset, vir_bytes count,
181
//      cp_grant_id_t grant, vir_bytes offset, vir_bytes count,
178
//      void *loc_addr) );
182
//      void *loc_addr) );
179
//_PROTOTYPE( static void put_userdata, (int user_proc,
183
//_PROTOTYPE( static void put_userdata, (int user_proc,
180
//      vir_bytes user_addr, vir_bytes count, void *loc_addr)   );
184
//      vir_bytes user_addr, vir_bytes count, void *loc_addr)   );
181
//_PROTOTYPE( static void put_userdata_s, (int user_proc,
185
//_PROTOTYPE( static void put_userdata_s, (int user_proc,
182
//      cp_grant_id_t grant, size_t count, void *loc_addr)  );
186
//      cp_grant_id_t grant, size_t count, void *loc_addr)  );
183
_PROTOTYPE( static void insb, (port_t port, void *buf, size_t size)             );
187
_PROTOTYPE( static void insb, (port_t port, void *buf, size_t size)             );
184
_PROTOTYPE( static void insw, (port_t port, void *buf, size_t size)             );
188
_PROTOTYPE( static void insw, (port_t port, void *buf, size_t size)             );
185
//_PROTOTYPE( static void do_vir_insb, (port_t port, int proc,
189
//_PROTOTYPE( static void do_vir_insb, (port_t port, int proc,
186
//                  vir_bytes buf, size_t size) );
190
//                  vir_bytes buf, size_t size) );
187
//_PROTOTYPE( static void do_vir_insw, (port_t port, int proc,
191
//_PROTOTYPE( static void do_vir_insw, (port_t port, int proc,
188
//                  vir_bytes buf, size_t size) );
192
//                  vir_bytes buf, size_t size) );
189
//_PROTOTYPE( static void do_vir_outsb, (port_t port, int proc,
193
//_PROTOTYPE( static void do_vir_outsb, (port_t port, int proc,
190
//                  vir_bytes buf, size_t size) );
194
//                  vir_bytes buf, size_t size) );
191
//_PROTOTYPE( static void do_vir_outsw, (port_t port, int proc,
195
//_PROTOTYPE( static void do_vir_outsw, (port_t port, int proc,
192
//                  vir_bytes buf, size_t size) );
196
//                  vir_bytes buf, size_t size) );
193
 
197
 
194
int do_probe( dpeth_t * dep ){
198
int do_probe( dpeth_t * dep ){
195
    /* This is the default, try to (re)locate the device. */
199
    /* This is the default, try to (re)locate the device. */
196
    conf_hw(dep);
200
    conf_hw(dep);
197
    if (dep->de_mode == DEM_DISABLED)
201
    if (dep->de_mode == DEM_DISABLED)
198
    {
202
    {
199
        /* Probe failed, or the device is configured off. */
203
        /* Probe failed, or the device is configured off. */
200
        return EXDEV;//ENXIO;
204
        return EXDEV;//ENXIO;
201
    }
205
    }
202
    if (dep->de_mode == DEM_ENABLED)
206
    if (dep->de_mode == DEM_ENABLED)
203
        dp_init(dep);
207
        dp_init(dep);
204
    return EOK;
208
    return EOK;
205
}
209
}
206
 
210
 
207
/*===========================================================================*
211
/*===========================================================================*
208
 *              dp8390_dump                  *
212
 *              dp8390_dump                  *
209
 *===========================================================================*/
213
 *===========================================================================*/
210
void dp8390_dump( dpeth_t * dep )
214
void dp8390_dump( dpeth_t * dep )
211
{
215
{
212
//  dpeth_t *dep;
216
//  dpeth_t *dep;
213
    int /*i,*/ isr;
217
    int /*i,*/ isr;
214
 
218
 
215
//  printf("\n");
219
//  printf("\n");
216
//  for (i= 0, dep = &de_table[0]; i<DE_PORT_NR; i++, dep++)
220
//  for (i= 0, dep = &de_table[0]; i<DE_PORT_NR; i++, dep++)
217
//  {
221
//  {
218
#if XXX
222
#if XXX
219
        if (dep->de_mode == DEM_DISABLED)
223
        if (dep->de_mode == DEM_DISABLED)
220
            printf("dp8390 port %d is disabled\n", i);
224
            printf("dp8390 port %d is disabled\n", i);
221
        else if (dep->de_mode == DEM_SINK)
225
        else if (dep->de_mode == DEM_SINK)
222
            printf("dp8390 port %d is in sink mode\n", i);
226
            printf("dp8390 port %d is in sink mode\n", i);
223
#endif
227
#endif
224
 
228
 
225
        if (dep->de_mode != DEM_ENABLED)
229
        if (dep->de_mode != DEM_ENABLED)
226
//          continue;
230
//          continue;
227
            return;
231
            return;
228
 
232
 
229
//      printf("dp8390 statistics of port %d:\n", i);
233
//      printf("dp8390 statistics of port %d:\n", i);
230
 
234
 
231
        printf("recvErr    :%8ld\t", dep->de_stat.ets_recvErr);
235
        printf("recvErr    :%8ld\t", dep->de_stat.ets_recvErr);
232
        printf("sendErr    :%8ld\t", dep->de_stat.ets_sendErr);
236
        printf("sendErr    :%8ld\t", dep->de_stat.ets_sendErr);
233
        printf("OVW        :%8ld\n", dep->de_stat.ets_OVW);
237
        printf("OVW        :%8ld\n", dep->de_stat.ets_OVW);
234
 
238
 
235
        printf("CRCerr     :%8ld\t", dep->de_stat.ets_CRCerr);
239
        printf("CRCerr     :%8ld\t", dep->de_stat.ets_CRCerr);
236
        printf("frameAll   :%8ld\t", dep->de_stat.ets_frameAll);
240
        printf("frameAll   :%8ld\t", dep->de_stat.ets_frameAll);
237
        printf("missedP    :%8ld\n", dep->de_stat.ets_missedP);
241
        printf("missedP    :%8ld\n", dep->de_stat.ets_missedP);
238
 
242
 
239
        printf("packetR    :%8ld\t", dep->de_stat.ets_packetR);
243
        printf("packetR    :%8ld\t", dep->de_stat.ets_packetR);
240
        printf("packetT    :%8ld\t", dep->de_stat.ets_packetT);
244
        printf("packetT    :%8ld\t", dep->de_stat.ets_packetT);
241
        printf("transDef   :%8ld\n", dep->de_stat.ets_transDef);
245
        printf("transDef   :%8ld\n", dep->de_stat.ets_transDef);
242
 
246
 
243
        printf("collision  :%8ld\t", dep->de_stat.ets_collision);
247
        printf("collision  :%8ld\t", dep->de_stat.ets_collision);
244
        printf("transAb    :%8ld\t", dep->de_stat.ets_transAb);
248
        printf("transAb    :%8ld\t", dep->de_stat.ets_transAb);
245
        printf("carrSense  :%8ld\n", dep->de_stat.ets_carrSense);
249
        printf("carrSense  :%8ld\n", dep->de_stat.ets_carrSense);
246
 
250
 
247
        printf("fifoUnder  :%8ld\t", dep->de_stat.ets_fifoUnder);
251
        printf("fifoUnder  :%8ld\t", dep->de_stat.ets_fifoUnder);
248
        printf("fifoOver   :%8ld\t", dep->de_stat.ets_fifoOver);
252
        printf("fifoOver   :%8ld\t", dep->de_stat.ets_fifoOver);
249
        printf("CDheartbeat:%8ld\n", dep->de_stat.ets_CDheartbeat);
253
        printf("CDheartbeat:%8ld\n", dep->de_stat.ets_CDheartbeat);
250
 
254
 
251
        printf("OWC        :%8ld\t", dep->de_stat.ets_OWC);
255
        printf("OWC        :%8ld\t", dep->de_stat.ets_OWC);
252
 
256
 
253
        isr= inb_reg0(dep, DP_ISR);
257
        isr= inb_reg0(dep, DP_ISR);
254
        printf("dp_isr = 0x%x + 0x%x, de_flags = 0x%x\n", isr,
258
        printf("dp_isr = 0x%x + 0x%x, de_flags = 0x%x\n", isr,
255
                    inb_reg0(dep, DP_ISR), dep->de_flags);
259
                    inb_reg0(dep, DP_ISR), dep->de_flags);
256
//  }
260
//  }
257
}
261
}
258
 
262
 
259
/*===========================================================================*
263
/*===========================================================================*
260
 *              do_init                      *
264
 *              do_init                      *
261
 *===========================================================================*/
265
 *===========================================================================*/
262
int do_init( dpeth_t * dep, int mode ){
266
int do_init( dpeth_t * dep, int mode ){
263
    if (dep->de_mode == DEM_DISABLED)
267
    if (dep->de_mode == DEM_DISABLED)
264
    {
268
    {
265
        // might call do_probe()
269
        // might call do_probe()
266
        return EXDEV;
270
        return EXDEV;
267
    }
271
    }
268
 
272
 
269
    if (dep->de_mode == DEM_SINK)
273
    if (dep->de_mode == DEM_SINK)
270
    {
274
    {
271
//      strncpy((char *) dep->de_address.ea_addr, "ZDP", 6);
275
//      strncpy((char *) dep->de_address.ea_addr, "ZDP", 6);
272
//      dep->de_address.ea_addr[5] = port;
276
//      dep->de_address.ea_addr[5] = port;
273
//      dp_confaddr(dep);
277
//      dp_confaddr(dep);
274
//      reply_mess.m_type = DL_CONF_REPLY;
278
//      reply_mess.m_type = DL_CONF_REPLY;
275
//      reply_mess.m3_i1 = mp->DL_PORT;
279
//      reply_mess.m3_i1 = mp->DL_PORT;
276
//      reply_mess.m3_i2 = DE_PORT_NR;
280
//      reply_mess.m3_i2 = DE_PORT_NR;
277
//      *(ether_addr_t *) reply_mess.m3_ca1 = dep->de_address;
281
//      *(ether_addr_t *) reply_mess.m3_ca1 = dep->de_address;
278
//      mess_reply(mp, &reply_mess);
282
//      mess_reply(mp, &reply_mess);
279
//      return;
283
//      return;
280
        return EOK;
284
        return EOK;
281
    }
285
    }
282
    assert(dep->de_mode == DEM_ENABLED);
286
    assert(dep->de_mode == DEM_ENABLED);
283
    assert(dep->de_flags & DEF_ENABLED);
287
    assert(dep->de_flags & DEF_ENABLED);
284
 
288
 
285
    dep->de_flags &= ~(DEF_PROMISC | DEF_MULTI | DEF_BROAD);
289
    dep->de_flags &= ~(DEF_PROMISC | DEF_MULTI | DEF_BROAD);
286
 
290
 
287
    if (mode & DL_PROMISC_REQ)
291
    if (mode & DL_PROMISC_REQ)
288
        dep->de_flags |= DEF_PROMISC | DEF_MULTI | DEF_BROAD;
292
        dep->de_flags |= DEF_PROMISC | DEF_MULTI | DEF_BROAD;
289
    if (mode & DL_MULTI_REQ)
293
    if (mode & DL_MULTI_REQ)
290
        dep->de_flags |= DEF_MULTI;
294
        dep->de_flags |= DEF_MULTI;
291
    if (mode & DL_BROAD_REQ)
295
    if (mode & DL_BROAD_REQ)
292
        dep->de_flags |= DEF_BROAD;
296
        dep->de_flags |= DEF_BROAD;
293
 
297
 
294
//  dep->de_client = mp->m_source;
298
//  dep->de_client = mp->m_source;
295
    dp_reinit(dep);
299
    dp_reinit(dep);
296
 
300
 
297
//  reply_mess.m_type = DL_CONF_REPLY;
301
//  reply_mess.m_type = DL_CONF_REPLY;
298
//  reply_mess.m3_i1 = mp->DL_PORT;
302
//  reply_mess.m3_i1 = mp->DL_PORT;
299
//  reply_mess.m3_i2 = DE_PORT_NR;
303
//  reply_mess.m3_i2 = DE_PORT_NR;
300
//  *(ether_addr_t *) reply_mess.m3_ca1 = dep->de_address;
304
//  *(ether_addr_t *) reply_mess.m3_ca1 = dep->de_address;
301
 
305
 
302
//  mess_reply(mp, &reply_mess);
306
//  mess_reply(mp, &reply_mess);
303
    return EOK;
307
    return EOK;
304
}
308
}
305
 
309
 
306
/*===========================================================================*
310
/*===========================================================================*
307
 *              do_stop                      *
311
 *              do_stop                      *
308
 *===========================================================================*/
312
 *===========================================================================*/
309
void do_stop( dpeth_t * dep ){
313
void do_stop( dpeth_t * dep ){
310
    if(( dep->de_mode != DEM_SINK ) && ( dep->de_mode == DEM_ENABLED ) && ( dep->de_flags & DEF_ENABLED )){
314
    if(( dep->de_mode != DEM_SINK ) && ( dep->de_mode == DEM_ENABLED ) && ( dep->de_flags & DEF_ENABLED )){
311
        outb_reg0( dep, DP_CR, CR_STP | CR_DM_ABORT );
315
        outb_reg0( dep, DP_CR, CR_STP | CR_DM_ABORT );
312
        ( dep->de_stopf )( dep );
316
        ( dep->de_stopf )( dep );
313
 
317
 
314
        dep->de_flags = DEF_EMPTY;
318
        dep->de_flags = DEF_EMPTY;
315
    }
319
    }
316
}
320
}
317
 
321
 
318
int queue_packet( dpeth_t * dep, packet_t packet ){
322
int queue_packet( dpeth_t * dep, packet_t packet ){
319
    packet_t    tmp;
323
    packet_t    tmp;
320
 
324
 
321
    if( dep->packet_count > 1 ){
325
    if( dep->packet_count > 1 ){
322
        if( ! pq_add( pq_previous( dep->packet_queue ), packet, 0, 0 )){
326
        if( ! pq_add( pq_previous( dep->packet_queue ), packet, 0, 0 )){
323
            return EINVAL;
327
            return EINVAL;
324
        }
328
        }
325
    }else{
329
    }else{
326
        tmp = pq_add( dep->packet_queue, packet, 0, 0 );
330
        tmp = pq_add( dep->packet_queue, packet, 0, 0 );
327
        if( ! tmp ) return EINVAL;
331
        if( ! tmp ) return EINVAL;
328
        dep->packet_queue = tmp;
332
        dep->packet_queue = tmp;
329
    }
333
    }
330
    ++ dep->packet_count;
334
    ++ dep->packet_count;
331
    return EBUSY;
335
    return EBUSY;
332
}
336
}
333
 
337
 
334
/*===========================================================================*
338
/*===========================================================================*
335
 *          based on    do_vwrite                    *
339
 *          based on    do_vwrite                    *
336
 *===========================================================================*/
340
 *===========================================================================*/
337
int do_pwrite( dpeth_t * dep, packet_t packet, int from_int )
341
int do_pwrite( dpeth_t * dep, packet_t packet, int from_int )
338
{
342
{
339
//  int port, count, size;
343
//  int port, count, size;
340
    int size;
344
    int size;
341
    int sendq_head;
345
    int sendq_head;
342
/*  dpeth_t *dep;
346
/*  dpeth_t *dep;
343
 
347
 
344
    port = mp->DL_PORT;
348
    port = mp->DL_PORT;
345
    count = mp->DL_COUNT;
349
    count = mp->DL_COUNT;
346
    if (port < 0 || port >= DE_PORT_NR)
350
    if (port < 0 || port >= DE_PORT_NR)
347
        panic("", "dp8390: illegal port", port);
351
        panic("", "dp8390: illegal port", port);
348
    dep= &de_table[port];
352
    dep= &de_table[port];
349
    dep->de_client= mp->DL_PROC;
353
    dep->de_client= mp->DL_PROC;
350
*/
354
*/
351
    if (dep->de_mode == DEM_SINK)
355
    if (dep->de_mode == DEM_SINK)
352
    {
356
    {
353
        assert(!from_int);
357
        assert(!from_int);
354
//      dep->de_flags |= DEF_PACK_SEND;
358
//      dep->de_flags |= DEF_PACK_SEND;
355
        reply(dep, OK, FALSE);
359
        reply(dep, OK, FALSE);
356
//      return;
360
//      return;
357
        return EOK;
361
        return EOK;
358
    }
362
    }
359
    assert(dep->de_mode == DEM_ENABLED);
363
    assert(dep->de_mode == DEM_ENABLED);
360
    assert(dep->de_flags & DEF_ENABLED);
364
    assert(dep->de_flags & DEF_ENABLED);
361
    if( dep->packet_queue && ( ! from_int )){
365
    if( dep->packet_queue && ( ! from_int )){
362
//  if (dep->de_flags & DEF_SEND_AVAIL){
366
//  if (dep->de_flags & DEF_SEND_AVAIL){
363
//      panic("", "dp8390: send already in progress", NO_NUM);
367
//      panic("", "dp8390: send already in progress", NO_NUM);
364
        return queue_packet( dep, packet );
368
        return queue_packet( dep, packet );
365
    }
369
    }
366
 
370
 
367
    sendq_head= dep->de_sendq_head;
371
    sendq_head= dep->de_sendq_head;
368
//  if (dep->de_sendq[sendq_head].sq_filled)
372
//  if (dep->de_sendq[sendq_head].sq_filled)
369
//  {
373
//  {
370
//      if (from_int)
374
//      if (from_int)
371
//          panic("", "dp8390: should not be sending\n", NO_NUM);
375
//          panic("", "dp8390: should not be sending\n", NO_NUM);
372
//      dep->de_sendmsg= *mp;
376
//      dep->de_sendmsg= *mp;
373
//      dep->de_flags |= DEF_SEND_AVAIL;
377
//      dep->de_flags |= DEF_SEND_AVAIL;
374
//      reply(dep, OK, FALSE);
378
//      reply(dep, OK, FALSE);
375
//      return;
379
//      return;
376
//      return queue_packet( dep, packet );
380
//      return queue_packet( dep, packet );
377
//  }
381
//  }
378
//  assert(!(dep->de_flags & DEF_PACK_SEND));
382
//  assert(!(dep->de_flags & DEF_PACK_SEND));
379
 
383
 
380
/*  if (vectored)
384
/*  if (vectored)
381
    {
385
    {
382
        get_userdata(mp->DL_PROC, (vir_bytes) mp->DL_ADDR,
386
        get_userdata(mp->DL_PROC, (vir_bytes) mp->DL_ADDR,
383
            (count > IOVEC_NR ? IOVEC_NR : count) *
387
            (count > IOVEC_NR ? IOVEC_NR : count) *
384
            sizeof(iovec_t), dep->de_write_iovec.iod_iovec);
388
            sizeof(iovec_t), dep->de_write_iovec.iod_iovec);
385
        dep->de_write_iovec.iod_iovec_s = count;
389
        dep->de_write_iovec.iod_iovec_s = count;
386
        dep->de_write_iovec.iod_proc_nr = mp->DL_PROC;
390
        dep->de_write_iovec.iod_proc_nr = mp->DL_PROC;
387
        dep->de_write_iovec.iod_iovec_addr = (vir_bytes) mp->DL_ADDR;
391
        dep->de_write_iovec.iod_iovec_addr = (vir_bytes) mp->DL_ADDR;
388
 
392
 
389
        dep->de_tmp_iovec = dep->de_write_iovec;
393
        dep->de_tmp_iovec = dep->de_write_iovec;
390
        size = calc_iovec_size(&dep->de_tmp_iovec);
394
        size = calc_iovec_size(&dep->de_tmp_iovec);
391
    }
395
    }
392
    else
396
    else
393
    {  
397
    {  
394
        dep->de_write_iovec.iod_iovec[0].iov_addr =
398
        dep->de_write_iovec.iod_iovec[0].iov_addr =
395
            (vir_bytes) mp->DL_ADDR;
399
            (vir_bytes) mp->DL_ADDR;
396
        dep->de_write_iovec.iod_iovec[0].iov_size =
400
        dep->de_write_iovec.iod_iovec[0].iov_size =
397
            mp->DL_COUNT;
401
            mp->DL_COUNT;
398
        dep->de_write_iovec.iod_iovec_s = 1;
402
        dep->de_write_iovec.iod_iovec_s = 1;
399
        dep->de_write_iovec.iod_proc_nr = mp->DL_PROC;
403
        dep->de_write_iovec.iod_proc_nr = mp->DL_PROC;
400
        dep->de_write_iovec.iod_iovec_addr = 0;
404
        dep->de_write_iovec.iod_iovec_addr = 0;
401
        size= mp->DL_COUNT;
405
        size= mp->DL_COUNT;
402
    }
406
    }
403
*/
407
*/
404
    size = packet_get_data_length( packet );
408
    size = packet_get_data_length( packet );
405
    dep->de_write_iovec.iod_iovec[0].iov_addr = ( vir_bytes ) packet_get_data( packet );
409
    dep->de_write_iovec.iod_iovec[0].iov_addr = ( vir_bytes ) packet_get_data( packet );
406
    dep->de_write_iovec.iod_iovec[0].iov_size = size;
410
    dep->de_write_iovec.iod_iovec[0].iov_size = size;
407
    dep->de_write_iovec.iod_iovec_s = 1;
411
    dep->de_write_iovec.iod_iovec_s = 1;
408
    dep->de_write_iovec.iod_iovec_addr = NULL;
412
    dep->de_write_iovec.iod_iovec_addr = NULL;
409
 
413
 
410
    if (size < ETH_MIN_PACK_SIZE || size > ETH_MAX_PACK_SIZE_TAGGED)
414
    if (size < ETH_MIN_PACK_SIZE || size > ETH_MAX_PACK_SIZE_TAGGED)
411
    {
415
    {
412
        panic("", "dp8390: invalid packet size", size);
416
        panic("", "dp8390: invalid packet size", size);
413
        return EINVAL;
417
        return EINVAL;
414
    }
418
    }
415
    (dep->de_user2nicf)(dep, &dep->de_write_iovec, 0,
419
    (dep->de_user2nicf)(dep, &dep->de_write_iovec, 0,
416
        dep->de_sendq[sendq_head].sq_sendpage * DP_PAGESIZE,
420
        dep->de_sendq[sendq_head].sq_sendpage * DP_PAGESIZE,
417
        size);
421
        size);
418
    dep->de_sendq[sendq_head].sq_filled= TRUE;
422
    dep->de_sendq[sendq_head].sq_filled= TRUE;
419
    if (dep->de_sendq_tail == sendq_head)
423
    if (dep->de_sendq_tail == sendq_head)
420
    {
424
    {
421
        outb_reg0(dep, DP_TPSR, dep->de_sendq[sendq_head].sq_sendpage);
425
        outb_reg0(dep, DP_TPSR, dep->de_sendq[sendq_head].sq_sendpage);
422
        outb_reg0(dep, DP_TBCR1, size >> 8);
426
        outb_reg0(dep, DP_TBCR1, size >> 8);
423
        outb_reg0(dep, DP_TBCR0, size & 0xff);
427
        outb_reg0(dep, DP_TBCR0, size & 0xff);
424
        outb_reg0(dep, DP_CR, CR_TXP | CR_EXTRA);/* there it goes.. */
428
        outb_reg0(dep, DP_CR, CR_TXP | CR_EXTRA);/* there it goes.. */
425
    }
429
    }
426
    else
430
    else
427
        dep->de_sendq[sendq_head].sq_size= size;
431
        dep->de_sendq[sendq_head].sq_size= size;
428
   
432
   
429
    if (++sendq_head == dep->de_sendq_nr)
433
    if (++sendq_head == dep->de_sendq_nr)
430
        sendq_head= 0;
434
        sendq_head= 0;
431
    assert(sendq_head < SENDQ_NR);
435
    assert(sendq_head < SENDQ_NR);
432
    dep->de_sendq_head= sendq_head;
436
    dep->de_sendq_head= sendq_head;
433
 
437
 
434
//  dep->de_flags |= DEF_PACK_SEND;
438
//  dep->de_flags |= DEF_PACK_SEND;
435
 
439
 
436
    /* If the interrupt handler called, don't send a reply. The reply
440
    /* If the interrupt handler called, don't send a reply. The reply
437
     * will be sent after all interrupts are handled.
441
     * will be sent after all interrupts are handled.
438
     */
442
     */
439
    if (from_int)
443
    if (from_int)
440
        return EOK;
444
        return EOK;
441
    reply(dep, OK, FALSE);
445
    reply(dep, OK, FALSE);
442
 
446
 
443
    assert(dep->de_mode == DEM_ENABLED);
447
    assert(dep->de_mode == DEM_ENABLED);
444
    assert(dep->de_flags & DEF_ENABLED);
448
    assert(dep->de_flags & DEF_ENABLED);
445
    return EOK;
449
    return EOK;
446
}
450
}
447
 
451
 
448
/*===========================================================================*
452
/*===========================================================================*
449
 *              dp_init                      *
453
 *              dp_init                      *
450
 *===========================================================================*/
454
 *===========================================================================*/
451
void dp_init(dep)
455
void dp_init(dep)
452
dpeth_t *dep;
456
dpeth_t *dep;
453
{
457
{
454
    int dp_rcr_reg;
458
    int dp_rcr_reg;
455
    int i;//, r;
459
    int i;//, r;
456
 
460
 
457
    /* General initialization */
461
    /* General initialization */
458
    dep->de_flags = DEF_EMPTY;
462
    dep->de_flags = DEF_EMPTY;
459
    (*dep->de_initf)(dep);
463
    (*dep->de_initf)(dep);
460
 
464
 
461
//  dp_confaddr(dep);
465
//  dp_confaddr(dep);
462
 
466
 
463
    if (debug)
467
    if (debug)
464
    {
468
    {
465
        printf("%s: Ethernet address ", dep->de_name);
469
        printf("%s: Ethernet address ", dep->de_name);
466
        for (i= 0; i < 6; i++)
470
        for (i= 0; i < 6; i++)
467
            printf("%x%c", dep->de_address.ea_addr[i],
471
            printf("%x%c", dep->de_address.ea_addr[i],
468
                            i < 5 ? ':' : '\n');
472
                            i < 5 ? ':' : '\n');
469
    }
473
    }
470
 
474
 
471
    /* Map buffer */
475
    /* Map buffer */
472
    map_hw_buffer(dep);
476
    map_hw_buffer(dep);
473
 
477
 
474
    /* Initialization of the dp8390 following the mandatory procedure
478
    /* Initialization of the dp8390 following the mandatory procedure
475
     * in reference manual ("DP8390D/NS32490D NIC Network Interface
479
     * in reference manual ("DP8390D/NS32490D NIC Network Interface
476
     * Controller", National Semiconductor, July 1995, Page 29).
480
     * Controller", National Semiconductor, July 1995, Page 29).
477
     */
481
     */
478
    /* Step 1: */
482
    /* Step 1: */
479
    outb_reg0(dep, DP_CR, CR_PS_P0 | CR_STP | CR_DM_ABORT);
483
    outb_reg0(dep, DP_CR, CR_PS_P0 | CR_STP | CR_DM_ABORT);
480
    /* Step 2: */
484
    /* Step 2: */
481
    if (dep->de_16bit)
485
    if (dep->de_16bit)
482
        outb_reg0(dep, DP_DCR, DCR_WORDWIDE | DCR_8BYTES | DCR_BMS);
486
        outb_reg0(dep, DP_DCR, DCR_WORDWIDE | DCR_8BYTES | DCR_BMS);
483
    else
487
    else
484
        outb_reg0(dep, DP_DCR, DCR_BYTEWIDE | DCR_8BYTES | DCR_BMS);
488
        outb_reg0(dep, DP_DCR, DCR_BYTEWIDE | DCR_8BYTES | DCR_BMS);
485
    /* Step 3: */
489
    /* Step 3: */
486
    outb_reg0(dep, DP_RBCR0, 0);
490
    outb_reg0(dep, DP_RBCR0, 0);
487
    outb_reg0(dep, DP_RBCR1, 0);
491
    outb_reg0(dep, DP_RBCR1, 0);
488
    /* Step 4: */
492
    /* Step 4: */
489
    dp_rcr_reg = 0;
493
    dp_rcr_reg = 0;
490
    if (dep->de_flags & DEF_PROMISC)
494
    if (dep->de_flags & DEF_PROMISC)
491
        dp_rcr_reg |= RCR_AB | RCR_PRO | RCR_AM;
495
        dp_rcr_reg |= RCR_AB | RCR_PRO | RCR_AM;
492
    if (dep->de_flags & DEF_BROAD)
496
    if (dep->de_flags & DEF_BROAD)
493
        dp_rcr_reg |= RCR_AB;
497
        dp_rcr_reg |= RCR_AB;
494
    if (dep->de_flags & DEF_MULTI)
498
    if (dep->de_flags & DEF_MULTI)
495
        dp_rcr_reg |= RCR_AM;
499
        dp_rcr_reg |= RCR_AM;
496
    outb_reg0(dep, DP_RCR, dp_rcr_reg);
500
    outb_reg0(dep, DP_RCR, dp_rcr_reg);
497
    /* Step 5: */
501
    /* Step 5: */
498
    outb_reg0(dep, DP_TCR, TCR_INTERNAL);
502
    outb_reg0(dep, DP_TCR, TCR_INTERNAL);
499
    /* Step 6: */
503
    /* Step 6: */
500
    outb_reg0(dep, DP_BNRY, dep->de_startpage);
504
    outb_reg0(dep, DP_BNRY, dep->de_startpage);
501
    outb_reg0(dep, DP_PSTART, dep->de_startpage);
505
    outb_reg0(dep, DP_PSTART, dep->de_startpage);
502
    outb_reg0(dep, DP_PSTOP, dep->de_stoppage);
506
    outb_reg0(dep, DP_PSTOP, dep->de_stoppage);
503
    /* Step 7: */
507
    /* Step 7: */
504
    outb_reg0(dep, DP_ISR, 0xFF);
508
    outb_reg0(dep, DP_ISR, 0xFF);
505
    /* Step 8: */
509
    /* Step 8: */
506
    outb_reg0(dep, DP_IMR, IMR_PRXE | IMR_PTXE | IMR_RXEE | IMR_TXEE |
510
    outb_reg0(dep, DP_IMR, IMR_PRXE | IMR_PTXE | IMR_RXEE | IMR_TXEE |
507
        IMR_OVWE | IMR_CNTE);
511
        IMR_OVWE | IMR_CNTE);
508
    /* Step 9: */
512
    /* Step 9: */
509
    outb_reg0(dep, DP_CR, CR_PS_P1 | CR_DM_ABORT | CR_STP);
513
    outb_reg0(dep, DP_CR, CR_PS_P1 | CR_DM_ABORT | CR_STP);
510
 
514
 
511
    outb_reg1(dep, DP_PAR0, dep->de_address.ea_addr[0]);
515
    outb_reg1(dep, DP_PAR0, dep->de_address.ea_addr[0]);
512
    outb_reg1(dep, DP_PAR1, dep->de_address.ea_addr[1]);
516
    outb_reg1(dep, DP_PAR1, dep->de_address.ea_addr[1]);
513
    outb_reg1(dep, DP_PAR2, dep->de_address.ea_addr[2]);
517
    outb_reg1(dep, DP_PAR2, dep->de_address.ea_addr[2]);
514
    outb_reg1(dep, DP_PAR3, dep->de_address.ea_addr[3]);
518
    outb_reg1(dep, DP_PAR3, dep->de_address.ea_addr[3]);
515
    outb_reg1(dep, DP_PAR4, dep->de_address.ea_addr[4]);
519
    outb_reg1(dep, DP_PAR4, dep->de_address.ea_addr[4]);
516
    outb_reg1(dep, DP_PAR5, dep->de_address.ea_addr[5]);
520
    outb_reg1(dep, DP_PAR5, dep->de_address.ea_addr[5]);
517
 
521
 
518
    outb_reg1(dep, DP_MAR0, 0xff);
522
    outb_reg1(dep, DP_MAR0, 0xff);
519
    outb_reg1(dep, DP_MAR1, 0xff);
523
    outb_reg1(dep, DP_MAR1, 0xff);
520
    outb_reg1(dep, DP_MAR2, 0xff);
524
    outb_reg1(dep, DP_MAR2, 0xff);
521
    outb_reg1(dep, DP_MAR3, 0xff);
525
    outb_reg1(dep, DP_MAR3, 0xff);
522
    outb_reg1(dep, DP_MAR4, 0xff);
526
    outb_reg1(dep, DP_MAR4, 0xff);
523
    outb_reg1(dep, DP_MAR5, 0xff);
527
    outb_reg1(dep, DP_MAR5, 0xff);
524
    outb_reg1(dep, DP_MAR6, 0xff);
528
    outb_reg1(dep, DP_MAR6, 0xff);
525
    outb_reg1(dep, DP_MAR7, 0xff);
529
    outb_reg1(dep, DP_MAR7, 0xff);
526
 
530
 
527
    outb_reg1(dep, DP_CURR, dep->de_startpage + 1);
531
    outb_reg1(dep, DP_CURR, dep->de_startpage + 1);
528
    /* Step 10: */
532
    /* Step 10: */
529
    outb_reg0(dep, DP_CR, CR_DM_ABORT | CR_STA);
533
    outb_reg0(dep, DP_CR, CR_DM_ABORT | CR_STA);
530
    /* Step 11: */
534
    /* Step 11: */
531
    outb_reg0(dep, DP_TCR, TCR_NORMAL);
535
    outb_reg0(dep, DP_TCR, TCR_NORMAL);
532
 
536
 
533
    inb_reg0(dep, DP_CNTR0);        /* reset counters by reading */
537
    inb_reg0(dep, DP_CNTR0);        /* reset counters by reading */
534
    inb_reg0(dep, DP_CNTR1);
538
    inb_reg0(dep, DP_CNTR1);
535
    inb_reg0(dep, DP_CNTR2);
539
    inb_reg0(dep, DP_CNTR2);
536
 
540
 
537
    /* Finish the initialization. */
541
    /* Finish the initialization. */
538
    dep->de_flags |= DEF_ENABLED;
542
    dep->de_flags |= DEF_ENABLED;
539
    for (i= 0; i<dep->de_sendq_nr; i++)
543
    for (i= 0; i<dep->de_sendq_nr; i++)
540
        dep->de_sendq[i].sq_filled= 0;
544
        dep->de_sendq[i].sq_filled= 0;
541
    dep->de_sendq_head= 0;
545
    dep->de_sendq_head= 0;
542
    dep->de_sendq_tail= 0;
546
    dep->de_sendq_tail= 0;
543
    if (!dep->de_prog_IO)
547
    if (!dep->de_prog_IO)
544
    {
548
    {
545
        dep->de_user2nicf= dp_user2nic;
549
        dep->de_user2nicf= dp_user2nic;
546
//      dep->de_user2nicf_s= dp_user2nic_s;
550
//      dep->de_user2nicf_s= dp_user2nic_s;
547
        dep->de_nic2userf= dp_nic2user;
551
        dep->de_nic2userf= dp_nic2user;
548
//      dep->de_nic2userf_s= dp_nic2user_s;
552
//      dep->de_nic2userf_s= dp_nic2user_s;
549
        dep->de_getblockf= dp_getblock;
553
        dep->de_getblockf= dp_getblock;
550
    }
554
    }
551
    else if (dep->de_16bit)
555
    else if (dep->de_16bit)
552
    {
556
    {
553
        dep->de_user2nicf= dp_pio16_user2nic;
557
        dep->de_user2nicf= dp_pio16_user2nic;
554
//      dep->de_user2nicf_s= dp_pio16_user2nic_s;
558
//      dep->de_user2nicf_s= dp_pio16_user2nic_s;
555
        dep->de_nic2userf= dp_pio16_nic2user;
559
        dep->de_nic2userf= dp_pio16_nic2user;
556
//      dep->de_nic2userf_s= dp_pio16_nic2user_s;
560
//      dep->de_nic2userf_s= dp_pio16_nic2user_s;
557
        dep->de_getblockf= dp_pio16_getblock;
561
        dep->de_getblockf= dp_pio16_getblock;
558
    }
562
    }
559
    else
563
    else
560
    {
564
    {
561
        dep->de_user2nicf= dp_pio8_user2nic;
565
        dep->de_user2nicf= dp_pio8_user2nic;
562
//      dep->de_user2nicf_s= dp_pio8_user2nic_s;
566
//      dep->de_user2nicf_s= dp_pio8_user2nic_s;
563
        dep->de_nic2userf= dp_pio8_nic2user;
567
        dep->de_nic2userf= dp_pio8_nic2user;
564
//      dep->de_nic2userf_s= dp_pio8_nic2user_s;
568
//      dep->de_nic2userf_s= dp_pio8_nic2user_s;
565
        dep->de_getblockf= dp_pio8_getblock;
569
        dep->de_getblockf= dp_pio8_getblock;
566
    }
570
    }
567
 
571
 
568
    /* Set the interrupt handler and policy. Do not automatically
572
    /* Set the interrupt handler and policy. Do not automatically
569
     * reenable interrupts. Return the IRQ line number on interrupts.
573
     * reenable interrupts. Return the IRQ line number on interrupts.
570
     */
574
     */
571
/*  dep->de_hook = dep->de_irq;
575
/*  dep->de_hook = dep->de_irq;
572
    r= sys_irqsetpolicy(dep->de_irq, 0, &dep->de_hook);
576
    r= sys_irqsetpolicy(dep->de_irq, 0, &dep->de_hook);
573
    if (r != OK)
577
    if (r != OK)
574
        panic("DP8390", "sys_irqsetpolicy failed", r);
578
        panic("DP8390", "sys_irqsetpolicy failed", r);
575
 
579
 
576
    r= sys_irqenable(&dep->de_hook);
580
    r= sys_irqenable(&dep->de_hook);
577
    if (r != OK)
581
    if (r != OK)
578
    {
582
    {
579
        panic("DP8390", "unable enable interrupts", r);
583
        panic("DP8390", "unable enable interrupts", r);
580
    }
584
    }
581
*/
585
*/
582
}
586
}
583
 
587
 
584
/*===========================================================================*
588
/*===========================================================================*
585
 *              dp_reinit                    *
589
 *              dp_reinit                    *
586
 *===========================================================================*/
590
 *===========================================================================*/
587
static void dp_reinit(dep)
591
static void dp_reinit(dep)
588
dpeth_t *dep;
592
dpeth_t *dep;
589
{
593
{
590
    int dp_rcr_reg;
594
    int dp_rcr_reg;
591
 
595
 
592
    outb_reg0(dep, DP_CR, CR_PS_P0 | CR_EXTRA);
596
    outb_reg0(dep, DP_CR, CR_PS_P0 | CR_EXTRA);
593
 
597
 
594
    dp_rcr_reg = 0;
598
    dp_rcr_reg = 0;
595
    if (dep->de_flags & DEF_PROMISC)
599
    if (dep->de_flags & DEF_PROMISC)
596
        dp_rcr_reg |= RCR_AB | RCR_PRO | RCR_AM;
600
        dp_rcr_reg |= RCR_AB | RCR_PRO | RCR_AM;
597
    if (dep->de_flags & DEF_BROAD)
601
    if (dep->de_flags & DEF_BROAD)
598
        dp_rcr_reg |= RCR_AB;
602
        dp_rcr_reg |= RCR_AB;
599
    if (dep->de_flags & DEF_MULTI)
603
    if (dep->de_flags & DEF_MULTI)
600
        dp_rcr_reg |= RCR_AM;
604
        dp_rcr_reg |= RCR_AM;
601
    outb_reg0(dep, DP_RCR, dp_rcr_reg);
605
    outb_reg0(dep, DP_RCR, dp_rcr_reg);
602
}
606
}
603
 
607
 
604
/*===========================================================================*
608
/*===========================================================================*
605
 *              dp_reset                     *
609
 *              dp_reset                     *
606
 *===========================================================================*/
610
 *===========================================================================*/
607
static void dp_reset(dep)
611
static void dp_reset(dep)
608
dpeth_t *dep;
612
dpeth_t *dep;
609
{
613
{
610
    int i;
614
    int i;
611
 
615
 
612
    /* Stop chip */
616
    /* Stop chip */
613
    outb_reg0(dep, DP_CR, CR_STP | CR_DM_ABORT);
617
    outb_reg0(dep, DP_CR, CR_STP | CR_DM_ABORT);
614
    outb_reg0(dep, DP_RBCR0, 0);
618
    outb_reg0(dep, DP_RBCR0, 0);
615
    outb_reg0(dep, DP_RBCR1, 0);
619
    outb_reg0(dep, DP_RBCR1, 0);
616
    for (i= 0; i < 0x1000 && ((inb_reg0(dep, DP_ISR) & ISR_RST) == 0); i++)
620
    for (i= 0; i < 0x1000 && ((inb_reg0(dep, DP_ISR) & ISR_RST) == 0); i++)
617
        ; /* Do nothing */
621
        ; /* Do nothing */
618
    outb_reg0(dep, DP_TCR, TCR_1EXTERNAL|TCR_OFST);
622
    outb_reg0(dep, DP_TCR, TCR_1EXTERNAL|TCR_OFST);
619
    outb_reg0(dep, DP_CR, CR_STA|CR_DM_ABORT);
623
    outb_reg0(dep, DP_CR, CR_STA|CR_DM_ABORT);
620
    outb_reg0(dep, DP_TCR, TCR_NORMAL);
624
    outb_reg0(dep, DP_TCR, TCR_NORMAL);
621
 
625
 
622
    /* Acknowledge the ISR_RDC (remote dma) interrupt. */
626
    /* Acknowledge the ISR_RDC (remote dma) interrupt. */
623
    for (i= 0; i < 0x1000 && ((inb_reg0(dep, DP_ISR) & ISR_RDC) == 0); i++)
627
    for (i= 0; i < 0x1000 && ((inb_reg0(dep, DP_ISR) & ISR_RDC) == 0); i++)
624
        ; /* Do nothing */
628
        ; /* Do nothing */
625
    outb_reg0(dep, DP_ISR, inb_reg0(dep, DP_ISR) & ~ISR_RDC);
629
    outb_reg0(dep, DP_ISR, inb_reg0(dep, DP_ISR) & ~ISR_RDC);
626
 
630
 
627
    /* Reset the transmit ring. If we were transmitting a packet, we
631
    /* Reset the transmit ring. If we were transmitting a packet, we
628
     * pretend that the packet is processed. Higher layers will
632
     * pretend that the packet is processed. Higher layers will
629
     * retransmit if the packet wasn't actually sent.
633
     * retransmit if the packet wasn't actually sent.
630
     */
634
     */
631
    dep->de_sendq_head= dep->de_sendq_tail= 0;
635
    dep->de_sendq_head= dep->de_sendq_tail= 0;
632
    for (i= 0; i<dep->de_sendq_nr; i++)
636
    for (i= 0; i<dep->de_sendq_nr; i++)
633
        dep->de_sendq[i].sq_filled= 0;
637
        dep->de_sendq[i].sq_filled= 0;
634
    dp_send(dep);
638
    dp_send(dep);
635
    dep->de_flags &= ~DEF_STOPPED;
639
    dep->de_flags &= ~DEF_STOPPED;
636
}
640
}
637
 
641
 
638
/*===========================================================================*
642
/*===========================================================================*
639
 *              dp_check_ints                    *
643
 *              dp_check_ints                    *
640
 *===========================================================================*/
644
 *===========================================================================*/
641
void dp_check_ints(dep, isr)
645
void dp_check_ints(dep, isr)
642
dpeth_t *dep;
646
dpeth_t *dep;
643
int isr;
647
int isr;
644
{
648
{
645
    int /*isr,*/ tsr;
649
    int /*isr,*/ tsr;
646
    int size, sendq_tail;
650
    int size, sendq_tail;
647
 
651
 
648
    if (!(dep->de_flags & DEF_ENABLED))
652
    if (!(dep->de_flags & DEF_ENABLED))
649
        panic("", "dp8390: got premature interrupt", NO_NUM);
653
        panic("", "dp8390: got premature interrupt", NO_NUM);
650
 
654
 
651
    for(;;)
655
    for(;;)
652
    {
656
    {
653
//      isr = inb_reg0(dep, DP_ISR);
657
//      isr = inb_reg0(dep, DP_ISR);
654
        if (!isr)
658
        if (!isr)
655
            break;
659
            break;
656
        outb_reg0(dep, DP_ISR, isr);
660
        outb_reg0(dep, DP_ISR, isr);
657
        if (isr & (ISR_PTX|ISR_TXE))
661
        if (isr & (ISR_PTX|ISR_TXE))
658
        {
662
        {
659
            if (isr & ISR_TXE)
663
            if (isr & ISR_TXE)
660
            {
664
            {
661
#if DEBUG
665
#if DEBUG
662
 { printf("%s: got send Error\n", dep->de_name); }
666
 { printf("%s: got send Error\n", dep->de_name); }
663
#endif
667
#endif
664
                dep->de_stat.ets_sendErr++;
668
                dep->de_stat.ets_sendErr++;
665
            }
669
            }
666
            else
670
            else
667
            {
671
            {
668
                tsr = inb_reg0(dep, DP_TSR);
672
                tsr = inb_reg0(dep, DP_TSR);
669
 
673
 
670
                if (tsr & TSR_PTX) dep->de_stat.ets_packetT++;
674
                if (tsr & TSR_PTX) dep->de_stat.ets_packetT++;
671
#if 0   /* Reserved in later manuals, should be ignored */
675
#if 0   /* Reserved in later manuals, should be ignored */
672
                if (!(tsr & TSR_DFR))
676
                if (!(tsr & TSR_DFR))
673
                {
677
                {
674
                    /* In most (all?) implementations of
678
                    /* In most (all?) implementations of
675
                     * the dp8390, this bit is set
679
                     * the dp8390, this bit is set
676
                     * when the packet is not deferred
680
                     * when the packet is not deferred
677
                     */
681
                     */
678
                    dep->de_stat.ets_transDef++;
682
                    dep->de_stat.ets_transDef++;
679
                }
683
                }
680
#endif
684
#endif
681
                if (tsr & TSR_COL) dep->de_stat.ets_collision++;
685
                if (tsr & TSR_COL) dep->de_stat.ets_collision++;
682
                if (tsr & TSR_ABT) dep->de_stat.ets_transAb++;
686
                if (tsr & TSR_ABT) dep->de_stat.ets_transAb++;
683
                if (tsr & TSR_CRS) dep->de_stat.ets_carrSense++;
687
                if (tsr & TSR_CRS) dep->de_stat.ets_carrSense++;
684
                if (tsr & TSR_FU
688
                if (tsr & TSR_FU
685
                    && ++dep->de_stat.ets_fifoUnder <= 10)
689
                    && ++dep->de_stat.ets_fifoUnder <= 10)
686
                {
690
                {
687
                    printf("%s: fifo underrun\n",
691
                    printf("%s: fifo underrun\n",
688
                        dep->de_name);
692
                        dep->de_name);
689
                }
693
                }
690
                if (tsr & TSR_CDH
694
                if (tsr & TSR_CDH
691
                    && ++dep->de_stat.ets_CDheartbeat <= 10)
695
                    && ++dep->de_stat.ets_CDheartbeat <= 10)
692
                {
696
                {
693
                    printf("%s: CD heart beat failure\n",
697
                    printf("%s: CD heart beat failure\n",
694
                        dep->de_name);
698
                        dep->de_name);
695
                }
699
                }
696
                if (tsr & TSR_OWC) dep->de_stat.ets_OWC++;
700
                if (tsr & TSR_OWC) dep->de_stat.ets_OWC++;
697
            }
701
            }
698
            sendq_tail= dep->de_sendq_tail;
702
            sendq_tail= dep->de_sendq_tail;
699
 
703
 
700
            if (!(dep->de_sendq[sendq_tail].sq_filled))
704
            if (!(dep->de_sendq[sendq_tail].sq_filled))
701
            {
705
            {
702
                /* Software bug? */
706
                /* Software bug? */
703
                assert(!debug);
707
                assert(!debug);
704
 
708
 
705
                /* Or hardware bug? */
709
                /* Or hardware bug? */
706
                printf(
710
                printf(
707
                "%s: transmit interrupt, but not sending\n",
711
                "%s: transmit interrupt, but not sending\n",
708
                    dep->de_name);
712
                    dep->de_name);
709
                continue;
713
                continue;
710
            }
714
            }
711
            dep->de_sendq[sendq_tail].sq_filled= 0;
715
            dep->de_sendq[sendq_tail].sq_filled= 0;
712
            if (++sendq_tail == dep->de_sendq_nr)
716
            if (++sendq_tail == dep->de_sendq_nr)
713
                sendq_tail= 0;
717
                sendq_tail= 0;
714
            dep->de_sendq_tail= sendq_tail;
718
            dep->de_sendq_tail= sendq_tail;
715
            if (dep->de_sendq[sendq_tail].sq_filled)
719
            if (dep->de_sendq[sendq_tail].sq_filled)
716
            {
720
            {
717
                size= dep->de_sendq[sendq_tail].sq_size;
721
                size= dep->de_sendq[sendq_tail].sq_size;
718
                outb_reg0(dep, DP_TPSR,
722
                outb_reg0(dep, DP_TPSR,
719
                    dep->de_sendq[sendq_tail].sq_sendpage);
723
                    dep->de_sendq[sendq_tail].sq_sendpage);
720
                outb_reg0(dep, DP_TBCR1, size >> 8);
724
                outb_reg0(dep, DP_TBCR1, size >> 8);
721
                outb_reg0(dep, DP_TBCR0, size & 0xff);
725
                outb_reg0(dep, DP_TBCR0, size & 0xff);
722
                outb_reg0(dep, DP_CR, CR_TXP | CR_EXTRA);
726
                outb_reg0(dep, DP_CR, CR_TXP | CR_EXTRA);
723
            }
727
            }
724
//          if (dep->de_flags & DEF_SEND_AVAIL)
728
//          if (dep->de_flags & DEF_SEND_AVAIL)
725
                dp_send(dep);
729
                dp_send(dep);
726
        }
730
        }
727
 
731
 
728
        if (isr & ISR_PRX)
732
        if (isr & ISR_PRX)
729
        {
733
        {
730
            /* Only call dp_recv if there is a read request */
734
            /* Only call dp_recv if there is a read request */
731
//          if (dep->de_flags) & DEF_READING)
735
//          if (dep->de_flags) & DEF_READING)
732
                dp_recv(dep);
736
                dp_recv(dep);
733
        }
737
        }
734
       
738
       
735
        if (isr & ISR_RXE) dep->de_stat.ets_recvErr++;
739
        if (isr & ISR_RXE) dep->de_stat.ets_recvErr++;
736
        if (isr & ISR_CNT)
740
        if (isr & ISR_CNT)
737
        {
741
        {
738
            dep->de_stat.ets_CRCerr += inb_reg0(dep, DP_CNTR0);
742
            dep->de_stat.ets_CRCerr += inb_reg0(dep, DP_CNTR0);
739
            dep->de_stat.ets_frameAll += inb_reg0(dep, DP_CNTR1);
743
            dep->de_stat.ets_frameAll += inb_reg0(dep, DP_CNTR1);
740
            dep->de_stat.ets_missedP += inb_reg0(dep, DP_CNTR2);
744
            dep->de_stat.ets_missedP += inb_reg0(dep, DP_CNTR2);
741
        }
745
        }
742
        if (isr & ISR_OVW)
746
        if (isr & ISR_OVW)
743
        {
747
        {
744
            dep->de_stat.ets_OVW++;
748
            dep->de_stat.ets_OVW++;
745
#if 0
749
#if 0
746
            { printW(); printf(
750
            { printW(); printf(
747
                "%s: got overwrite warning\n", dep->de_name); }
751
                "%s: got overwrite warning\n", dep->de_name); }
748
#endif
752
#endif
749
/*          if (dep->de_flags & DEF_READING)
753
/*          if (dep->de_flags & DEF_READING)
750
            {
754
            {
751
                printf(
755
                printf(
752
"dp_check_ints: strange: overwrite warning and pending read request\n");
756
"dp_check_ints: strange: overwrite warning and pending read request\n");
753
                dp_recv(dep);
757
                dp_recv(dep);
754
            }
758
            }
755
*/      }
759
*/      }
756
        if (isr & ISR_RDC)
760
        if (isr & ISR_RDC)
757
        {
761
        {
758
            /* Nothing to do */
762
            /* Nothing to do */
759
        }
763
        }
760
        if (isr & ISR_RST)
764
        if (isr & ISR_RST)
761
        {
765
        {
762
            /* this means we got an interrupt but the ethernet
766
            /* this means we got an interrupt but the ethernet
763
             * chip is shutdown. We set the flag DEF_STOPPED,
767
             * chip is shutdown. We set the flag DEF_STOPPED,
764
             * and continue processing arrived packets. When the
768
             * and continue processing arrived packets. When the
765
             * receive buffer is empty, we reset the dp8390.
769
             * receive buffer is empty, we reset the dp8390.
766
             */
770
             */
767
#if 0
771
#if 0
768
             { printW(); printf(
772
             { printW(); printf(
769
                "%s: NIC stopped\n", dep->de_name); }
773
                "%s: NIC stopped\n", dep->de_name); }
770
#endif
774
#endif
771
            dep->de_flags |= DEF_STOPPED;
775
            dep->de_flags |= DEF_STOPPED;
772
            break;
776
            break;
773
        }
777
        }
774
        isr = inb_reg0(dep, DP_ISR);
778
        isr = inb_reg0(dep, DP_ISR);
775
    }
779
    }
776
//  if ((dep->de_flags & (DEF_READING|DEF_STOPPED)) == 
780
//  if ((dep->de_flags & (DEF_READING|DEF_STOPPED)) == 
777
//                      (DEF_READING|DEF_STOPPED))
781
//                      (DEF_READING|DEF_STOPPED))
778
    if ((dep->de_flags & DEF_STOPPED) == DEF_STOPPED )
782
    if ((dep->de_flags & DEF_STOPPED) == DEF_STOPPED )
779
    {
783
    {
780
        /* The chip is stopped, and all arrived packets are
784
        /* The chip is stopped, and all arrived packets are
781
         * delivered.
785
         * delivered.
782
         */
786
         */
783
        dp_reset(dep);
787
        dp_reset(dep);
784
    }
788
    }
785
}
789
}
786
 
790
 
787
/*===========================================================================*
791
/*===========================================================================*
788
 *              dp_recv                      *
792
 *              dp_recv                      *
789
 *===========================================================================*/
793
 *===========================================================================*/
790
static void dp_recv(dep)
794
static void dp_recv(dep)
791
dpeth_t *dep;
795
dpeth_t *dep;
792
{
796
{
793
    dp_rcvhdr_t header;
797
    dp_rcvhdr_t header;
794
    unsigned pageno, curr, next;
798
    unsigned pageno, curr, next;
795
    vir_bytes length;
799
    vir_bytes length;
796
    int packet_processed, r;
800
    int packet_processed, r;
797
    u16_t eth_type;
801
    u16_t eth_type;
798
 
802
 
799
    packet_processed = FALSE;
803
    packet_processed = FALSE;
800
    pageno = inb_reg0(dep, DP_BNRY) + 1;
804
    pageno = inb_reg0(dep, DP_BNRY) + 1;
801
    if (pageno == dep->de_stoppage) pageno = dep->de_startpage;
805
    if (pageno == dep->de_stoppage) pageno = dep->de_startpage;
802
 
806
 
803
    do
807
    do
804
    {
808
    {
805
        outb_reg0(dep, DP_CR, CR_PS_P1 | CR_EXTRA);
809
        outb_reg0(dep, DP_CR, CR_PS_P1 | CR_EXTRA);
806
        curr = inb_reg1(dep, DP_CURR);
810
        curr = inb_reg1(dep, DP_CURR);
807
        outb_reg0(dep, DP_CR, CR_PS_P0 | CR_EXTRA);
811
        outb_reg0(dep, DP_CR, CR_PS_P0 | CR_EXTRA);
808
 
812
 
809
        if (curr == pageno) break;
813
        if (curr == pageno) break;
810
 
814
 
811
        (dep->de_getblockf)(dep, pageno, (size_t)0, sizeof(header),
815
        (dep->de_getblockf)(dep, pageno, (size_t)0, sizeof(header),
812
            &header);
816
            &header);
813
        (dep->de_getblockf)(dep, pageno, sizeof(header) +
817
        (dep->de_getblockf)(dep, pageno, sizeof(header) +
814
            2*sizeof(ether_addr_t), sizeof(eth_type), &eth_type);
818
            2*sizeof(ether_addr_t), sizeof(eth_type), &eth_type);
815
 
819
 
816
        length = (header.dr_rbcl | (header.dr_rbch << 8)) -
820
        length = (header.dr_rbcl | (header.dr_rbch << 8)) -
817
            sizeof(dp_rcvhdr_t);
821
            sizeof(dp_rcvhdr_t);
818
        next = header.dr_next;
822
        next = header.dr_next;
819
        if (length < ETH_MIN_PACK_SIZE ||
823
        if (length < ETH_MIN_PACK_SIZE ||
820
            length > ETH_MAX_PACK_SIZE_TAGGED)
824
            length > ETH_MAX_PACK_SIZE_TAGGED)
821
        {
825
        {
822
            printf("%s: packet with strange length arrived: %d\n",
826
            printf("%s: packet with strange length arrived: %d\n",
823
                dep->de_name, (int) length);
827
                dep->de_name, (int) length);
824
            next= curr;
828
            next= curr;
825
        }
829
        }
826
        else if (next < dep->de_startpage || next >= dep->de_stoppage)
830
        else if (next < dep->de_startpage || next >= dep->de_stoppage)
827
        {
831
        {
828
            printf("%s: strange next page\n", dep->de_name);
832
            printf("%s: strange next page\n", dep->de_name);
829
            next= curr;
833
            next= curr;
830
        }
834
        }
831
/*      else if (eth_type == eth_ign_proto)
835
/*      else if (eth_type == eth_ign_proto)
832
        {
836
        {
833
*/          /* Hack: ignore packets of a given protocol, useful
837
*/          /* Hack: ignore packets of a given protocol, useful
834
             * if you share a net with 80 computers sending
838
             * if you share a net with 80 computers sending
835
             * Amoeba FLIP broadcasts.  (Protocol 0x8146.)
839
             * Amoeba FLIP broadcasts.  (Protocol 0x8146.)
836
             */
840
             */
837
/*          static int first= 1;
841
/*          static int first= 1;
838
            if (first)
842
            if (first)
839
            {
843
            {
840
                first= 0;
844
                first= 0;
841
                printf("%s: dropping proto 0x%04x packets\n",
845
                printf("%s: dropping proto 0x%04x packets\n",
842
                    dep->de_name,
846
                    dep->de_name,
843
                    ntohs(eth_ign_proto));
847
                    ntohs(eth_ign_proto));
844
            }
848
            }
845
            dep->de_stat.ets_packetR++;
849
            dep->de_stat.ets_packetR++;
846
        }
850
        }
847
*/      else if (header.dr_status & RSR_FO)
851
*/      else if (header.dr_status & RSR_FO)
848
        {
852
        {
849
            /* This is very serious, so we issue a warning and
853
            /* This is very serious, so we issue a warning and
850
             * reset the buffers */
854
             * reset the buffers */
851
            printf("%s: fifo overrun, resetting receive buffer\n",
855
            printf("%s: fifo overrun, resetting receive buffer\n",
852
                dep->de_name);
856
                dep->de_name);
853
            dep->de_stat.ets_fifoOver++;
857
            dep->de_stat.ets_fifoOver++;
854
            next = curr;
858
            next = curr;
855
        }
859
        }
856
        else if ((header.dr_status & RSR_PRX) &&
860
        else if ((header.dr_status & RSR_PRX) &&
857
                       (dep->de_flags & DEF_ENABLED))
861
                       (dep->de_flags & DEF_ENABLED))
858
        {
862
        {
859
//          if (dep->de_safecopy_read)
863
//          if (dep->de_safecopy_read)
860
//              r = dp_pkt2user_s(dep, pageno, length);
864
//              r = dp_pkt2user_s(dep, pageno, length);
861
//          else
865
//          else
862
                r = dp_pkt2user(dep, pageno, length);
866
                r = dp_pkt2user(dep, pageno, length);
863
            if (r != OK)
867
            if (r != OK)
864
                return;
868
                return;
865
 
869
 
866
            packet_processed = TRUE;
870
            packet_processed = TRUE;
867
            dep->de_stat.ets_packetR++;
871
            dep->de_stat.ets_packetR++;
868
        }
872
        }
869
        if (next == dep->de_startpage)
873
        if (next == dep->de_startpage)
870
            outb_reg0(dep, DP_BNRY, dep->de_stoppage - 1);
874
            outb_reg0(dep, DP_BNRY, dep->de_stoppage - 1);
871
        else
875
        else
872
            outb_reg0(dep, DP_BNRY, next - 1);
876
            outb_reg0(dep, DP_BNRY, next - 1);
873
 
877
 
874
        pageno = next;
878
        pageno = next;
875
    }
879
    }
876
    while (!packet_processed);
880
    while (!packet_processed);
877
}
881
}
878
 
882
 
879
/*===========================================================================*
883
/*===========================================================================*
880
 *              dp_send                      *
884
 *              dp_send                      *
881
 *===========================================================================*/
885
 *===========================================================================*/
882
static void dp_send(dep)
886
static void dp_send(dep)
883
dpeth_t *dep;
887
dpeth_t *dep;
884
{
888
{
885
    packet_t packet;
889
    packet_t packet;
886
 
890
 
887
//  if (!(dep->de_flags & DEF_SEND_AVAIL))
891
//  if (!(dep->de_flags & DEF_SEND_AVAIL))
888
//      return;
892
//      return;
889
 
893
 
890
    if( dep->packet_queue ){
894
    if( dep->packet_queue ){
891
        packet = dep->packet_queue;
895
        packet = dep->packet_queue;
892
        dep->packet_queue = pq_detach( packet );
896
        dep->packet_queue = pq_detach( packet );
893
        do_pwrite( dep, packet, TRUE );
897
        do_pwrite( dep, packet, TRUE );
894
        netif_pq_release( packet_get_id( packet ));
898
        netif_pq_release( packet_get_id( packet ));
895
        -- dep->packet_count;
899
        -- dep->packet_count;
896
    }
900
    }
897
//  if( ! dep->packet_queue ){
901
//  if( ! dep->packet_queue ){
898
//      dep->de_flags &= ~DEF_SEND_AVAIL;
902
//      dep->de_flags &= ~DEF_SEND_AVAIL;
899
//  }
903
//  }
900
/*  switch(dep->de_sendmsg.m_type)
904
/*  switch(dep->de_sendmsg.m_type)
901
    {
905
    {
902
    case DL_WRITE:  do_vwrite(&dep->de_sendmsg, TRUE, FALSE);   break;
906
    case DL_WRITE:  do_vwrite(&dep->de_sendmsg, TRUE, FALSE);   break;
903
    case DL_WRITEV: do_vwrite(&dep->de_sendmsg, TRUE, TRUE);    break;
907
    case DL_WRITEV: do_vwrite(&dep->de_sendmsg, TRUE, TRUE);    break;
904
    case DL_WRITEV_S: do_vwrite_s(&dep->de_sendmsg, TRUE);  break;
908
    case DL_WRITEV_S: do_vwrite_s(&dep->de_sendmsg, TRUE);  break;
905
    default:
909
    default:
906
        panic("", "dp8390: wrong type", dep->de_sendmsg.m_type);
910
        panic("", "dp8390: wrong type", dep->de_sendmsg.m_type);
907
        break;
911
        break;
908
    }
912
    }
909
*/
913
*/
910
}
914
}
911
 
915
 
912
/*===========================================================================*
916
/*===========================================================================*
913
 *              dp_getblock                  *
917
 *              dp_getblock                  *
914
 *===========================================================================*/
918
 *===========================================================================*/
915
static void dp_getblock(dep, page, offset, size, dst)
919
static void dp_getblock(dep, page, offset, size, dst)
916
dpeth_t *dep;
920
dpeth_t *dep;
917
int page;
921
int page;
918
size_t offset;
922
size_t offset;
919
size_t size;
923
size_t size;
920
void *dst;
924
void *dst;
921
{
925
{
922
//  int r;
926
//  int r;
923
 
927
 
924
    offset = page * DP_PAGESIZE + offset;
928
    offset = page * DP_PAGESIZE + offset;
925
 
929
 
926
    memcpy(dst, dep->de_locmem + offset, size);
930
    memcpy(dst, dep->de_locmem + offset, size);
927
}
931
}
928
 
932
 
929
/*===========================================================================*
933
/*===========================================================================*
930
 *              dp_pio8_getblock                 *
934
 *              dp_pio8_getblock                 *
931
 *===========================================================================*/
935
 *===========================================================================*/
932
static void dp_pio8_getblock(dep, page, offset, size, dst)
936
static void dp_pio8_getblock(dep, page, offset, size, dst)
933
dpeth_t *dep;
937
dpeth_t *dep;
934
int page;
938
int page;
935
size_t offset;
939
size_t offset;
936
size_t size;
940
size_t size;
937
void *dst;
941
void *dst;
938
{
942
{
939
    offset = page * DP_PAGESIZE + offset;
943
    offset = page * DP_PAGESIZE + offset;
940
    outb_reg0(dep, DP_RBCR0, size & 0xFF);
944
    outb_reg0(dep, DP_RBCR0, size & 0xFF);
941
    outb_reg0(dep, DP_RBCR1, size >> 8);
945
    outb_reg0(dep, DP_RBCR1, size >> 8);
942
    outb_reg0(dep, DP_RSAR0, offset & 0xFF);
946
    outb_reg0(dep, DP_RSAR0, offset & 0xFF);
943
    outb_reg0(dep, DP_RSAR1, offset >> 8);
947
    outb_reg0(dep, DP_RSAR1, offset >> 8);
944
    outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA);
948
    outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA);
945
 
949
 
946
    insb(dep->de_data_port, dst, size);
950
    insb(dep->de_data_port, dst, size);
947
}
951
}
948
 
952
 
949
/*===========================================================================*
953
/*===========================================================================*
950
 *              dp_pio16_getblock                *
954
 *              dp_pio16_getblock                *
951
 *===========================================================================*/
955
 *===========================================================================*/
952
static void dp_pio16_getblock(dep, page, offset, size, dst)
956
static void dp_pio16_getblock(dep, page, offset, size, dst)
953
dpeth_t *dep;
957
dpeth_t *dep;
954
int page;
958
int page;
955
size_t offset;
959
size_t offset;
956
size_t size;
960
size_t size;
957
void *dst;
961
void *dst;
958
{
962
{
959
    offset = page * DP_PAGESIZE + offset;
963
    offset = page * DP_PAGESIZE + offset;
960
    outb_reg0(dep, DP_RBCR0, size & 0xFF);
964
    outb_reg0(dep, DP_RBCR0, size & 0xFF);
961
    outb_reg0(dep, DP_RBCR1, size >> 8);
965
    outb_reg0(dep, DP_RBCR1, size >> 8);
962
    outb_reg0(dep, DP_RSAR0, offset & 0xFF);
966
    outb_reg0(dep, DP_RSAR0, offset & 0xFF);
963
    outb_reg0(dep, DP_RSAR1, offset >> 8);
967
    outb_reg0(dep, DP_RSAR1, offset >> 8);
964
    outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA);
968
    outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA);
965
 
969
 
966
    assert (!(size & 1));
970
    assert (!(size & 1));
967
    insw(dep->de_data_port, dst, size);
971
    insw(dep->de_data_port, dst, size);
968
}
972
}
969
 
973
 
970
/*===========================================================================*
974
/*===========================================================================*
971
 *              dp_pkt2user                  *
975
 *              dp_pkt2user                  *
972
 *===========================================================================*/
976
 *===========================================================================*/
973
static int dp_pkt2user(dep, page, length)
977
static int dp_pkt2user(dep, page, length)
974
dpeth_t *dep;
978
dpeth_t *dep;
975
int page, length;
979
int page, length;
976
{
980
{
977
    int last, count;
981
    int last, count;
978
    packet_t    packet;
982
    packet_t    packet;
979
    packet_t    queue;
983
    packet_t    queue;
980
 
984
 
981
//  if (!(dep->de_flags & DEF_READING))
985
//  if (!(dep->de_flags & DEF_READING))
982
//      return EGENERIC;
986
//      return EGENERIC;
983
 
987
 
984
    packet = netif_packet_get_1( length );
988
    packet = netif_packet_get_1( length );
985
    if( ! packet ) return ENOMEM;
989
    if( ! packet ) return ENOMEM;
986
    dep->de_read_iovec.iod_iovec[0].iov_addr = ( vir_bytes ) packet_suffix( packet, length );
990
    dep->de_read_iovec.iod_iovec[0].iov_addr = ( vir_bytes ) packet_suffix( packet, length );
987
    dep->de_read_iovec.iod_iovec[0].iov_size = length;
991
    dep->de_read_iovec.iod_iovec[0].iov_size = length;
988
    dep->de_read_iovec.iod_iovec_s = 1;
992
    dep->de_read_iovec.iod_iovec_s = 1;
989
    dep->de_read_iovec.iod_iovec_addr = NULL;
993
    dep->de_read_iovec.iod_iovec_addr = NULL;
990
 
994
 
991
    last = page + (length - 1) / DP_PAGESIZE;
995
    last = page + (length - 1) / DP_PAGESIZE;
992
    if (last >= dep->de_stoppage)
996
    if (last >= dep->de_stoppage)
993
    {
997
    {
994
        count = (dep->de_stoppage - page) * DP_PAGESIZE -
998
        count = (dep->de_stoppage - page) * DP_PAGESIZE -
995
            sizeof(dp_rcvhdr_t);
999
            sizeof(dp_rcvhdr_t);
996
 
1000
 
997
        /* Save read_iovec since we need it twice. */
1001
        /* Save read_iovec since we need it twice. */
998
        dep->de_tmp_iovec = dep->de_read_iovec;
1002
        dep->de_tmp_iovec = dep->de_read_iovec;
999
        (dep->de_nic2userf)(dep, page * DP_PAGESIZE +
1003
        (dep->de_nic2userf)(dep, page * DP_PAGESIZE +
1000
            sizeof(dp_rcvhdr_t), &dep->de_tmp_iovec, 0, count);
1004
            sizeof(dp_rcvhdr_t), &dep->de_tmp_iovec, 0, count);
1001
        (dep->de_nic2userf)(dep, dep->de_startpage * DP_PAGESIZE,
1005
        (dep->de_nic2userf)(dep, dep->de_startpage * DP_PAGESIZE,
1002
                &dep->de_read_iovec, count, length - count);
1006
                &dep->de_read_iovec, count, length - count);
1003
    }
1007
    }
1004
    else
1008
    else
1005
    {
1009
    {
1006
        (dep->de_nic2userf)(dep, page * DP_PAGESIZE +
1010
        (dep->de_nic2userf)(dep, page * DP_PAGESIZE +
1007
            sizeof(dp_rcvhdr_t), &dep->de_read_iovec, 0, length);
1011
            sizeof(dp_rcvhdr_t), &dep->de_read_iovec, 0, length);
1008
    }
1012
    }
1009
 
1013
 
1010
    dep->de_read_s = length;
1014
    dep->de_read_s = length;
1011
    dep->de_flags |= DEF_PACK_RECV;
1015
    dep->de_flags |= DEF_PACK_RECV;
1012
//  dep->de_flags &= ~DEF_READING;
1016
//  dep->de_flags &= ~DEF_READING;
1013
 
1017
 
1014
    queue = pq_add( dep->received_queue, packet, 0, 0 );
1018
    queue = pq_add( dep->received_queue, packet, 0, 0 );
1015
    if( queue ){
1019
    if( queue ){
1016
        dep->received_queue = queue;
1020
        dep->received_queue = queue;
1017
    }else{
1021
    }else{
1018
        netif_pq_release( packet_get_id( packet ));
1022
        netif_pq_release( packet_get_id( packet ));
1019
    }
1023
    }
1020
    return OK;
1024
    return OK;
1021
}
1025
}
1022
 
1026
 
1023
/*===========================================================================*
1027
/*===========================================================================*
1024
 *              dp_user2nic                  *
1028
 *              dp_user2nic                  *
1025
 *===========================================================================*/
1029
 *===========================================================================*/
1026
static void dp_user2nic(dep, iovp, offset, nic_addr, count)
1030
static void dp_user2nic(dep, iovp, offset, nic_addr, count)
1027
dpeth_t *dep;
1031
dpeth_t *dep;
1028
iovec_dat_t *iovp;
1032
iovec_dat_t *iovp;
1029
vir_bytes offset;
1033
vir_bytes offset;
1030
int nic_addr;
1034
int nic_addr;
1031
vir_bytes count;
1035
vir_bytes count;
1032
{
1036
{
1033
    vir_bytes vir_hw;//, vir_user;
1037
    vir_bytes vir_hw;//, vir_user;
1034
    int bytes, i, r;
1038
    int bytes, i, r;
1035
 
1039
 
1036
    vir_hw = (vir_bytes)dep->de_locmem + nic_addr;
1040
    vir_hw = (vir_bytes)dep->de_locmem + nic_addr;
1037
 
1041
 
1038
    i= 0;
1042
    i= 0;
1039
    while (count > 0)
1043
    while (count > 0)
1040
    {
1044
    {
1041
        if (i >= IOVEC_NR)
1045
        if (i >= IOVEC_NR)
1042
        {
1046
        {
1043
            dp_next_iovec(iovp);
1047
            dp_next_iovec(iovp);
1044
            i= 0;
1048
            i= 0;
1045
            continue;
1049
            continue;
1046
        }
1050
        }
1047
        assert(i < iovp->iod_iovec_s);
1051
        assert(i < iovp->iod_iovec_s);
1048
        if (offset >= iovp->iod_iovec[i].iov_size)
1052
        if (offset >= iovp->iod_iovec[i].iov_size)
1049
        {
1053
        {
1050
            offset -= iovp->iod_iovec[i].iov_size;
1054
            offset -= iovp->iod_iovec[i].iov_size;
1051
            i++;
1055
            i++;
1052
            continue;
1056
            continue;
1053
        }
1057
        }
1054
        bytes = iovp->iod_iovec[i].iov_size - offset;
1058
        bytes = iovp->iod_iovec[i].iov_size - offset;
1055
        if (bytes > count)
1059
        if (bytes > count)
1056
            bytes = count;
1060
            bytes = count;
1057
 
1061
 
1058
        r= sys_vircopy(iovp->iod_proc_nr, D,
1062
        r= sys_vircopy(iovp->iod_proc_nr, D,
1059
            iovp->iod_iovec[i].iov_addr + offset,
1063
            iovp->iod_iovec[i].iov_addr + offset,
1060
            SELF, D, vir_hw, bytes);
1064
            SELF, D, vir_hw, bytes);
1061
        if (r != OK)
1065
        if (r != OK)
1062
            panic("DP8390", "dp_user2nic: sys_vircopy failed", r);
1066
            panic("DP8390", "dp_user2nic: sys_vircopy failed", r);
1063
 
1067
 
1064
        count -= bytes;
1068
        count -= bytes;
1065
        vir_hw += bytes;
1069
        vir_hw += bytes;
1066
        offset += bytes;
1070
        offset += bytes;
1067
    }
1071
    }
1068
    assert(count == 0);
1072
    assert(count == 0);
1069
}
1073
}
1070
 
1074
 
1071
/*===========================================================================*
1075
/*===========================================================================*
1072
 *              dp_pio8_user2nic                 *
1076
 *              dp_pio8_user2nic                 *
1073
 *===========================================================================*/
1077
 *===========================================================================*/
1074
static void dp_pio8_user2nic(dep, iovp, offset, nic_addr, count)
1078
static void dp_pio8_user2nic(dep, iovp, offset, nic_addr, count)
1075
dpeth_t *dep;
1079
dpeth_t *dep;
1076
iovec_dat_t *iovp;
1080
iovec_dat_t *iovp;
1077
vir_bytes offset;
1081
vir_bytes offset;
1078
int nic_addr;
1082
int nic_addr;
1079
vir_bytes count;
1083
vir_bytes count;
1080
{
1084
{
1081
//  phys_bytes phys_user;
1085
//  phys_bytes phys_user;
1082
    int bytes, i;
1086
    int bytes, i;
1083
 
1087
 
1084
    outb_reg0(dep, DP_ISR, ISR_RDC);
1088
    outb_reg0(dep, DP_ISR, ISR_RDC);
1085
 
1089
 
1086
    outb_reg0(dep, DP_RBCR0, count & 0xFF);
1090
    outb_reg0(dep, DP_RBCR0, count & 0xFF);
1087
    outb_reg0(dep, DP_RBCR1, count >> 8);
1091
    outb_reg0(dep, DP_RBCR1, count >> 8);
1088
    outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF);
1092
    outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF);
1089
    outb_reg0(dep, DP_RSAR1, nic_addr >> 8);
1093
    outb_reg0(dep, DP_RSAR1, nic_addr >> 8);
1090
    outb_reg0(dep, DP_CR, CR_DM_RW | CR_PS_P0 | CR_STA);
1094
    outb_reg0(dep, DP_CR, CR_DM_RW | CR_PS_P0 | CR_STA);
1091
 
1095
 
1092
    i= 0;
1096
    i= 0;
1093
    while (count > 0)
1097
    while (count > 0)
1094
    {
1098
    {
1095
        if (i >= IOVEC_NR)
1099
        if (i >= IOVEC_NR)
1096
        {
1100
        {
1097
            dp_next_iovec(iovp);
1101
            dp_next_iovec(iovp);
1098
            i= 0;
1102
            i= 0;
1099
            continue;
1103
            continue;
1100
        }
1104
        }
1101
        assert(i < iovp->iod_iovec_s);
1105
        assert(i < iovp->iod_iovec_s);
1102
        if (offset >= iovp->iod_iovec[i].iov_size)
1106
        if (offset >= iovp->iod_iovec[i].iov_size)
1103
        {
1107
        {
1104
            offset -= iovp->iod_iovec[i].iov_size;
1108
            offset -= iovp->iod_iovec[i].iov_size;
1105
            i++;
1109
            i++;
1106
            continue;
1110
            continue;
1107
        }
1111
        }
1108
        bytes = iovp->iod_iovec[i].iov_size - offset;
1112
        bytes = iovp->iod_iovec[i].iov_size - offset;
1109
        if (bytes > count)
1113
        if (bytes > count)
1110
            bytes = count;
1114
            bytes = count;
1111
 
1115
 
1112
        do_vir_outsb(dep->de_data_port, iovp->iod_proc_nr,
1116
        do_vir_outsb(dep->de_data_port, iovp->iod_proc_nr,
1113
            iovp->iod_iovec[i].iov_addr + offset, bytes);
1117
            iovp->iod_iovec[i].iov_addr + offset, bytes);
1114
        count -= bytes;
1118
        count -= bytes;
1115
        offset += bytes;
1119
        offset += bytes;
1116
    }
1120
    }
1117
    assert(count == 0);
1121
    assert(count == 0);
1118
 
1122
 
1119
    for (i= 0; i<100; i++)
1123
    for (i= 0; i<100; i++)
1120
    {
1124
    {
1121
        if (inb_reg0(dep, DP_ISR) & ISR_RDC)
1125
        if (inb_reg0(dep, DP_ISR) & ISR_RDC)
1122
            break;
1126
            break;
1123
    }
1127
    }
1124
    if (i == 100)
1128
    if (i == 100)
1125
    {
1129
    {
1126
        panic("", "dp8390: remote dma failed to complete", NO_NUM);
1130
        panic("", "dp8390: remote dma failed to complete", NO_NUM);
1127
    }
1131
    }
1128
}
1132
}
1129
 
1133
 
1130
/*===========================================================================*
1134
/*===========================================================================*
1131
 *              dp_pio16_user2nic                *
1135
 *              dp_pio16_user2nic                *
1132
 *===========================================================================*/
1136
 *===========================================================================*/
1133
static void dp_pio16_user2nic(dep, iovp, offset, nic_addr, count)
1137
static void dp_pio16_user2nic(dep, iovp, offset, nic_addr, count)
1134
dpeth_t *dep;
1138
dpeth_t *dep;
1135
iovec_dat_t *iovp;
1139
iovec_dat_t *iovp;
1136
vir_bytes offset;
1140
vir_bytes offset;
1137
int nic_addr;
1141
int nic_addr;
1138
vir_bytes count;
1142
vir_bytes count;
1139
{
1143
{
1140
    vir_bytes vir_user;
1144
    vir_bytes vir_user;
1141
    vir_bytes ecount;
1145
    vir_bytes ecount;
1142
    int i, r, bytes, user_proc;
1146
    int i, r, bytes, user_proc;
1143
    u8_t two_bytes[2];
1147
    u8_t two_bytes[2];
1144
    int odd_byte;
1148
    int odd_byte;
1145
 
1149
 
1146
    ecount= (count+1) & ~1;
1150
    ecount= (count+1) & ~1;
1147
    odd_byte= 0;
1151
    odd_byte= 0;
1148
 
1152
 
1149
    outb_reg0(dep, DP_ISR, ISR_RDC);
1153
    outb_reg0(dep, DP_ISR, ISR_RDC);
1150
    outb_reg0(dep, DP_RBCR0, ecount & 0xFF);
1154
    outb_reg0(dep, DP_RBCR0, ecount & 0xFF);
1151
    outb_reg0(dep, DP_RBCR1, ecount >> 8);
1155
    outb_reg0(dep, DP_RBCR1, ecount >> 8);
1152
    outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF);
1156
    outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF);
1153
    outb_reg0(dep, DP_RSAR1, nic_addr >> 8);
1157
    outb_reg0(dep, DP_RSAR1, nic_addr >> 8);
1154
    outb_reg0(dep, DP_CR, CR_DM_RW | CR_PS_P0 | CR_STA);
1158
    outb_reg0(dep, DP_CR, CR_DM_RW | CR_PS_P0 | CR_STA);
1155
 
1159
 
1156
    i= 0;
1160
    i= 0;
1157
    while (count > 0)
1161
    while (count > 0)
1158
    {
1162
    {
1159
        if (i >= IOVEC_NR)
1163
        if (i >= IOVEC_NR)
1160
        {
1164
        {
1161
            dp_next_iovec(iovp);
1165
            dp_next_iovec(iovp);
1162
            i= 0;
1166
            i= 0;
1163
            continue;
1167
            continue;
1164
        }
1168
        }
1165
        assert(i < iovp->iod_iovec_s);
1169
        assert(i < iovp->iod_iovec_s);
1166
        if (offset >= iovp->iod_iovec[i].iov_size)
1170
        if (offset >= iovp->iod_iovec[i].iov_size)
1167
        {
1171
        {
1168
            offset -= iovp->iod_iovec[i].iov_size;
1172
            offset -= iovp->iod_iovec[i].iov_size;
1169
            i++;
1173
            i++;
1170
            continue;
1174
            continue;
1171
        }
1175
        }
1172
        bytes = iovp->iod_iovec[i].iov_size - offset;
1176
        bytes = iovp->iod_iovec[i].iov_size - offset;
1173
        if (bytes > count)
1177
        if (bytes > count)
1174
            bytes = count;
1178
            bytes = count;
1175
 
1179
 
1176
        user_proc= iovp->iod_proc_nr;
1180
        user_proc= iovp->iod_proc_nr;
1177
        vir_user= iovp->iod_iovec[i].iov_addr + offset;
1181
        vir_user= iovp->iod_iovec[i].iov_addr + offset;
1178
        if (odd_byte)
1182
        if (odd_byte)
1179
        {
1183
        {
1180
            r= sys_vircopy(user_proc, D, vir_user,
1184
            r= sys_vircopy(user_proc, D, vir_user,
1181
                SELF, D, (vir_bytes)&two_bytes[1], 1);
1185
                SELF, D, (vir_bytes)&two_bytes[1], 1);
1182
            if (r != OK)
1186
            if (r != OK)
1183
            {
1187
            {
1184
                panic("DP8390",
1188
                panic("DP8390",
1185
                    "dp_pio16_user2nic: sys_vircopy failed",
1189
                    "dp_pio16_user2nic: sys_vircopy failed",
1186
                    r);
1190
                    r);
1187
            }
1191
            }
1188
            outw(dep->de_data_port, *(u16_t *)two_bytes);
1192
            outw(dep->de_data_port, *(u16_t *)two_bytes);
1189
            count--;
1193
            count--;
1190
            offset++;
1194
            offset++;
1191
            bytes--;
1195
            bytes--;
1192
            vir_user++;
1196
            vir_user++;
1193
            odd_byte= 0;
1197
            odd_byte= 0;
1194
            if (!bytes)
1198
            if (!bytes)
1195
                continue;
1199
                continue;
1196
        }
1200
        }
1197
        ecount= bytes & ~1;
1201
        ecount= bytes & ~1;
1198
        if (ecount != 0)
1202
        if (ecount != 0)
1199
        {
1203
        {
1200
            do_vir_outsw(dep->de_data_port, user_proc, vir_user,
1204
            do_vir_outsw(dep->de_data_port, user_proc, vir_user,
1201
                ecount);
1205
                ecount);
1202
            count -= ecount;
1206
            count -= ecount;
1203
            offset += ecount;
1207
            offset += ecount;
1204
            bytes -= ecount;
1208
            bytes -= ecount;
1205
            vir_user += ecount;
1209
            vir_user += ecount;
1206
        }
1210
        }
1207
        if (bytes)
1211
        if (bytes)
1208
        {
1212
        {
1209
            assert(bytes == 1);
1213
            assert(bytes == 1);
1210
            r= sys_vircopy(user_proc, D, vir_user,
1214
            r= sys_vircopy(user_proc, D, vir_user,
1211
                SELF, D, (vir_bytes)&two_bytes[0], 1);
1215
                SELF, D, (vir_bytes)&two_bytes[0], 1);
1212
            if (r != OK)
1216
            if (r != OK)
1213
            {
1217
            {
1214
                panic("DP8390",
1218
                panic("DP8390",
1215
                    "dp_pio16_user2nic: sys_vircopy failed",
1219
                    "dp_pio16_user2nic: sys_vircopy failed",
1216
                    r);
1220
                    r);
1217
            }
1221
            }
1218
            count--;
1222
            count--;
1219
            offset++;
1223
            offset++;
1220
            bytes--;
1224
            bytes--;
1221
            vir_user++;
1225
            vir_user++;
1222
            odd_byte= 1;
1226
            odd_byte= 1;
1223
        }
1227
        }
1224
    }
1228
    }
1225
    assert(count == 0);
1229
    assert(count == 0);
1226
 
1230
 
1227
    if (odd_byte)
1231
    if (odd_byte)
1228
        outw(dep->de_data_port, *(u16_t *)two_bytes);
1232
        outw(dep->de_data_port, *(u16_t *)two_bytes);
1229
 
1233
 
1230
    for (i= 0; i<100; i++)
1234
    for (i= 0; i<100; i++)
1231
    {
1235
    {
1232
        if (inb_reg0(dep, DP_ISR) & ISR_RDC)
1236
        if (inb_reg0(dep, DP_ISR) & ISR_RDC)
1233
            break;
1237
            break;
1234
    }
1238
    }
1235
    if (i == 100)
1239
    if (i == 100)
1236
    {
1240
    {
1237
        panic("", "dp8390: remote dma failed to complete", NO_NUM);
1241
        panic("", "dp8390: remote dma failed to complete", NO_NUM);
1238
    }
1242
    }
1239
}
1243
}
1240
 
1244
 
1241
/*===========================================================================*
1245
/*===========================================================================*
1242
 *              dp_nic2user                  *
1246
 *              dp_nic2user                  *
1243
 *===========================================================================*/
1247
 *===========================================================================*/
1244
static void dp_nic2user(dep, nic_addr, iovp, offset, count)
1248
static void dp_nic2user(dep, nic_addr, iovp, offset, count)
1245
dpeth_t *dep;
1249
dpeth_t *dep;
1246
int nic_addr;
1250
int nic_addr;
1247
iovec_dat_t *iovp;
1251
iovec_dat_t *iovp;
1248
vir_bytes offset;
1252
vir_bytes offset;
1249
vir_bytes count;
1253
vir_bytes count;
1250
{
1254
{
1251
    vir_bytes vir_hw;//, vir_user;
1255
    vir_bytes vir_hw;//, vir_user;
1252
    int bytes, i, r;
1256
    int bytes, i, r;
1253
 
1257
 
1254
    vir_hw = (vir_bytes)dep->de_locmem + nic_addr;
1258
    vir_hw = (vir_bytes)dep->de_locmem + nic_addr;
1255
 
1259
 
1256
    i= 0;
1260
    i= 0;
1257
    while (count > 0)
1261
    while (count > 0)
1258
    {
1262
    {
1259
        if (i >= IOVEC_NR)
1263
        if (i >= IOVEC_NR)
1260
        {
1264
        {
1261
            dp_next_iovec(iovp);
1265
            dp_next_iovec(iovp);
1262
            i= 0;
1266
            i= 0;
1263
            continue;
1267
            continue;
1264
        }
1268
        }
1265
        assert(i < iovp->iod_iovec_s);
1269
        assert(i < iovp->iod_iovec_s);
1266
        if (offset >= iovp->iod_iovec[i].iov_size)
1270
        if (offset >= iovp->iod_iovec[i].iov_size)
1267
        {
1271
        {
1268
            offset -= iovp->iod_iovec[i].iov_size;
1272
            offset -= iovp->iod_iovec[i].iov_size;
1269
            i++;
1273
            i++;
1270
            continue;
1274
            continue;
1271
        }
1275
        }
1272
        bytes = iovp->iod_iovec[i].iov_size - offset;
1276
        bytes = iovp->iod_iovec[i].iov_size - offset;
1273
        if (bytes > count)
1277
        if (bytes > count)
1274
            bytes = count;
1278
            bytes = count;
1275
 
1279
 
1276
        r= sys_vircopy(SELF, D, vir_hw,
1280
        r= sys_vircopy(SELF, D, vir_hw,
1277
            iovp->iod_proc_nr, D,
1281
            iovp->iod_proc_nr, D,
1278
            iovp->iod_iovec[i].iov_addr + offset, bytes);
1282
            iovp->iod_iovec[i].iov_addr + offset, bytes);
1279
        if (r != OK)
1283
        if (r != OK)
1280
            panic("DP8390", "dp_nic2user: sys_vircopy failed", r);
1284
            panic("DP8390", "dp_nic2user: sys_vircopy failed", r);
1281
 
1285
 
1282
        count -= bytes;
1286
        count -= bytes;
1283
        vir_hw += bytes;
1287
        vir_hw += bytes;
1284
        offset += bytes;
1288
        offset += bytes;
1285
    }
1289
    }
1286
    assert(count == 0);
1290
    assert(count == 0);
1287
}
1291
}
1288
 
1292
 
1289
/*===========================================================================*
1293
/*===========================================================================*
1290
 *              dp_pio8_nic2user                 *
1294
 *              dp_pio8_nic2user                 *
1291
 *===========================================================================*/
1295
 *===========================================================================*/
1292
static void dp_pio8_nic2user(dep, nic_addr, iovp, offset, count)
1296
static void dp_pio8_nic2user(dep, nic_addr, iovp, offset, count)
1293
dpeth_t *dep;
1297
dpeth_t *dep;
1294
int nic_addr;
1298
int nic_addr;
1295
iovec_dat_t *iovp;
1299
iovec_dat_t *iovp;
1296
vir_bytes offset;
1300
vir_bytes offset;
1297
vir_bytes count;
1301
vir_bytes count;
1298
{
1302
{
1299
//  phys_bytes phys_user;
1303
//  phys_bytes phys_user;
1300
    int bytes, i;
1304
    int bytes, i;
1301
 
1305
 
1302
    outb_reg0(dep, DP_RBCR0, count & 0xFF);
1306
    outb_reg0(dep, DP_RBCR0, count & 0xFF);
1303
    outb_reg0(dep, DP_RBCR1, count >> 8);
1307
    outb_reg0(dep, DP_RBCR1, count >> 8);
1304
    outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF);
1308
    outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF);
1305
    outb_reg0(dep, DP_RSAR1, nic_addr >> 8);
1309
    outb_reg0(dep, DP_RSAR1, nic_addr >> 8);
1306
    outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA);
1310
    outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA);
1307
 
1311
 
1308
    i= 0;
1312
    i= 0;
1309
    while (count > 0)
1313
    while (count > 0)
1310
    {
1314
    {
1311
        if (i >= IOVEC_NR)
1315
        if (i >= IOVEC_NR)
1312
        {
1316
        {
1313
            dp_next_iovec(iovp);
1317
            dp_next_iovec(iovp);
1314
            i= 0;
1318
            i= 0;
1315
            continue;
1319
            continue;
1316
        }
1320
        }
1317
        assert(i < iovp->iod_iovec_s);
1321
        assert(i < iovp->iod_iovec_s);
1318
        if (offset >= iovp->iod_iovec[i].iov_size)
1322
        if (offset >= iovp->iod_iovec[i].iov_size)
1319
        {
1323
        {
1320
            offset -= iovp->iod_iovec[i].iov_size;
1324
            offset -= iovp->iod_iovec[i].iov_size;
1321
            i++;
1325
            i++;
1322
            continue;
1326
            continue;
1323
        }
1327
        }
1324
        bytes = iovp->iod_iovec[i].iov_size - offset;
1328
        bytes = iovp->iod_iovec[i].iov_size - offset;
1325
        if (bytes > count)
1329
        if (bytes > count)
1326
            bytes = count;
1330
            bytes = count;
1327
 
1331
 
1328
        do_vir_insb(dep->de_data_port, iovp->iod_proc_nr,
1332
        do_vir_insb(dep->de_data_port, iovp->iod_proc_nr,
1329
            iovp->iod_iovec[i].iov_addr + offset, bytes);
1333
            iovp->iod_iovec[i].iov_addr + offset, bytes);
1330
        count -= bytes;
1334
        count -= bytes;
1331
        offset += bytes;
1335
        offset += bytes;
1332
    }
1336
    }
1333
    assert(count == 0);
1337
    assert(count == 0);
1334
}
1338
}
1335
 
1339
 
1336
/*===========================================================================*
1340
/*===========================================================================*
1337
 *              dp_pio16_nic2user                *
1341
 *              dp_pio16_nic2user                *
1338
 *===========================================================================*/
1342
 *===========================================================================*/
1339
static void dp_pio16_nic2user(dep, nic_addr, iovp, offset, count)
1343
static void dp_pio16_nic2user(dep, nic_addr, iovp, offset, count)
1340
dpeth_t *dep;
1344
dpeth_t *dep;
1341
int nic_addr;
1345
int nic_addr;
1342
iovec_dat_t *iovp;
1346
iovec_dat_t *iovp;
1343
vir_bytes offset;
1347
vir_bytes offset;
1344
vir_bytes count;
1348
vir_bytes count;
1345
{
1349
{
1346
    vir_bytes vir_user;
1350
    vir_bytes vir_user;
1347
    vir_bytes ecount;
1351
    vir_bytes ecount;
1348
    int i, r, bytes, user_proc;
1352
    int i, r, bytes, user_proc;
1349
    u8_t two_bytes[2];
1353
    u8_t two_bytes[2];
1350
    int odd_byte;
1354
    int odd_byte;
1351
 
1355
 
1352
    ecount= (count+1) & ~1;
1356
    ecount= (count+1) & ~1;
1353
    odd_byte= 0;
1357
    odd_byte= 0;
1354
 
1358
 
1355
    outb_reg0(dep, DP_RBCR0, ecount & 0xFF);
1359
    outb_reg0(dep, DP_RBCR0, ecount & 0xFF);
1356
    outb_reg0(dep, DP_RBCR1, ecount >> 8);
1360
    outb_reg0(dep, DP_RBCR1, ecount >> 8);
1357
    outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF);
1361
    outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF);
1358
    outb_reg0(dep, DP_RSAR1, nic_addr >> 8);
1362
    outb_reg0(dep, DP_RSAR1, nic_addr >> 8);
1359
    outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA);
1363
    outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA);
1360
 
1364
 
1361
    i= 0;
1365
    i= 0;
1362
    while (count > 0)
1366
    while (count > 0)
1363
    {
1367
    {
1364
        if (i >= IOVEC_NR)
1368
        if (i >= IOVEC_NR)
1365
        {
1369
        {
1366
            dp_next_iovec(iovp);
1370
            dp_next_iovec(iovp);
1367
            i= 0;
1371
            i= 0;
1368
            continue;
1372
            continue;
1369
        }
1373
        }
1370
        assert(i < iovp->iod_iovec_s);
1374
        assert(i < iovp->iod_iovec_s);
1371
        if (offset >= iovp->iod_iovec[i].iov_size)
1375
        if (offset >= iovp->iod_iovec[i].iov_size)
1372
        {
1376
        {
1373
            offset -= iovp->iod_iovec[i].iov_size;
1377
            offset -= iovp->iod_iovec[i].iov_size;
1374
            i++;
1378
            i++;
1375
            continue;
1379
            continue;
1376
        }
1380
        }
1377
        bytes = iovp->iod_iovec[i].iov_size - offset;
1381
        bytes = iovp->iod_iovec[i].iov_size - offset;
1378
        if (bytes > count)
1382
        if (bytes > count)
1379
            bytes = count;
1383
            bytes = count;
1380
 
1384
 
1381
        user_proc= iovp->iod_proc_nr;
1385
        user_proc= iovp->iod_proc_nr;
1382
        vir_user= iovp->iod_iovec[i].iov_addr + offset;
1386
        vir_user= iovp->iod_iovec[i].iov_addr + offset;
1383
        if (odd_byte)
1387
        if (odd_byte)
1384
        {
1388
        {
1385
            r= sys_vircopy(SELF, D, (vir_bytes)&two_bytes[1],
1389
            r= sys_vircopy(SELF, D, (vir_bytes)&two_bytes[1],
1386
                user_proc, D, vir_user,  1);
1390
                user_proc, D, vir_user,  1);
1387
            if (r != OK)
1391
            if (r != OK)
1388
            {
1392
            {
1389
                panic("DP8390",
1393
                panic("DP8390",
1390
                    "dp_pio16_nic2user: sys_vircopy failed",
1394
                    "dp_pio16_nic2user: sys_vircopy failed",
1391
                    r);
1395
                    r);
1392
            }
1396
            }
1393
            count--;
1397
            count--;
1394
            offset++;
1398
            offset++;
1395
            bytes--;
1399
            bytes--;
1396
            vir_user++;
1400
            vir_user++;
1397
            odd_byte= 0;
1401
            odd_byte= 0;
1398
            if (!bytes)
1402
            if (!bytes)
1399
                continue;
1403
                continue;
1400
        }
1404
        }
1401
        ecount= bytes & ~1;
1405
        ecount= bytes & ~1;
1402
        if (ecount != 0)
1406
        if (ecount != 0)
1403
        {
1407
        {
1404
            do_vir_insw(dep->de_data_port, user_proc, vir_user,
1408
            do_vir_insw(dep->de_data_port, user_proc, vir_user,
1405
                ecount);
1409
                ecount);
1406
            count -= ecount;
1410
            count -= ecount;
1407
            offset += ecount;
1411
            offset += ecount;
1408
            bytes -= ecount;
1412
            bytes -= ecount;
1409
            vir_user += ecount;
1413
            vir_user += ecount;
1410
        }
1414
        }
1411
        if (bytes)
1415
        if (bytes)
1412
        {
1416
        {
1413
            assert(bytes == 1);
1417
            assert(bytes == 1);
1414
            *(u16_t *)two_bytes= inw(dep->de_data_port);
1418
            *(u16_t *)two_bytes= inw(dep->de_data_port);
1415
            r= sys_vircopy(SELF, D, (vir_bytes)&two_bytes[0],
1419
            r= sys_vircopy(SELF, D, (vir_bytes)&two_bytes[0],
1416
                user_proc, D, vir_user,  1);
1420
                user_proc, D, vir_user,  1);
1417
            if (r != OK)
1421
            if (r != OK)
1418
            {
1422
            {
1419
                panic("DP8390",
1423
                panic("DP8390",
1420
                    "dp_pio16_nic2user: sys_vircopy failed",
1424
                    "dp_pio16_nic2user: sys_vircopy failed",
1421
                    r);
1425
                    r);
1422
            }
1426
            }
1423
            count--;
1427
            count--;
1424
            offset++;
1428
            offset++;
1425
            bytes--;
1429
            bytes--;
1426
            vir_user++;
1430
            vir_user++;
1427
            odd_byte= 1;
1431
            odd_byte= 1;
1428
        }
1432
        }
1429
    }
1433
    }
1430
    assert(count == 0);
1434
    assert(count == 0);
1431
}
1435
}
1432
 
1436
 
1433
/*===========================================================================*
1437
/*===========================================================================*
1434
 *              dp_next_iovec                    *
1438
 *              dp_next_iovec                    *
1435
 *===========================================================================*/
1439
 *===========================================================================*/
1436
static void dp_next_iovec(iovp)
1440
static void dp_next_iovec(iovp)
1437
iovec_dat_t *iovp;
1441
iovec_dat_t *iovp;
1438
{
1442
{
1439
    assert(iovp->iod_iovec_s > IOVEC_NR);
1443
    assert(iovp->iod_iovec_s > IOVEC_NR);
1440
 
1444
 
1441
    iovp->iod_iovec_s -= IOVEC_NR;
1445
    iovp->iod_iovec_s -= IOVEC_NR;
1442
 
1446
 
1443
    iovp->iod_iovec_addr += IOVEC_NR * sizeof(iovec_t);
1447
    iovp->iod_iovec_addr += IOVEC_NR * sizeof(iovec_t);
1444
 
1448
 
1445
    get_userdata(iovp->iod_proc_nr, iovp->iod_iovec_addr,
1449
    get_userdata(iovp->iod_proc_nr, iovp->iod_iovec_addr,
1446
        (iovp->iod_iovec_s > IOVEC_NR ? IOVEC_NR : iovp->iod_iovec_s) *
1450
        (iovp->iod_iovec_s > IOVEC_NR ? IOVEC_NR : iovp->iod_iovec_s) *
1447
        sizeof(iovec_t), iovp->iod_iovec);
1451
        sizeof(iovec_t), iovp->iod_iovec);
1448
}
1452
}
1449
 
1453
 
1450
/*===========================================================================*
1454
/*===========================================================================*
1451
 *              conf_hw                      *
1455
 *              conf_hw                      *
1452
 *===========================================================================*/
1456
 *===========================================================================*/
1453
static void conf_hw(dep)
1457
static void conf_hw(dep)
1454
dpeth_t *dep;
1458
dpeth_t *dep;
1455
{
1459
{
1456
//  static eth_stat_t empty_stat = {0, 0, 0, 0, 0, 0    /* ,... */ };
1460
//  static eth_stat_t empty_stat = {0, 0, 0, 0, 0, 0    /* ,... */ };
1457
 
1461
 
1458
//  int ifnr;
1462
//  int ifnr;
1459
//  dp_conf_t *dcp;
1463
//  dp_conf_t *dcp;
1460
 
1464
 
1461
//  dep->de_mode= DEM_DISABLED; /* Superfluous */
1465
//  dep->de_mode= DEM_DISABLED; /* Superfluous */
1462
//  ifnr= dep-de_table;
1466
//  ifnr= dep-de_table;
1463
 
1467
 
1464
//  dcp= &dp_conf[ifnr];
1468
//  dcp= &dp_conf[ifnr];
1465
//  update_conf(dep, dcp);
1469
//  update_conf(dep, dcp);
1466
//  if (dep->de_mode != DEM_ENABLED)
1470
//  if (dep->de_mode != DEM_ENABLED)
1467
//      return;
1471
//      return;
1468
    if (!wdeth_probe(dep) && !ne_probe(dep) && !el2_probe(dep))
1472
    if (!wdeth_probe(dep) && !ne_probe(dep) && !el2_probe(dep))
1469
    {
1473
    {
1470
        printf("%s: No ethernet card found at 0x%x\n",
1474
        printf("%s: No ethernet card found at 0x%x\n",
1471
            dep->de_name, dep->de_base_port);
1475
            dep->de_name, dep->de_base_port);
1472
        dep->de_mode= DEM_DISABLED;
1476
        dep->de_mode= DEM_DISABLED;
1473
        return;
1477
        return;
1474
    }
1478
    }
1475
 
1479
 
1476
/* XXX */ if (dep->de_linmem == 0) dep->de_linmem= 0xFFFF0000;
1480
/* XXX */ if (dep->de_linmem == 0) dep->de_linmem= 0xFFFF0000;
1477
 
1481
 
1478
    dep->de_mode = DEM_ENABLED;
1482
    dep->de_mode = DEM_ENABLED;
1479
 
1483
 
1480
    dep->de_flags = DEF_EMPTY;
1484
    dep->de_flags = DEF_EMPTY;
1481
//  dep->de_stat = empty_stat;
1485
//  dep->de_stat = empty_stat;
1482
}
1486
}
1483
 
1487
 
1484
/*===========================================================================*
1488
/*===========================================================================*
1485
 *              map_hw_buffer                    *
1489
 *              map_hw_buffer                    *
1486
 *===========================================================================*/
1490
 *===========================================================================*/
1487
static void map_hw_buffer(dep)
1491
static void map_hw_buffer(dep)
1488
dpeth_t *dep;
1492
dpeth_t *dep;
1489
{
1493
{
1490
//  int r;
1494
//  int r;
1491
//  size_t o, size;
1495
//  size_t o, size;
1492
//  char *buf, *abuf;
1496
//  char *buf, *abuf;
1493
 
1497
 
1494
    if (dep->de_prog_IO)
1498
    if (dep->de_prog_IO)
1495
    {
1499
    {
1496
#if 0
1500
#if 0
1497
        if(debug){
1501
        if(debug){
1498
            printf(
1502
            printf(
1499
            "map_hw_buffer: programmed I/O, no need to map buffer\n");
1503
            "map_hw_buffer: programmed I/O, no need to map buffer\n");
1500
        }
1504
        }
1501
#endif
1505
#endif
1502
        dep->de_locmem = (char *)-dep->de_ramsize; /* trap errors */
1506
        dep->de_locmem = (char *)-dep->de_ramsize; /* trap errors */
1503
        return;
1507
        return;
1504
    }else{
1508
    }else{
1505
        printf( "map_hw_buffer: no buffer!\n" );
1509
        printf( "map_hw_buffer: no buffer!\n" );
1506
    }
1510
    }
1507
 
1511
 
1508
//  size = dep->de_ramsize + PAGE_SIZE; /* Add PAGE_SIZE for
1512
//  size = dep->de_ramsize + PAGE_SIZE; /* Add PAGE_SIZE for
1509
//                       * alignment
1513
//                       * alignment
1510
//                       */
1514
//                       */
1511
//  buf= malloc(size);
1515
//  buf= malloc(size);
1512
//  if (buf == NULL)
1516
//  if (buf == NULL)
1513
//      panic(__FILE__, "map_hw_buffer: cannot malloc size", size);
1517
//      panic(__FILE__, "map_hw_buffer: cannot malloc size", size);
1514
//  o= PAGE_SIZE - ((vir_bytes)buf % PAGE_SIZE);
1518
//  o= PAGE_SIZE - ((vir_bytes)buf % PAGE_SIZE);
1515
//  abuf= buf + o;
1519
//  abuf= buf + o;
1516
//  printf("buf at 0x%x, abuf at 0x%x\n", buf, abuf);
1520
//  printf("buf at 0x%x, abuf at 0x%x\n", buf, abuf);
1517
 
1521
 
1518
//  r= sys_vm_map(SELF, 1 /* map */, (vir_bytes)abuf,
1522
//  r= sys_vm_map(SELF, 1 /* map */, (vir_bytes)abuf,
1519
//          dep->de_ramsize, (phys_bytes)dep->de_linmem);
1523
//          dep->de_ramsize, (phys_bytes)dep->de_linmem);
1520
//  if (r != OK)
1524
//  if (r != OK)
1521
//      panic(__FILE__, "map_hw_buffer: sys_vm_map failed", r);
1525
//      panic(__FILE__, "map_hw_buffer: sys_vm_map failed", r);
1522
//  dep->de_locmem = abuf;
1526
//  dep->de_locmem = abuf;
1523
}
1527
}
1524
 
1528
 
1525
/*===========================================================================*
1529
/*===========================================================================*
1526
 *              reply                        *
1530
 *              reply                        *
1527
 *===========================================================================*/
1531
 *===========================================================================*/
1528
static void reply(dep, err, may_block)
1532
static void reply(dep, err, may_block)
1529
dpeth_t *dep;
1533
dpeth_t *dep;
1530
int err;
1534
int err;
1531
int may_block;
1535
int may_block;
1532
{
1536
{
1533
/*  message reply;
1537
/*  message reply;
1534
    int status;
1538
    int status;
1535
    int r;
1539
    int r;
1536
 
1540
 
1537
    status = 0;
1541
    status = 0;
1538
    if (dep->de_flags & DEF_PACK_SEND)
1542
    if (dep->de_flags & DEF_PACK_SEND)
1539
        status |= DL_PACK_SEND;
1543
        status |= DL_PACK_SEND;
1540
    if (dep->de_flags & DEF_PACK_RECV)
1544
    if (dep->de_flags & DEF_PACK_RECV)
1541
        status |= DL_PACK_RECV;
1545
        status |= DL_PACK_RECV;
1542
 
1546
 
1543
    reply.m_type = DL_TASK_REPLY;
1547
    reply.m_type = DL_TASK_REPLY;
1544
    reply.DL_PORT = dep - de_table;
1548
    reply.DL_PORT = dep - de_table;
1545
    reply.DL_PROC = dep->de_client;
1549
    reply.DL_PROC = dep->de_client;
1546
    reply.DL_STAT = status | ((u32_t) err << 16);
1550
    reply.DL_STAT = status | ((u32_t) err << 16);
1547
    reply.DL_COUNT = dep->de_read_s;
1551
    reply.DL_COUNT = dep->de_read_s;
1548
    reply.DL_CLCK = 0;  *//* Don't know */
1552
    reply.DL_CLCK = 0;  *//* Don't know */
1549
/*  r= send(dep->de_client, &reply);
1553
/*  r= send(dep->de_client, &reply);
1550
 
1554
 
1551
    if (r == ELOCKED && may_block)
1555
    if (r == ELOCKED && may_block)
1552
    {
1556
    {
1553
#if 0
1557
#if 0
1554
        printf("send locked\n");
1558
        printf("send locked\n");
1555
#endif
1559
#endif
1556
        return;
1560
        return;
1557
    }
1561
    }
1558
 
1562
 
1559
    if (r < 0)
1563
    if (r < 0)
1560
        panic("", "dp8390: send failed:", r);
1564
        panic("", "dp8390: send failed:", r);
1561
   
1565
   
1562
*/  dep->de_read_s = 0;
1566
*/  dep->de_read_s = 0;
1563
//  dep->de_flags &= ~(DEF_PACK_SEND | DEF_PACK_RECV);
1567
//  dep->de_flags &= ~(DEF_PACK_SEND | DEF_PACK_RECV);
1564
}
1568
}
1565
 
1569
 
1566
/*===========================================================================*
1570
/*===========================================================================*
1567
 *              get_userdata                     *
1571
 *              get_userdata                     *
1568
 *===========================================================================*/
1572
 *===========================================================================*/
1569
static void get_userdata(user_proc, user_addr, count, loc_addr)
1573
static void get_userdata(user_proc, user_addr, count, loc_addr)
1570
int user_proc;
1574
int user_proc;
1571
vir_bytes user_addr;
1575
vir_bytes user_addr;
1572
vir_bytes count;
1576
vir_bytes count;
1573
void *loc_addr;
1577
void *loc_addr;
1574
{
1578
{
1575
    int r;
1579
    int r;
1576
 
1580
 
1577
    r= sys_vircopy(user_proc, D, user_addr,
1581
    r= sys_vircopy(user_proc, D, user_addr,
1578
        SELF, D, (vir_bytes)loc_addr, count);
1582
        SELF, D, (vir_bytes)loc_addr, count);
1579
    if (r != OK)
1583
    if (r != OK)
1580
        panic("DP8390", "get_userdata: sys_vircopy failed", r);
1584
        panic("DP8390", "get_userdata: sys_vircopy failed", r);
1581
}
1585
}
1582
 
1586
 
1583
static void insb(port_t port, void *buf, size_t size)
1587
static void insb(port_t port, void *buf, size_t size)
1584
{
1588
{
1585
    size_t i;
1589
    size_t i;
1586
 
1590
 
1587
    for( i = 0; i < size; ++ i ){
1591
    for( i = 0; i < size; ++ i ){
1588
        *(( uint8_t * ) buf + i ) = inb( port );
1592
        *(( uint8_t * ) buf + i ) = inb( port );
1589
    }
1593
    }
1590
}
1594
}
1591
 
1595
 
1592
static void insw(port_t port, void *buf, size_t size)
1596
static void insw(port_t port, void *buf, size_t size)
1593
{
1597
{
1594
    size_t i;
1598
    size_t i;
1595
 
1599
 
1596
    for( i = 0; i * 2 < size; ++ i ){
1600
    for( i = 0; i * 2 < size; ++ i ){
1597
        *(( uint16_t * ) buf + i ) = inw( port );
1601
        *(( uint16_t * ) buf + i ) = inw( port );
1598
    }
1602
    }
1599
}
1603
}
1600
 
1604
 
1601
static void outsb(port_t port, void *buf, size_t size)
1605
static void outsb(port_t port, void *buf, size_t size)
1602
{
1606
{
1603
    size_t i;
1607
    size_t i;
1604
 
1608
 
1605
    for( i = 0; i < size; ++ i ){
1609
    for( i = 0; i < size; ++ i ){
1606
        outb( port, *(( uint8_t * ) buf + i ));
1610
        outb( port, *(( uint8_t * ) buf + i ));
1607
    }
1611
    }
1608
}
1612
}
1609
 
1613
 
1610
static void outsw(port_t port, void *buf, size_t size)
1614
static void outsw(port_t port, void *buf, size_t size)
1611
{
1615
{
1612
    size_t i;
1616
    size_t i;
1613
 
1617
 
1614
    for( i = 0; i * 2 < size; ++ i ){
1618
    for( i = 0; i * 2 < size; ++ i ){
1615
        outw( port, *(( uint16_t * ) buf + i ));
1619
        outw( port, *(( uint16_t * ) buf + i ));
1616
    }
1620
    }
1617
}
1621
}
1618
 
1622
 
1619
/*
1623
/*
1620
 * $PchId: dp8390.c,v 1.25 2005/02/10 17:32:07 philip Exp $
1624
 * $PchId: dp8390.c,v 1.25 2005/02/10 17:32:07 philip Exp $
1621
 */
1625
 */
1622
 
1626
 
1623
/** @}
1627
/** @}
1624
 */
1628
 */
1625
 
1629