o Preliminary support for mapping the CIS by the driver.
o Modify xe driver to use this. There's still some issues with this code, so xe can't map the cis just yet. I'm thinking about how to resolve the issue. pccard_nbk's pccard_alloc_resource is getting in the way.
This commit is contained in:
+6
-4
@@ -35,9 +35,6 @@
|
||||
*
|
||||
* xe_memwrite -- maybe better handled pccard layer?
|
||||
* xe_cem56fix -- need to figure out how to map the extra stuff.
|
||||
* xe_activate -- need to write it, and add some stuff to it. Look at if_sn
|
||||
* for guidance. resources/interrupts.
|
||||
* xe_deactivate -- turn off resources/interrupts.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -142,6 +139,9 @@
|
||||
#include <net/if_mib.h>
|
||||
#include <net/bpf.h>
|
||||
|
||||
#include <dev/pccard/pccardvar.h>
|
||||
#include "card_if.h"
|
||||
|
||||
#include <dev/xe/if_xereg.h>
|
||||
#include <dev/xe/if_xevar.h>
|
||||
|
||||
@@ -331,7 +331,6 @@ xe_probe(device_t dev)
|
||||
#endif
|
||||
|
||||
/* Map in the CIS */
|
||||
/* XXX This CANNOT work as it needs RF_PCCARD_ATTR support */
|
||||
r = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 0, ~0, 4 << 10, RF_ACTIVE);
|
||||
if (!r) {
|
||||
#ifdef XE_DEBUG
|
||||
@@ -341,6 +340,9 @@ xe_probe(device_t dev)
|
||||
}
|
||||
buf = (u_char *) rman_get_start(r);
|
||||
|
||||
CARD_SET_RES_FLAGS(device_get_parent(dev), dev, SYS_RES_MEMORY, rid,
|
||||
PCCARD_A_MEM_ATTR);
|
||||
|
||||
/* Grep through CIS looking for relevant tuples */
|
||||
offs = 0;
|
||||
do {
|
||||
|
||||
@@ -72,6 +72,8 @@
|
||||
#include <dev/pccard/pccardvar.h>
|
||||
#include <net/ethernet.h>
|
||||
|
||||
#include "card_if.h"
|
||||
|
||||
devclass_t pccard_devclass;
|
||||
|
||||
#define PCCARD_NPORT 2
|
||||
@@ -213,6 +215,8 @@ pccard_alloc_resource(device_t bus, device_t child, int type, int *rid,
|
||||
struct resource_list_entry *rle;
|
||||
struct resource *res;
|
||||
|
||||
/* XXX Do I need to add a special case here for the cis memory? XXX */
|
||||
|
||||
if (!passthrough && !isdefault) {
|
||||
rle = resource_list_find(rl, type, *rid);
|
||||
if (!rle) {
|
||||
@@ -269,6 +273,32 @@ pccard_read_ivar(device_t bus, device_t child, int which, u_char *result)
|
||||
return ENOENT;
|
||||
}
|
||||
|
||||
/* Pass card requests up to pcic. This may mean a bad design XXX */
|
||||
|
||||
static int
|
||||
pccard_set_res_flags(device_t bus, device_t child, int restype, int rid,
|
||||
u_long value)
|
||||
{
|
||||
return CARD_SET_RES_FLAGS(device_get_parent(bus), child, restype,
|
||||
rid, value);
|
||||
}
|
||||
|
||||
static int
|
||||
pccard_get_res_flags(device_t bus, device_t child, int restype, int rid,
|
||||
u_long *value)
|
||||
{
|
||||
return CARD_GET_RES_FLAGS(device_get_parent(bus), child, restype,
|
||||
rid, value);
|
||||
}
|
||||
|
||||
static int
|
||||
pccard_set_memory_offset(device_t bus, device_t child, int rid,
|
||||
u_int32_t offset)
|
||||
{
|
||||
return CARD_SET_MEMORY_OFFSET(device_get_parent(bus), child, rid,
|
||||
offset);
|
||||
}
|
||||
|
||||
static device_method_t pccard_methods[] = {
|
||||
/* Device interface */
|
||||
DEVMETHOD(device_probe, pccard_probe),
|
||||
@@ -291,6 +321,11 @@ static device_method_t pccard_methods[] = {
|
||||
DEVMETHOD(bus_delete_resource, pccard_delete_resource),
|
||||
DEVMETHOD(bus_read_ivar, pccard_read_ivar),
|
||||
|
||||
/* Card interface */
|
||||
DEVMETHOD(card_set_res_flags, pccard_set_res_flags),
|
||||
DEVMETHOD(card_get_res_flags, pccard_get_res_flags),
|
||||
DEVMETHOD(card_set_memory_offset, pccard_set_memory_offset),
|
||||
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
|
||||
+42
-9
@@ -48,6 +48,8 @@
|
||||
#include <isa/isavar.h>
|
||||
#include <dev/pcic/i82365reg.h>
|
||||
|
||||
#include "card_if.h"
|
||||
|
||||
/*
|
||||
* Prototypes for interrupt handler.
|
||||
*/
|
||||
@@ -806,8 +808,7 @@ pcic_activate_resource(device_t dev, device_t child, int type, int rid,
|
||||
int err;
|
||||
|
||||
switch (type) {
|
||||
case SYS_RES_IOPORT:
|
||||
{
|
||||
case SYS_RES_IOPORT: {
|
||||
struct io_desc *ip;
|
||||
ip = &devi->slt->io[rid];
|
||||
if (ip->flags == 0) {
|
||||
@@ -831,8 +832,7 @@ pcic_activate_resource(device_t dev, device_t child, int type, int rid,
|
||||
* interrupt messages.
|
||||
*/
|
||||
break;
|
||||
case SYS_RES_MEMORY:
|
||||
{
|
||||
case SYS_RES_MEMORY: {
|
||||
struct mem_desc *mp;
|
||||
if (rid >= NUM_MEM_WINDOWS)
|
||||
return EINVAL;
|
||||
@@ -860,8 +860,7 @@ pcic_deactivate_resource(device_t dev, device_t child, int type, int rid,
|
||||
int err;
|
||||
|
||||
switch (type) {
|
||||
case SYS_RES_IOPORT:
|
||||
{
|
||||
case SYS_RES_IOPORT: {
|
||||
struct io_desc *ip = &devi->slt->io[rid];
|
||||
ip->flags &= ~IODF_ACTIVE;
|
||||
err = pcic_io(devi->slt, rid);
|
||||
@@ -872,8 +871,7 @@ pcic_deactivate_resource(device_t dev, device_t child, int type, int rid,
|
||||
}
|
||||
case SYS_RES_IRQ:
|
||||
break;
|
||||
case SYS_RES_MEMORY:
|
||||
{
|
||||
case SYS_RES_MEMORY: {
|
||||
struct mem_desc *mp = &devi->slt->mem[rid];
|
||||
mp->flags &= ~(MDF_ACTIVE | MDF_ATTR);
|
||||
err = pcic_memory(devi->slt, rid);
|
||||
@@ -916,6 +914,41 @@ pcic_teardown_intr(device_t dev, device_t child, struct resource *irq,
|
||||
return (bus_generic_teardown_intr(dev, child, irq, cookie));
|
||||
}
|
||||
|
||||
static int
|
||||
pcic_set_res_flags(device_t bus, device_t child, int restype, int rid,
|
||||
u_long value)
|
||||
{
|
||||
struct pccard_devinfo *devi = device_get_ivars(child);
|
||||
int err = 0;
|
||||
|
||||
switch (restype) {
|
||||
case SYS_RES_MEMORY: {
|
||||
struct mem_desc *mp = &devi->slt->mem[rid];
|
||||
if (value)
|
||||
mp->flags |= MDF_ATTR;
|
||||
else
|
||||
mp->flags &= ~MDF_ATTR;
|
||||
err = pcic_memory(devi->slt, rid);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
err = EOPNOTSUPP;
|
||||
}
|
||||
return (err);
|
||||
}
|
||||
|
||||
static struct resource *
|
||||
pcic_alloc_resource(device_t bus, device_t child, int type, int *rid,
|
||||
u_long start, u_long end, u_long count, u_int flags)
|
||||
{
|
||||
if (start == 0 && end == ~0 && type == SYS_RES_MEMORY && count != 1) {
|
||||
start = 0xd0000;
|
||||
end = 0xdffff;
|
||||
}
|
||||
return bus_generic_alloc_resource(bus, child, type, rid, start, end,
|
||||
count, flags);
|
||||
}
|
||||
|
||||
static device_method_t pcic_methods[] = {
|
||||
/* Device interface */
|
||||
DEVMETHOD(device_probe, pcic_probe),
|
||||
@@ -927,7 +960,7 @@ static device_method_t pcic_methods[] = {
|
||||
|
||||
/* Bus interface */
|
||||
DEVMETHOD(bus_print_child, bus_generic_print_child),
|
||||
DEVMETHOD(bus_alloc_resource, bus_generic_alloc_resource),
|
||||
DEVMETHOD(bus_alloc_resource, pcic_alloc_resource),
|
||||
DEVMETHOD(bus_release_resource, bus_generic_release_resource),
|
||||
DEVMETHOD(bus_activate_resource, pcic_activate_resource),
|
||||
DEVMETHOD(bus_deactivate_resource, pcic_deactivate_resource),
|
||||
|
||||
Reference in New Issue
Block a user