Subversion Repositories HelenOS

Rev

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

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