summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authorwpaul <wpaul@FreeBSD.org>2004-07-11 00:19:30 +0000
committerwpaul <wpaul@FreeBSD.org>2004-07-11 00:19:30 +0000
commit16416501a995d5e0bbb51ba0f371590d3dc0c00a (patch)
treed3e09779ebff5bf50e2694a2ed89854892329112 /sys/compat
parentaae5483213805c645aad67985fa4f638d6e34915 (diff)
downloadFreeBSD-src-16416501a995d5e0bbb51ba0f371590d3dc0c00a.zip
FreeBSD-src-16416501a995d5e0bbb51ba0f371590d3dc0c00a.tar.gz
Make NdisReadPcmciaAttributeMemory() and NdisWritePcmciaAttributeMemory()
actually work. Make the PCI and PCCARD attachments provide a bus_get_resource_list() method so that resource listing for PCCARD works. PCCARD does not have a bus_get_resource_list() method (yet), so I faked up the resource list management in if_ndis_pccard.c, and added bus_get_resource_list() methods to both if_ndis_pccard.c and if_ndis_pci.c. The one in the PCI attechment just hands off to the PCI bus code. The difference is transparent to the NDIS resource handler code. Fixed ndis_open_file() so that opening files which live on NFS filesystems work: pass an actual ucred structure to VOP_GETATTR() (NFS explodes if the ucred structure is NOCRED). Make NdisMMapIoSpace() handle mapping of PCMCIA attribute memory resources correctly. Turn subr_ndis.c:my_strcasecmp() into ndis_strcasecmp() and export it so that if_ndis_pccard.c can use it, and junk the other copy of my_strcasecmp() from if_ndis_pccard.c.
Diffstat (limited to 'sys/compat')
-rw-r--r--sys/compat/ndis/kern_ndis.c3
-rw-r--r--sys/compat/ndis/ndis_var.h2
-rw-r--r--sys/compat/ndis/subr_ndis.c20
3 files changed, 16 insertions, 9 deletions
diff --git a/sys/compat/ndis/kern_ndis.c b/sys/compat/ndis/kern_ndis.c
index bbfff77..59c9d38 100644
--- a/sys/compat/ndis/kern_ndis.c
+++ b/sys/compat/ndis/kern_ndis.c
@@ -853,7 +853,8 @@ ndis_convert_res(arg)
rl->cprl_count = sc->ndis_rescnt;
prd = rl->cprl_partial_descs;
- brl = BUS_GET_RESOURCE_LIST(device_get_parent(dev), dev);
+ brl = BUS_GET_RESOURCE_LIST(dev, dev);
+
if (brl != NULL) {
/*
diff --git a/sys/compat/ndis/ndis_var.h b/sys/compat/ndis/ndis_var.h
index 2c015a9..2c88b9d 100644
--- a/sys/compat/ndis/ndis_var.h
+++ b/sys/compat/ndis/ndis_var.h
@@ -1500,6 +1500,7 @@ extern int ndis_send_packets(void *, ndis_packet **, int);
extern int ndis_send_packet(void *, ndis_packet *);
extern int ndis_convert_res(void *);
extern int ndis_alloc_amem(void *);
+extern void ndis_free_amem(void *);
extern void ndis_free_packet(ndis_packet *);
extern void ndis_free_bufs(ndis_buffer *);
extern int ndis_reset_nic(void *);
@@ -1520,6 +1521,7 @@ extern int ndis_sched(void (*)(void *), void *, int);
extern int ndis_unsched(void (*)(void *), void *, int);
extern int ndis_thsuspend(struct proc *, int);
extern void ndis_thresume(struct proc *);
+extern int ndis_strcasecmp(const char *, const char *);
__END_DECLS
#endif /* _NDIS_VAR_H_ */
diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c
index 243c9dc..e85ec7f 100644
--- a/sys/compat/ndis/subr_ndis.c
+++ b/sys/compat/ndis/subr_ndis.c
@@ -130,7 +130,6 @@ static ndis_status ndis_encode_parm(ndis_miniport_block *,
struct sysctl_oid *, ndis_parm_type, ndis_config_parm **);
static ndis_status ndis_decode_parm(ndis_miniport_block *,
ndis_config_parm *, char *);
-static int my_strcasecmp(const char *, const char *);
__stdcall static void ndis_read_cfg(ndis_status *, ndis_config_parm **,
ndis_handle, ndis_unicode_string *, ndis_parm_type);
__stdcall static void ndis_write_cfg(ndis_status *, ndis_handle,
@@ -556,8 +555,8 @@ ndis_encode_parm(block, oid, type, parm)
return(NDIS_STATUS_SUCCESS);
}
-static int
-my_strcasecmp(s1, s2)
+int
+ndis_strcasecmp(s1, s2)
const char *s1;
const char *s2;
{
@@ -619,7 +618,7 @@ ndis_read_cfg(status, parm, cfg, key, type)
TAILQ_FOREACH(e, device_get_sysctl_ctx(sc->ndis_dev), link) {
#endif
oidp = e->entry;
- if (my_strcasecmp(oidp->oid_name, keystr) == 0) {
+ if (ndis_strcasecmp(oidp->oid_name, keystr) == 0) {
if (strcmp((char *)oidp->oid_arg1, "UNSET") == 0) {
free(keystr, M_DEVBUF);
*status = NDIS_STATUS_FAILURE;
@@ -719,7 +718,7 @@ ndis_write_cfg(status, cfg, key, parm)
TAILQ_FOREACH(e, device_get_sysctl_ctx(sc->ndis_dev), link) {
#endif
oidp = e->entry;
- if (my_strcasecmp(oidp->oid_name, keystr) == 0) {
+ if (ndis_strcasecmp(oidp->oid_name, keystr) == 0) {
/* Found it, set the value. */
strcpy((char *)oidp->oid_arg1, val);
free(keystr, M_DEVBUF);
@@ -885,6 +884,7 @@ ndis_syslog(ndis_handle adapter, ndis_error_code code,
uint16_t flags;
char msgbuf[ERRMSGLEN];
+
block = (ndis_miniport_block *)adapter;
error = pe_get_message(block->nmb_img, code, &str, &i, &flags);
@@ -1478,6 +1478,9 @@ ndis_map_iospace(vaddr, adapter, paddr, len)
else if (sc->ndis_res_altmem != NULL &&
paddr.np_quad == rman_get_start(sc->ndis_res_altmem))
*vaddr = (void *)rman_get_virtual(sc->ndis_res_altmem);
+ else if (sc->ndis_res_am != NULL &&
+ paddr.np_quad == rman_get_start(sc->ndis_res_am))
+ *vaddr = (void *)rman_get_virtual(sc->ndis_res_am);
else
return(NDIS_STATUS_FAILURE);
@@ -2244,7 +2247,7 @@ ndis_read_pccard_amem(handle, offset, buf, len)
bt = rman_get_bustag(sc->ndis_res_am);
for (i = 0; i < len; i++)
- dest[i] = bus_space_read_1(bt, bh, (offset * 2) + (i * 2));
+ dest[i] = bus_space_read_1(bt, bh, (offset + i) * 2);
return(i);
}
@@ -2274,7 +2277,7 @@ ndis_write_pccard_amem(handle, offset, buf, len)
bt = rman_get_bustag(sc->ndis_res_am);
for (i = 0; i < len; i++)
- bus_space_write_1(bt, bh, (offset * 2) + (i * 2), src[i]);
+ bus_space_write_1(bt, bh, (offset + i) * 2, src[i]);
return(i);
}
@@ -2584,7 +2587,7 @@ ndis_open_file(status, filehandle, filelength, filename, highestaddr)
NDFREE(&nd, NDF_ONLY_PNBUF);
/* Get the file size. */
- VOP_GETATTR(nd.ni_vp, vap, NOCRED, td);
+ VOP_GETATTR(nd.ni_vp, vap, td->td_ucred, td);
VOP_UNLOCK(nd.ni_vp, 0, td);
mtx_unlock(&Giant);
@@ -2593,6 +2596,7 @@ ndis_open_file(status, filehandle, filelength, filename, highestaddr)
*filehandle = fh;
*filelength = fh->nf_maplen = vap->va_size & 0xFFFFFFFF;
*status = NDIS_STATUS_SUCCESS;
+
return;
}
OpenPOWER on IntegriCloud