Subversion Repositories HelenOS

Rev

Rev 4743 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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