summaryrefslogtreecommitdiffstats
path: root/sys/dev/ray
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ray')
-rw-r--r--sys/dev/ray/if_ray.c283
-rw-r--r--sys/dev/ray/if_rayvar.h2
2 files changed, 121 insertions, 164 deletions
diff --git a/sys/dev/ray/if_ray.c b/sys/dev/ray/if_ray.c
index 8d3a922..fe3af87 100644
--- a/sys/dev/ray/if_ray.c
+++ b/sys/dev/ray/if_ray.c
@@ -212,7 +212,7 @@
/* RAY_DBG_IOCTL | */ \
/* RAY_DBG_MBUF | */ \
/* RAY_DBG_RX | */ \
- /* RAY_DBG_CM | */ \
+ /* RAY_DBG_CM | */ \
/* RAY_DBG_COM | */ \
/* RAY_DBG_STOP | */ \
/* RAY_DBG_CTL | */ \
@@ -225,10 +225,12 @@
/*
* XXX build options - move to LINT
*/
-#define RAY_CM_RID 2 /* pccardd abuses windows 0 and 1 */
+#define RAY_CM_RID 0 /* pccardd abuses windows 0 and 1 */
#define RAY_AM_RID 3 /* pccardd abuses windows 0 and 1 */
#define RAY_COM_TIMEOUT (hz/2) /* Timeout for CCS commands */
#define RAY_TX_TIMEOUT (hz/2) /* Timeout for rescheduling TX */
+#define RAY_ECF_SPIN_DELAY 1000 /* Wait 1ms before checking ECF ready */
+#define RAY_ECF_SPIN_TRIES 10 /* Wait this many times for ECF ready */
/*
* XXX build options - move to LINT
*/
@@ -256,13 +258,13 @@
#include <net/if.h>
#include <net/if_arp.h>
#include <net/if_dl.h>
+#include <net/if_ieee80211.h>
#include <machine/limits.h>
#include <dev/pccard/pccardvar.h>
#include "card_if.h"
-#include <net/if_ieee80211.h>
#include <dev/ray/if_rayreg.h>
#include <dev/ray/if_raymib.h>
#include <dev/ray/if_raydbg.h>
@@ -299,7 +301,7 @@ static void ray_init_mcast (struct ray_softc *sc, struct ray_comq_entry *com);
static void ray_init_sj (struct ray_softc *sc, struct ray_comq_entry *com);
static void ray_init_sj_done (struct ray_softc *sc, size_t ccs);
static void ray_intr (void *xsc);
-static void ray_intr_ccs (struct ray_softc *sc, u_int8_t cmd, size_t ccs);
+static void ray_intr_ccs (struct ray_softc *sc, u_int8_t cmd, u_int8_t status, size_t ccs);
static void ray_intr_rcs (struct ray_softc *sc, u_int8_t cmd, size_t ccs);
static void ray_intr_updt_errcntrs (struct ray_softc *sc);
static int ray_ioctl (struct ifnet *ifp, u_long command, caddr_t data);
@@ -410,7 +412,7 @@ ray_probe(device_t dev)
return (ENXIO);
}
RAY_DPRINTF(sc, RAY_DBG_BOOTPARAM, "found a card");
- sc->gone = 0;
+ sc->sc_gone = 0;
/*
* Fixup tib size to be correct - on build 4 it is garbage
@@ -435,7 +437,7 @@ ray_attach(device_t dev)
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
- if ((sc == NULL) || (sc->gone))
+ if ((sc == NULL) || (sc->sc_gone))
return (ENXIO);
/*
@@ -571,7 +573,7 @@ ray_detach(device_t dev)
RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_STOP, "");
- if ((sc == NULL) || (sc->gone))
+ if ((sc == NULL) || (sc->sc_gone))
return (0);
/*
@@ -580,7 +582,7 @@ ray_detach(device_t dev)
* N.B. if_detach can trigger ioctls so we do it first and
* then clean the runq.
*/
- sc->gone = 1;
+ sc->sc_gone = 1;
sc->sc_havenet = 0;
ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
@@ -627,7 +629,7 @@ ray_ioctl(register struct ifnet *ifp, u_long command, caddr_t data)
RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_IOCTL, "");
- if ((sc == NULL) || (sc->gone))
+ if ((sc == NULL) || (sc->sc_gone))
return (ENXIO);
error = error2 = 0;
@@ -1275,7 +1277,7 @@ ray_watchdog(struct ifnet *ifp)
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
RAY_MAP_CM(sc);
- if ((sc == NULL) || (sc->gone))
+ if ((sc == NULL) || (sc->sc_gone))
return;
RAY_PRINTF(sc, "watchdog timeout");
@@ -1328,7 +1330,7 @@ ray_tx(struct ifnet *ifp)
/*
* Some simple checks first - some are overkill
*/
- if ((sc == NULL) || (sc->gone))
+ if ((sc == NULL) || (sc->sc_gone))
return;
if (!(ifp->if_flags & IFF_RUNNING)) {
RAY_RECERR(sc, "cannot transmit - not running");
@@ -1434,7 +1436,7 @@ ray_tx(struct ifnet *ifp)
}
if (m0 == NULL) {
- RAY_RECERR(sc, "could not translate packet");
+ RAY_RECERR(sc, "could not frame packet");
RAY_CCS_FREE(sc, ccs);
ifp->if_oerrors++;
return;
@@ -1443,7 +1445,7 @@ ray_tx(struct ifnet *ifp)
/*
* Copy the mbuf to the buffer in common memory
*
- * We panic and don't bother wrapping as ethernet packets are 1518
+ * We drop and don't bother wrapping as Ethernet packets are 1518
* bytes, we checked the mbuf earlier, and our TX buffers are 2048
* bytes. We don't have 530 bytes of headers etc. so something
* must be fubar.
@@ -1455,11 +1457,15 @@ ray_tx(struct ifnet *ifp)
continue;
if ((bufp + len) < RAY_TX_END)
SRAM_WRITE_REGION(sc, bufp, mtod(m, u_int8_t *), len);
- else
- RAY_PANIC(sc, "tx buffer overflow");
+ else {
+ RAY_RECERR(sc, "tx buffer overflow");
+ RAY_CCS_FREE(sc, ccs);
+ ifp->if_oerrors++;
+ m_freem(m0);
+ return;
+ }
bufp += len;
}
- RAY_MBUF_DUMP(sc, RAY_DBG_TX, m0, "ray_tx");
/*
* Send it off
@@ -1525,18 +1531,22 @@ ray_tx_wrhdr(struct ray_softc *sc, size_t bufp, u_int8_t type, u_int8_t fc1, u_i
static int
ray_tx_send(struct ray_softc *sc, size_t ccs, int pktlen, u_int8_t *dst)
{
+ int i = 0;
+
RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_TX, "");
RAY_MAP_CM(sc);
- if (!RAY_ECF_READY(sc)) {
- /*
- * XXX If this can really happen perhaps we need to save
- * XXX the chain and use it later.
- */
- RAY_RECERR(sc, "ECF busy, dropping packet");
- RAY_CCS_FREE(sc, ccs);
- return (1);
+ while (!RAY_ECF_READY(sc)) {
+ DELAY(RAY_ECF_SPIN_DELAY);
+ if (++i > RAY_ECF_SPIN_TRIES) {
+ RAY_RECERR(sc, "ECF busy, dropping packet");
+ RAY_CCS_FREE(sc, ccs);
+ return (1);
+ }
}
+ if (i != 0)
+ RAY_RECERR(sc, "spun %d times", i);
+
SRAM_WRITE_FIELD_2(sc, ccs, ray_cmd_tx, c_len, pktlen);
SRAM_WRITE_FIELD_1(sc, ccs, ray_cmd_tx, c_antenna,
ray_tx_best_antenna(sc, dst));
@@ -1687,10 +1697,6 @@ ray_rx(struct ray_softc *sc, size_t rcs)
ni = SRAM_READ_FIELD_1(sc, rcs, ray_cmd_rx, c_nextfrag);
bufp = SRAM_READ_FIELD_2(sc, rcs, ray_cmd_rx, c_bufp);
fraglen = SRAM_READ_FIELD_2(sc, rcs, ray_cmd_rx, c_len);
- RAY_DPRINTF(sc, RAY_DBG_RX,
- "frag index %d len %d bufp 0x%x ni %d",
- i, fraglen, (int)bufp, ni);
-
if (fraglen + readlen > pktlen) {
RAY_RECERR(sc, "bad length current 0x%x pktlen 0x%x",
fraglen + readlen, pktlen);
@@ -1780,7 +1786,7 @@ ray_rx_data(struct ray_softc *sc, struct mbuf *m0, u_int8_t siglev, u_int8_t ant
struct ether_header *eh;
u_int8_t *sa, *da, *ra, *ta;
- RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_MGT, "");
+ RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_RX, "");
/*
* Check the the data packet subtype, some packets have
@@ -1933,14 +1939,11 @@ ray_rx_mgt(struct ray_softc *sc, struct mbuf *m0)
* JPJ IEEE80211_FC0_SUBTYPE_REASSOC_RESP
* +EEE IEEE80211_FC0_SUBTYPE_ATIM
*/
- RAY_MBUF_DUMP(sc, RAY_DBG_RX, m0, "MGT packet");
+ RAY_MBUF_DUMP(sc, RAY_DBG_MGT, m0, "MGT packet");
switch (header->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) {
case IEEE80211_FC0_SUBTYPE_BEACON:
RAY_DPRINTF(sc, RAY_DBG_MGT, "BEACON MGT packet");
- /* XXX furtle anything interesting out */
- /* XXX Note that there are rules governing what beacons to
- read, see 8802 S7.2.3, S11.1.2.3 */
break;
case IEEE80211_FC0_SUBTYPE_AUTH:
@@ -1956,23 +1959,23 @@ ray_rx_mgt(struct ray_softc *sc, struct mbuf *m0)
case IEEE80211_FC0_SUBTYPE_ASSOC_REQ:
case IEEE80211_FC0_SUBTYPE_REASSOC_REQ:
RAY_DPRINTF(sc, RAY_DBG_MGT, "(RE)ASSOC_REQ MGT packet");
- if ((sc->sc_d.np_net_type == RAY_MIB_NET_TYPE_INFRA) &&
+ if ((sc->sc_c.np_net_type == RAY_MIB_NET_TYPE_INFRA) &&
(sc->sc_c.np_ap_status == RAY_MIB_AP_STATUS_AP))
- RAY_PANIC(sc, "can't be an AP yet"); /* XXX_ACTING_AP */
+ RAY_RECERR(sc, "can't be an AP yet"); /* XXX_ACTING_AP */
break;
case IEEE80211_FC0_SUBTYPE_ASSOC_RESP:
case IEEE80211_FC0_SUBTYPE_REASSOC_RESP:
RAY_DPRINTF(sc, RAY_DBG_MGT, "(RE)ASSOC_RESP MGT packet");
- if ((sc->sc_d.np_net_type == RAY_MIB_NET_TYPE_INFRA) &&
+ if ((sc->sc_c.np_net_type == RAY_MIB_NET_TYPE_INFRA) &&
(sc->sc_c.np_ap_status == RAY_MIB_AP_STATUS_TERMINAL))
- RAY_PANIC(sc, "can't be in INFRA yet"); /* XXX_INFRA */
+ RAY_RECERR(sc, "can't be in INFRA yet"); /* XXX_INFRA */
break;
case IEEE80211_FC0_SUBTYPE_DISASSOC:
RAY_DPRINTF(sc, RAY_DBG_MGT, "DISASSOC MGT packet");
- if (sc->sc_d.np_net_type == RAY_MIB_NET_TYPE_INFRA)
- RAY_PANIC(sc, "can't be in INFRA yet"); /* XXX_INFRA */
+ if (sc->sc_c.np_net_type == RAY_MIB_NET_TYPE_INFRA)
+ RAY_RECERR(sc, "can't be in INFRA yet"); /* XXX_INFRA */
break;
case IEEE80211_FC0_SUBTYPE_PROBE_REQ:
@@ -2101,7 +2104,7 @@ ray_rx_ctl(struct ray_softc *sc, struct mbuf *m0)
RAY_DPRINTF(sc, RAY_DBG_CTL, "PS_POLL CTL packet");
if ((sc->sc_d.np_net_type == RAY_MIB_NET_TYPE_INFRA) &&
(sc->sc_c.np_ap_status == RAY_MIB_AP_STATUS_AP))
- RAY_PANIC(sc, "can't be an AP yet"); /* XXX_ACTING_AP */
+ RAY_RECERR(sc, "can't be an AP yet"); /* XXX_ACTING_AP */
break;
case IEEE80211_FC0_SUBTYPE_RTS:
@@ -2180,13 +2183,13 @@ ray_intr(void *xsc)
struct ray_softc *sc = (struct ray_softc *)xsc;
struct ifnet *ifp = &sc->arpcom.ac_if;
size_t ccs;
- u_int8_t cmd;
+ u_int8_t cmd, status;
int ccsi;
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
RAY_MAP_CM(sc);
- if ((sc == NULL) || (sc->gone))
+ if ((sc == NULL) || (sc->sc_gone))
return;
/*
@@ -2197,14 +2200,14 @@ ray_intr(void *xsc)
ccsi = SRAM_READ_1(sc, RAY_SCB_RCSI);
ccs = RAY_CCS_ADDRESS(ccsi);
cmd = SRAM_READ_FIELD_1(sc, ccs, ray_cmd, c_cmd);
+ status = SRAM_READ_FIELD_1(sc, ccs, ray_cmd, c_status);
if (ccsi <= RAY_CCS_LAST)
- ray_intr_ccs(sc, cmd, ccs);
+ ray_intr_ccs(sc, cmd, status, ccs);
else if (ccsi <= RAY_RCS_LAST)
ray_intr_rcs(sc, cmd, ccs);
else
RAY_RECERR(sc, "bad ccs index 0x%x", ccsi);
RAY_HCS_CLEAR_INTR(sc);
- RAY_DPRINTF(sc, RAY_DBG_RX, "interrupt was handled");
}
/* Send any packets lying around and update error counters */
@@ -2257,7 +2260,7 @@ ray_intr_updt_errcntrs(struct ray_softc *sc)
* Process CCS command completion
*/
static void
-ray_intr_ccs(struct ray_softc *sc, u_int8_t cmd, size_t ccs)
+ray_intr_ccs(struct ray_softc *sc, u_int8_t cmd, u_int8_t status, size_t ccs)
{
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
@@ -3029,21 +3032,18 @@ ray_com_runq_done(struct ray_softc *sc)
static void
ray_com_ecf(struct ray_softc *sc, struct ray_comq_entry *com)
{
- u_int i;
+ int i = 0;
RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_COM, "");
RAY_MAP_CM(sc);
- /*
- * XXX we probably want to call a timeout on ourself here...
- * XXX why isn't this processed like the TX case
- */
- i = 0;
- while (!RAY_ECF_READY(sc))
- if (++i > 50)
+ while (!RAY_ECF_READY(sc)) {
+ DELAY(RAY_ECF_SPIN_DELAY);
+ if (++i > RAY_ECF_SPIN_TRIES)
RAY_PANIC(sc, "spun too long");
- else if (i == 1)
- RAY_RECERR(sc, "spinning");
+ }
+ if (i != 0)
+ RAY_RECERR(sc, "spun %d times", i);
RAY_DPRINTF(sc, RAY_DBG_COM, "sending %p", com);
RAY_DCOM(sc, RAY_DBG_DCOM, com, "sending");
@@ -3072,7 +3072,7 @@ ray_com_ecf_timo(void *xsc)
{
struct ray_softc *sc = (struct ray_softc *)xsc;
struct ray_comq_entry *com;
- u_int8_t cmd;
+ u_int8_t cmd, status;
int s;
s = splnet();
@@ -3083,11 +3083,12 @@ ray_com_ecf_timo(void *xsc)
com = TAILQ_FIRST(&sc->sc_comq);
cmd = SRAM_READ_FIELD_1(sc, com->c_ccs, ray_cmd, c_cmd);
- switch (SRAM_READ_FIELD_1(sc, com->c_ccs, ray_cmd, c_status)) {
+ status = SRAM_READ_FIELD_1(sc, com->c_ccs, ray_cmd, c_status);
+ switch (status) {
case RAY_CCS_STATUS_COMPLETE:
case RAY_CCS_STATUS_FREE: /* Buggy firmware */
- ray_intr_ccs(sc, cmd, com->c_ccs);
+ ray_intr_ccs(sc, cmd, status, com->c_ccs);
break;
case RAY_CCS_STATUS_BUSY:
@@ -3101,7 +3102,7 @@ ray_com_ecf_timo(void *xsc)
sc->com_timerh = timeout(ray_com_ecf_timo, sc,
RAY_COM_TIMEOUT);
} else
- ray_intr_ccs(sc, cmd, com->c_ccs);
+ ray_intr_ccs(sc, cmd, status, com->c_ccs);
break;
}
@@ -3179,7 +3180,7 @@ ray_ccs_alloc(struct ray_softc *sc, size_t *ccsp, char *wmesg)
RAY_DPRINTF(sc, RAY_DBG_CCS, "sleeping");
error = tsleep(ray_ccs_alloc, PCATCH | PRIBIO,
wmesg, 0);
- if ((sc == NULL) || (sc->gone))
+ if ((sc == NULL) || (sc->sc_gone))
return (ENXIO);
RAY_DPRINTF(sc, RAY_DBG_CCS,
"awakened, tsleep returned 0x%x", error);
@@ -3229,7 +3230,7 @@ ray_ccs_free(struct ray_softc *sc, size_t ccs)
if (!sc->sc_ccsinuse[RAY_CCS_INDEX(ccs)])
RAY_RECERR(sc, "freeing free ccs 0x%02x", RAY_CCS_INDEX(ccs));
#endif /* RAY_DEBUG & RAY_DBG_CCS */
- if (!sc->gone)
+ if (!sc->sc_gone)
RAY_CCS_FREE(sc, ccs);
sc->sc_ccsinuse[RAY_CCS_INDEX(ccs)] = 0;
RAY_DPRINTF(sc, RAY_DBG_CCS, "freed 0x%02x", RAY_CCS_INDEX(ccs));
@@ -3287,7 +3288,7 @@ ray_ccs_tx(struct ray_softc *sc, size_t *ccsp, size_t *bufpp)
SRAM_WRITE_FIELD_2(sc, ccs, ray_cmd_tx, c_bufp, bufp);
SRAM_WRITE_FIELD_1(sc,
ccs, ray_cmd_tx, c_tx_rate, sc->sc_c.np_def_txrate);
- SRAM_WRITE_FIELD_1(sc, ccs, ray_cmd_tx, c_apm_mode, 0); /* XXX */
+ SRAM_WRITE_FIELD_1(sc, ccs, ray_cmd_tx, c_apm_mode, 0); /* XXX_APM */
bufp += sizeof(struct ray_tx_phy_header);
*ccsp = ccs;
@@ -3302,86 +3303,59 @@ ray_ccs_tx(struct ray_softc *sc, size_t *ccsp, size_t *bufpp)
/*
* Allocate the attribute memory on the card
*
- * A lot of this is hacking around pccardd brokeness
+ * The attribute memory space is abused by these devices as IO space. As such
+ * the OS card services don't have a chance of knowing that they need to keep
+ * the attribute space mapped. We have to do it manually.
*/
static int
ray_res_alloc_am(struct ray_softc *sc)
{
- u_long start, count, flags;
- u_int32_t offset;
int error;
RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_CM, "");
sc->am_rid = RAY_AM_RID;
- start = bus_get_resource_start(sc->dev, SYS_RES_MEMORY, sc->am_rid);
- count = bus_get_resource_count(sc->dev, SYS_RES_MEMORY, sc->am_rid);
- error = CARD_GET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
- SYS_RES_MEMORY, sc->am_rid, &flags);
+ sc->am_res = bus_alloc_resource(sc->dev, SYS_RES_MEMORY,
+ &sc->am_rid, 0UL, ~0UL, 0x1000, RF_ACTIVE);
+ if (!sc->am_res) {
+ RAY_PRINTF(sc, "Cannot allocate attribute memory");
+ return (ENOMEM);
+ }
+ error = CARD_SET_MEMORY_OFFSET(device_get_parent(sc->dev), sc->dev,
+ sc->am_rid, 0, NULL);
if (error) {
- RAY_PRINTF(sc, "CARD_GET_RES_FLAGS returned 0x%0x", error);
+ RAY_PRINTF(sc, "CARD_SET_MEMORY_OFFSET returned 0x%0x", error);
return (error);
}
- error = CARD_GET_MEMORY_OFFSET(device_get_parent(sc->dev), sc->dev,
- sc->am_rid, &offset);
+ error = CARD_SET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
+ SYS_RES_MEMORY, sc->am_rid, PCCARD_A_MEM_ATTR);
if (error) {
- RAY_PRINTF(sc, "CARD_GET_MEMORY_OFFSET returned 0x%0x", error);
+ RAY_PRINTF(sc, "CARD_SET_RES_FLAGS returned 0x%0x", error);
return (error);
}
-
- RAY_DPRINTF(sc, RAY_DBG_CM | RAY_DBG_BOOTPARAM,
- "attribute start 0x%0lx count 0x%0lx flags 0x%0lx offset 0x%0x",
- start, count, flags, offset);
-
- if (start == 0x0) {
- RAY_PRINTF(sc, "fixing up AM map");
- }
- if (count != 0x1000) {
- RAY_PRINTF(sc, "fixing up AM size from 0x%lx to 0x1000",
- count);
- count = 0x1000;
- }
- sc->am_res = bus_alloc_resource(sc->dev, SYS_RES_MEMORY,
- &sc->am_rid, start, ~0, count, RF_ACTIVE);
- if (!sc->am_res) {
- RAY_PRINTF(sc, "Cannot allocate attribute memory");
- return (ENOMEM);
+ error = CARD_SET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
+ SYS_RES_MEMORY, sc->am_rid, PCCARD_A_MEM_8BIT);
+ if (error) {
+ RAY_PRINTF(sc, "CARD_SET_RES_FLAGS returned 0x%0x", error);
+ return (error);
}
sc->am_bsh = rman_get_bushandle(sc->am_res);
sc->am_bst = rman_get_bustag(sc->am_res);
- if (offset != 0) {
- RAY_PRINTF(sc, "fixing up AM card address from 0x%x to 0x0",
- offset);
- error = CARD_SET_MEMORY_OFFSET(device_get_parent(sc->dev),
- sc->dev, sc->am_rid, 0, NULL);
- if (error) {
- RAY_PRINTF(sc, "CARD_SET_MEMORY_OFFSET returned 0x%0x",
- error);
- return (error);
- }
- }
- if (!(flags & 0x10) /* XXX MDF_ATTR */) {
- RAY_PRINTF(sc, "fixing up AM flags from 0x%lx to 0x50",
- flags);
- error = CARD_SET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
- SYS_RES_MEMORY, sc->am_rid, PCCARD_A_MEM_ATTR);
- if (error) {
- RAY_PRINTF(sc, "CARD_SET_RES_FLAGS returned 0x%0x",
- error);
- return (error);
- }
- }
#if RAY_DEBUG & (RAY_DBG_CM | RAY_DBG_BOOTPARAM)
+{
+ u_long flags;
+ u_int32_t offset;
CARD_GET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
SYS_RES_MEMORY, sc->am_rid, &flags);
CARD_GET_MEMORY_OFFSET(device_get_parent(sc->dev), sc->dev,
- sc->cm_rid, &offset);
+ sc->am_rid, &offset);
RAY_PRINTF(sc, "allocated attribute memory:\n"
". start 0x%0lx count 0x%0lx flags 0x%0lx offset 0x%0x",
bus_get_resource_start(sc->dev, SYS_RES_MEMORY, sc->am_rid),
bus_get_resource_count(sc->dev, SYS_RES_MEMORY, sc->am_rid),
flags, offset);
+}
#endif /* RAY_DEBUG & (RAY_DBG_CM | RAY_DBG_BOOTPARAM) */
return (0);
@@ -3390,77 +3364,58 @@ ray_res_alloc_am(struct ray_softc *sc)
/*
* Allocate the common memory on the card
*
- * A lot of this is hacking around pccardd brokeness
+ * As this memory is described in the CIS, the OS card services should
+ * have set the map up okay, but the card uses 8 bit RAM. This is not
+ * described in the CIS.
*/
static int
ray_res_alloc_cm(struct ray_softc *sc)
{
- u_long start, count, flags;
- u_int32_t offset;
+ u_long start, count, end;
int error;
RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_CM, "");
+ RAY_DPRINTF(sc,RAY_DBG_CM | RAY_DBG_BOOTPARAM,
+ "cm start 0x%0lx count 0x%0lx",
+ bus_get_resource_start(sc->dev, SYS_RES_MEMORY, RAY_CM_RID),
+ bus_get_resource_count(sc->dev, SYS_RES_MEMORY, RAY_CM_RID));
+
sc->cm_rid = RAY_CM_RID;
start = bus_get_resource_start(sc->dev, SYS_RES_MEMORY, sc->cm_rid);
count = bus_get_resource_count(sc->dev, SYS_RES_MEMORY, sc->cm_rid);
- error = CARD_GET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
- SYS_RES_MEMORY, sc->cm_rid, &flags);
+ end = start + count - 1;
+ sc->cm_res = bus_alloc_resource(sc->dev, SYS_RES_MEMORY,
+ &sc->cm_rid, start, end, count, RF_ACTIVE);
+ if (!sc->cm_res) {
+ RAY_PRINTF(sc, "Cannot allocate common memory");
+ return (ENOMEM);
+ }
+ error = CARD_SET_MEMORY_OFFSET(device_get_parent(sc->dev), sc->dev,
+ sc->cm_rid, 0, NULL);
if (error) {
- RAY_PRINTF(sc, "CARD_GET_RES_FLAGS returned 0x%0x", error);
+ RAY_PRINTF(sc, "CARD_SET_MEMORY_OFFSET returned 0x%0x", error);
return (error);
}
- error = CARD_GET_MEMORY_OFFSET(device_get_parent(sc->dev), sc->dev,
- sc->cm_rid, &offset);
+ error = CARD_SET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
+ SYS_RES_MEMORY, sc->cm_rid, PCCARD_A_MEM_COM);
if (error) {
- RAY_PRINTF(sc, "CARD_GET_MEMORY_OFFSET returned 0x%0x", error);
+ RAY_PRINTF(sc, "CARD_SET_RES_FLAGS returned 0x%0x", error);
return (error);
}
-
- RAY_DPRINTF(sc, RAY_DBG_CM | RAY_DBG_BOOTPARAM,
- "memory start 0x%0lx count 0x%0lx flags 0x%0lx offset 0x%0x",
- start, count, flags, offset);
-
- if (start == 0x0) {
- RAY_PRINTF(sc, "fixing up CM map");
- }
- if (count != 0xc000) {
- RAY_PRINTF(sc, "fixing up CM size from 0x%lx to 0xc000",
- count);
- count = 0xc000;
- }
- sc->cm_res = bus_alloc_resource(sc->dev, SYS_RES_MEMORY,
- &sc->cm_rid, start, ~0, count, RF_ACTIVE);
- if (!sc->cm_res) {
- RAY_PRINTF(sc, "Cannot allocate common memory");
- return (ENOMEM);
+ error = CARD_SET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
+ SYS_RES_MEMORY, sc->cm_rid, PCCARD_A_MEM_8BIT);
+ if (error) {
+ RAY_PRINTF(sc, "CARD_SET_RES_FLAGS returned 0x%0x", error);
+ return (error);
}
sc->cm_bsh = rman_get_bushandle(sc->cm_res);
sc->cm_bst = rman_get_bustag(sc->cm_res);
- if (offset != 0) {
- RAY_PRINTF(sc, "fixing up CM card address from 0x%x to 0x0",
- offset);
- error = CARD_SET_MEMORY_OFFSET(device_get_parent(sc->dev),
- sc->dev, sc->cm_rid, 0, NULL);
- if (error) {
- RAY_PRINTF(sc, "CARD_SET_MEMORY_OFFSET returned 0x%0x",
- error);
- return (error);
- }
- }
- if (flags != 0x40 /* XXX MDF_ACTIVE */) {
- RAY_PRINTF(sc, "fixing up CM flags from 0x%lx to 0x40",
- flags);
- error = CARD_SET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
- SYS_RES_MEMORY, sc->cm_rid, 2);
- if (error) {
- RAY_PRINTF(sc, "CARD_SET_RES_FLAGS returned 0x%0x",
- error);
- return (error);
- }
- }
#if RAY_DEBUG & (RAY_DBG_CM | RAY_DBG_BOOTPARAM)
+{
+ u_long flags;
+ u_int32_t offset;
CARD_GET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
SYS_RES_MEMORY, sc->cm_rid, &flags);
CARD_GET_MEMORY_OFFSET(device_get_parent(sc->dev), sc->dev,
@@ -3470,6 +3425,7 @@ ray_res_alloc_cm(struct ray_softc *sc)
bus_get_resource_start(sc->dev, SYS_RES_MEMORY, sc->cm_rid),
bus_get_resource_count(sc->dev, SYS_RES_MEMORY, sc->cm_rid),
flags, offset);
+}
#endif /* RAY_DEBUG & (RAY_DBG_CM | RAY_DBG_BOOTPARAM) */
return (0);
@@ -3545,6 +3501,7 @@ ray_dump_mbuf(struct ray_softc *sc, struct mbuf *m, char *s)
u_int i;
char p[17];
+ RAY_PRINTF(sc, "%s", s);
RAY_PRINTF(sc, "\nm0->data\t0x%p\nm_pkthdr.len\t%d\nm_len\t%d",
mtod(m, u_int8_t *), m->m_pkthdr.len, m->m_len);
i = 0;
diff --git a/sys/dev/ray/if_rayvar.h b/sys/dev/ray/if_rayvar.h
index 83dd6cc..cc8561c 100644
--- a/sys/dev/ray/if_rayvar.h
+++ b/sys/dev/ray/if_rayvar.h
@@ -80,7 +80,7 @@ struct ray_softc {
struct resource* irq_res; /* Resource for irq */
void * irq_handle; /* Handle for irq handler */
- u_char gone; /* 1 = Card bailed out */
+ u_char sc_gone; /* 1 = Card bailed out */
int framing; /* Packet framing types */
OpenPOWER on IntegriCloud