Giovanni's fixes to dpeth:

Date: Sat, 03 Sep 2005 11:05:22 +0200
Subject: Minix 3.0.8
This commit is contained in:
Ben Gras 2005-09-04 18:52:16 +00:00
parent a32fa468f3
commit becc8c1a6b
3 changed files with 41 additions and 26 deletions

View File

@ -25,6 +25,13 @@
#include "8390.h"
#define sys_nic2mem(srcOffs,dstProc,dstOffs,length) \
sys_vircopy(SELF,dep->de_memsegm,(vir_bytes)(srcOffs),\
(dstProc),D,(vir_bytes)(dstOffs),length)
#define sys_user2nic(srcProc,srcOffs,dstOffs,length) \
sys_vircopy((srcProc),D,(vir_bytes)(srcOffs),\
SELF,dep->de_memsegm,(vir_bytes)(dstOffs),length)
static const char RdmaErrMsg[] = "remote dma failed to complete";
/*
@ -65,9 +72,8 @@ static void ns_start_xmit(dpeth_t * dep, int size, int pageno)
*/
static void mem_getblock(dpeth_t *dep, u16_t offset, int size, void *dst)
{
sys_datacopy(dep->de_memsegm, dep->de_linmem + offset,
SELF, (vir_bytes)dst, size);
sys_nic2mem(dep->de_linmem + offset, SELF, dst, size);
return;
}
@ -94,16 +100,16 @@ static void mem_nic2user(dpeth_t * dep, int pageno, int pktsize)
/* Circular buffer wrap-around */
bytes = dep->de_stoppage * DP_PAGESIZE - offset;
sys_datacopy(dep->de_memsegm, dep->de_linmem + offset,
iovp->iod_proc_nr, iovp->iod_iovec[ix].iov_addr, bytes);
sys_nic2mem(dep->de_linmem + offset, iovp->iod_proc_nr,
iovp->iod_iovec[ix].iov_addr, bytes);
pktsize -= bytes;
phys_user += bytes;
bytes = iovp->iod_iovec[ix].iov_size - bytes;
if (bytes > pktsize) bytes = pktsize;
offset = dep->de_startpage * DP_PAGESIZE;
}
sys_datacopy(dep->de_memsegm, dep->de_linmem + offset,
iovp->iod_proc_nr, iovp->iod_iovec[ix].iov_addr, bytes);
sys_nic2mem(dep->de_linmem + offset, iovp->iod_proc_nr,
iovp->iod_iovec[ix].iov_addr, bytes);
offset += bytes;
if (++ix >= IOVEC_NR) { /* Next buffer of IO vector */
@ -126,7 +132,7 @@ static void mem_user2nic(dpeth_t *dep, int pageno, int pktsize)
int bytes, ix = 0;
/* Computes shared memory address */
offset = dep->de_linmem + pageno * DP_PAGESIZE;
offset = pageno * DP_PAGESIZE;
do { /* Reads chuncks of packet from user area */
@ -134,8 +140,8 @@ static void mem_user2nic(dpeth_t *dep, int pageno, int pktsize)
if (bytes > pktsize) bytes = pktsize;
/* Reads from user area to board (shared memory) */
sys_datacopy(iovp->iod_proc_nr, iovp->iod_iovec[ix].iov_addr,
dep->de_memsegm, dep->de_linmem + offset, bytes);
sys_user2nic(iovp->iod_proc_nr, iovp->iod_iovec[ix].iov_addr,
dep->de_linmem + offset, bytes);
offset += bytes;
if (++ix >= IOVEC_NR) { /* Next buffer of IO vector */

View File

@ -102,23 +102,25 @@ static void reply(dpeth_t * dep, int err)
reply.m_type = DL_TASK_REPLY;
reply.DL_PORT = dep - de_table;
reply.DL_PROC = dep->de_client;
reply.DL_STAT = status | ((u32_t) err << 16);
reply.DL_STAT = status /* | ((u32_t) err << 16) */;
reply.DL_COUNT = dep->de_read_s;
getuptime(&reply.DL_CLCK);
DEBUG(printf("\t reply %d (%ld)\n", reply.m_type, reply.DL_STAT));
if ((status = send(dep->de_client, &reply)) != OK)
panic(dep->de_name, SendErrMsg, dep->de_client);
if ((status = send(dep->de_client, &reply)) == OK) {
dep->de_read_s = 0;
dep->de_flags &= NOT(DEF_ACK_SEND | DEF_ACK_RECV);
} else if (status != ELOCKED || err == OK)
panic(dep->de_name, SendErrMsg, status);
dep->de_read_s = 0;
dep->de_flags &= NOT(DEF_ACK_SEND | DEF_ACK_RECV);
return;
}
/*
** Name: void dp_confaddr(dpeth_t *dep)
** Function: Chechs environment for a User defined ethernet address.
** Function: Checks environment for a User defined ethernet address.
*/
static void dp_confaddr(dpeth_t * dep)
{
@ -190,7 +192,7 @@ static void do_dump(message *mp)
printf("%s statistics:\t\t", dep->de_name);
/* Network interface status */
printf("Status: 0x%04x\n\n", dep->de_flags);
printf("Status: 0x%04x (%d)\n\n", dep->de_flags, dep->de_int_pending);
(*dep->de_dumpstatsf) (dep);
@ -251,11 +253,12 @@ static void do_first_init(dpeth_t *dep, dp_conf_t *dcp)
/* Device specific initialization */
(*dep->de_initf) (dep);
/* Set the interrupt handler policy. Request interrupts to be reenabled
/* Set the interrupt handler policy. Request interrupts not to be reenabled
* automatically. Return the IRQ line number when an interrupt occurs.
*/
dep->de_hook = dep->de_irq;
sys_irqsetpolicy(dep->de_irq, IRQ_REENABLE, &dep->de_hook);
sys_irqsetpolicy(dep->de_irq, 0 /*IRQ_REENABLE*/, &dep->de_hook);
dep->de_int_pending = FALSE;
sys_irqenable(&dep->de_hook);
return;
@ -604,11 +607,12 @@ PUBLIC int main(int argc, char **argv)
for (dep = de_table; dep < &de_table[DE_PORT_NR]; dep += 1) {
/* If device is enabled and interrupt pending */
if (dep->de_mode == DEM_ENABLED) {
/* dep->de_int_pending = FALSE; */
dep->de_int_pending = TRUE;
(*dep->de_interruptf) (dep);
if (dep->de_flags & (DEF_ACK_SEND | DEF_ACK_RECV))
reply(dep, OK);
/* enable_irq(&dep->de_hook); */
reply(dep, !OK);
dep->de_int_pending = FALSE;
sys_irqenable(&dep->de_hook);
}
}
break;

View File

@ -6,6 +6,11 @@
** Interface description for ethernet device driver
**
** $Log$
** Revision 1.4 2005/09/04 18:52:16 beng
** Giovanni's fixes to dpeth:
** Date: Sat, 03 Sep 2005 11:05:22 +0200
** Subject: Minix 3.0.8
**
** Revision 1.3 2005/08/03 11:53:34 jnherder
** Miscellaneous cleanups.
**
@ -103,8 +108,8 @@ typedef struct dpeth {
port_t de_data_port; /* For boards using Prog. I/O for xmit/recv */
int de_irq;
/* int de_int_pending; */
int de_hook; /* V306 irq_hook_t de_hook; */
int de_int_pending;
int de_hook; /* interrupt hook at kernel */
char de_name[8];
@ -269,8 +274,8 @@ int wdeth_probe(dpeth_t * dep);
#define wdeth_probe(x) (0)
#endif
#define lock() sys_irqdisable(&dep->de_hook);
#define unlock() sys_irqenable(&dep->de_hook);
#define lock() (++dep->de_int_pending,sys_irqdisable(&dep->de_hook))
#define unlock() do{int i=(--dep->de_int_pending)?0:sys_irqenable(&dep->de_hook);}while(0)
#define milli_delay(t) tickdelay(1)
/** dp.h **/