Subversion Repositories HelenOS

Rev

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

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