summaryrefslogtreecommitdiffstats
path: root/sys/dev/ray
diff options
context:
space:
mode:
authordmlb <dmlb@FreeBSD.org>2000-06-04 17:51:36 +0000
committerdmlb <dmlb@FreeBSD.org>2000-06-04 17:51:36 +0000
commitf17a995d3a8f79f19bd88b6a7b30444d87f5e69b (patch)
tree0b2fffc5771b7a525bd4993b0a0acaec4006cf34 /sys/dev/ray
parent3b6210310f023ffc208e1a15f35f869642e9e601 (diff)
downloadFreeBSD-src-f17a995d3a8f79f19bd88b6a7b30444d87f5e69b.zip
FreeBSD-src-f17a995d3a8f79f19bd88b6a7b30444d87f5e69b.tar.gz
Main changes are resurection of mutlicast code (jgibbs moved the stuff I
needed to add into ether_input) and finally sorting IFF_RUNNING through whole driver. As part of the IFF_RUNNING stuff, we've added an extra flag so callers can request that runq routines should check IFF_RUNNING before executing. Remove BPF taps as this is now done by ether_input. Resurrect multicast code, moving the multicast list stuff to the runq routine. Dump ray_promisc_user as all flag changes are now handled by ray_init, and add a couple of checks to ray_promisc. In uppparams_user, allow changes before the card is running (need to fix some breakage with _download here later). In addition, don't assume that the current n/w parameters are valid - they are only valid in the runq. Fix a nasty flag bug - runq_add cleared all the flags on the last command! Remove the hacks for setting the memory flags - problems were down to buggy versions of pccardd. For some reason pccardd only dtrt with the "right" debug_level.
Diffstat (limited to 'sys/dev/ray')
-rw-r--r--sys/dev/ray/if_ray.c308
1 files changed, 133 insertions, 175 deletions
diff --git a/sys/dev/ray/if_ray.c b/sys/dev/ray/if_ray.c
index f500d0b..fc2db5d 100644
--- a/sys/dev/ray/if_ray.c
+++ b/sys/dev/ray/if_ray.c
@@ -229,11 +229,9 @@
* why can't download use sc_promisc? - done
* still use the specific update in _init to ensure that the state is
* right until promisc is moved into current/desired parameters
- *
- * ***detach needs to drain comq
- * ***stop/detach checks in more routines
- * ***reset in ray_init_user?
- * ***IFF_RUNNING checks are they really needed?
+ * for ALLMULTI must go into PROMISC and filter unicast packets - done
+ * recent changes to ether_input mean I don't need this
+ * IFF_RUNNING checks are they really needed? - done
* this whole area is circumspect as RUNNING is reflection of the
* driver state and is subject to waits etc.
* - need to return EIO from runq routines that check
@@ -241,20 +239,28 @@
* check as required
* init sequence is done
* stop sequence is done
- * other not done
+ * others are done
+ * mcast code resurrection - done
+ *
+ * ***detach needs to drain comq
+ * ***detach checks in all routines that access the card
+ * ***reset in ray_init_user?
* ***PCATCH tsleeps and have something that will clean the runq
* ***priorities for each tsleep
* ***watchdog to catch screwed up removals?
+ * ***remember to ccs_free on error in _user routines
* ***check and rationalise CM mappings
* use /sys/net/if_ieee80211.h and update it
+ * remove ray_reset
+ * write up driver structure in comments above
* macro for gone and check is at head of all externally called routines
* probably function/macro to test unload at top of commands
- * for ALLMULTI must go into PROMISC and filter unicast packets
- * mcast code resurrection
* UPDATE_PARAMS seems to return via an interrupt - maybe the timeout
* is needed for wrong values?
* remember it must be serialised as it uses the HCF-ECF area
* check all RECERRs and make sure that some are RAY_PRINTF not RAY_DPRINTF
+ * could do with selectively calling ray_mcast in ray_init but can't figure
+ * out a way that doesn't violate the runq or introduce a state var.
* havenet needs checking again
* error handling of ECF command completions
* proper setting of mib_hop_seq_len with country code for v4 firmware
@@ -285,9 +291,9 @@
#define XXX_ASSOC 0
#define XXX_ACTING_AP 0
#define XXX_INFRA 0
-#define XXX_MCAST 0
#define XXX_RESET 0
#define XXX_IFQ_PEEK 0
+#define XXX_8BIT 0
#define RAY_DEBUG ( \
RAY_DBG_RECERR | \
/* RAY_DBG_SUBR | */ \
@@ -298,7 +304,7 @@
/* RAY_DBG_MBUF | */ \
/* RAY_DBG_RX | */ \
/* RAY_DBG_CM | */ \
- RAY_DBG_COM | \
+ RAY_DBG_COM | \
RAY_DBG_STOP | \
/* RAY_DBG_CTL | */ \
/* RAY_DBG_MGT | */ \
@@ -605,6 +611,14 @@ ray_attach(device_t dev)
bzero(&sc->sc_d, sizeof(struct ray_nw_param));
bzero(&sc->sc_c, sizeof(struct ray_nw_param));
+ /* XXX Clear signal and antenna cache */
+
+ /* Clear statistics counters */
+ sc->sc_rxoverflow = 0;
+ sc->sc_rxcksum = 0;
+ sc->sc_rxhcksum = 0;
+ sc->sc_rxnoise = 0;
+
/* Set all ccs to be free */
bzero(sc->sc_ccsinuse, sizeof(sc->sc_ccsinuse));
ccs = RAY_CCS_ADDRESS(0);
@@ -621,11 +635,7 @@ ray_attach(device_t dev)
ifp->if_name = "ray";
ifp->if_unit = device_get_unit(dev);
ifp->if_timer = 0;
-#if XXX_MCAST
ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
-#else
- ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX);
-#endif /* XXX_MCAST */
ifp->if_hdrlen = sizeof(struct ieee80211_header) +
sizeof(struct ether_header);
ifp->if_baudrate = 1000000; /* Is this baud or bps ;-) */
@@ -699,6 +709,7 @@ ray_detach(device_t dev)
{
struct ray_softc *sc = device_get_softc(dev);
struct ifnet *ifp = &sc->arpcom.ac_if;
+ struct ray_comq_entry *com;
RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_STOP, "");
@@ -708,11 +719,26 @@ ray_detach(device_t dev)
/*
* Clear out timers and sort out driver state
*/
+ com = TAILQ_FIRST(&sc->sc_comq);
+ for (com = TAILQ_FIRST(&sc->sc_comq); com != NULL;
+ com = TAILQ_NEXT(com, c_chain)) {
+ com->c_flags |= RAY_COM_FDETACH;
+ }
untimeout(ray_com_ecf_timo, sc, sc->com_timerh);
untimeout(ray_reset_timo, sc, sc->reset_timerh);
untimeout(ray_tx_timo, sc, sc->tx_timerh);
sc->sc_havenet = 0;
+/* XXX
+
+ What to do with the queue:-
+
+ mark all entries as invalid and then invoke runq to sort it out
+
+ as the state is held in the queue then we should be okay
+
+ */
+
/*
* Mark as not running
*/
@@ -749,6 +775,9 @@ ray_ioctl(register struct ifnet *ifp, u_long command, caddr_t data)
RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_IOCTL, "");
RAY_MAP_CM(sc);
+ if (sc->gone)
+ return (ENXIO);
+
error = error2 = 0;
s = splimp();
@@ -863,7 +892,7 @@ ray_ioctl(register struct ifnet *ifp, u_long command, caddr_t data)
}
/*
- * User land entry to network initialisation. Called by ray_ioctl
+ * User land entry to network initialisation and changes in interface flags.
*
* We do a very small bit of house keeping before calling
* ray_init_download to do all the real work. We do it this way in
@@ -876,7 +905,7 @@ ray_ioctl(register struct ifnet *ifp, u_long command, caddr_t data)
* ray_init_sj tells the card to try and find a network (or
* start a new one) if we are not already connected
*
- * promiscuous and multi-cast modes are then set
+ * the multi-cast filter and promiscuous mode are then set
*
* Returns values are either 0 for success, a varity of resource allocation
* failures or errors in the command sent to the card.
@@ -890,10 +919,6 @@ ray_init_user(struct ray_softc *sc)
int i, ncom, error;
RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_STARTJOIN, "");
- RAY_MAP_CM(sc);
-
- if (sc->gone)
- return (ENXIO);
/*
* Create the following runq entries:
@@ -901,20 +926,18 @@ ray_init_user(struct ray_softc *sc)
* download - download the network to the card
* sj - find or start a BSS
* assoc - associate with a ESSID if needed
+ * mcast - force multicast list update
* promisc - force promiscuous mode update
- * mcast - force multicast list
*/
ncom = 0;
- com[ncom++] = RAY_COM_MALLOC(ray_init_download, 0);
- com[ncom++] = RAY_COM_MALLOC(ray_init_sj, 0);
+ com[ncom++] = RAY_COM_MALLOC(ray_init_download, RAY_COM_FCHKRUNNING);
+ com[ncom++] = RAY_COM_MALLOC(ray_init_sj, RAY_COM_FCHKRUNNING);
#if XXX_ASSOC /* XXX this test should be moved to preseve ioctl ordering */
if (sc->sc_d.np_net_type == RAY_MIB_NET_TYPE_INFRA)
- com[ncom++] = RAY_COM_MALLOC(ray_init_assoc, 0);
+ com[ncom++] = RAY_COM_MALLOC(ray_init_assoc, RAY_COM_FCHKRUNNING);
#endif /* XXX_ASSOC */
- com[ncom++] = RAY_COM_MALLOC(ray_promisc, 0);
-#if XXX_MCAST
com[ncom++] = RAY_COM_MALLOC(ray_mcast, 0);
-#endif /* XXX_MCAST */
+ com[ncom++] = RAY_COM_MALLOC(ray_promisc, 0);
error = ray_com_runq_add(sc, com, ncom, "rayinit");
@@ -947,12 +970,7 @@ runq_arr may fail:
eintr clean up and return
enxio clean up and return
-only difficult one is init sequence that should be aborted in download
- as commands complete before next one starts then
- init
- init is safe
-
- longer term need to attach a desired nw params to the runq entry
+ longer term need to attach a desired nw params to the runq entry
*/
return (error);
@@ -972,7 +990,8 @@ ray_init_download(struct ray_softc *sc, struct ray_comq_entry *com)
/*
* If card already running we don't need to download.
*/
- if (ifp->if_flags & IFF_RUNNING) {
+ if ((com->c_flags & RAY_COM_FCHKRUNNING) &&
+ (ifp->if_flags & IFF_RUNNING)) {
ray_com_runq_done(sc);
return;
}
@@ -1011,10 +1030,6 @@ ray_init_download(struct ray_softc *sc, struct ray_comq_entry *com)
sc->sc_havenet = 0;
sc->framing = SC_FRAMING_WEBGEAR;
- sc->sc_rxoverflow = 0;
- sc->sc_rxcksum = 0;
- sc->sc_rxhcksum = 0;
- sc->sc_rxnoise = 0;
/*
* Download the right firmware defaults
*/
@@ -1203,7 +1218,8 @@ ray_init_sj(struct ray_softc *sc, struct ray_comq_entry *com)
* XXX When we cope with errors and re-call this routine we
* XXX need better checking
*/
- if (ifp->if_flags & IFF_RUNNING) {
+ if ((com->c_flags & RAY_COM_FCHKRUNNING) &&
+ (ifp->if_flags & IFF_RUNNING)) {
ray_com_runq_done(sc);
return;
}
@@ -1259,7 +1275,7 @@ ray_init_sj_done(struct ray_softc *sc, size_t ccs)
*/
SRAM_READ_REGION(sc, ccs, &sc->sc_c.p_1, sizeof(struct ray_cmd_net));
- /* adjust values for buggy build 4 */
+ /* Adjust values for buggy build 4 */
if (sc->sc_c.np_def_txrate == 0x55)
sc->sc_c.np_def_txrate = sc->sc_d.np_def_txrate;
if (sc->sc_c.np_encrypt == 0x55)
@@ -1308,7 +1324,8 @@ ray_init_assoc(struct ray_softc *sc, struct ray_comq_entry *com)
* XXX When we cope with errors and re-call this routine we
* XXX need better checking
*/
- if (ifp->if_flags & IFF_RUNNING) {
+ if ((com->c_flags & RAY_COM_FCHKRUNNING) &&
+ (ifp->if_flags & IFF_RUNNING)) {
ray_com_runq_done(sc);
return;
}
@@ -1330,7 +1347,6 @@ ray_init_assoc_done(struct ray_softc *sc, size_t ccs)
RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_STARTJOIN, "");
RAY_COM_CHECK(sc, ccs);
- RAY_MAP_CM(sc);
/*
* Hurrah! The network is now active.
@@ -1362,10 +1378,6 @@ ray_stop_user(struct ray_softc *sc)
int error;
RAY_DPRINTF(sc, RAY_DBG_SUBR | RAY_DBG_STOP, "");
- RAY_MAP_CM(sc);
-
- if (sc->gone)
- return (ENXIO);
/*
* Schedule the real stop routine
@@ -1375,7 +1387,6 @@ ray_stop_user(struct ray_softc *sc)
error = ray_com_runq_add(sc, com, 1, "raystop");
/* XXX no real error processing from anything yet! */
-
if (error)
RAY_PRINTF(sc, "got error from ray_stop 0x%x", error);
@@ -1610,18 +1621,6 @@ ray_tx(struct ifnet *ifp)
return;
}
- /* XXX
- * I would much prefer to have the complete 802.11 packet dropped to
- * the bpf tap and then have a user land program parse the headers
- * as needed. This way, tcpdump -w can be used to grab the raw data. If
- * needed the 802.11 aware program can "translate" the .11 to ethernet
- * for tcpdump -r.
- *
- * XXX see /sys/dev/awi/awi.c:AWI_BPF_NORM stuff
- */
- if (ifp->if_bpf)
- bpf_mtap(ifp, m0);
-
/*
* Write the header according to network type etc.
*/
@@ -2125,8 +2124,6 @@ skip_read:
*/
ifp->if_ipackets++;
ray_rx_update_cache(sc, src, siglev, antenna);
- if (ifp->if_bpf)
- bpf_mtap(ifp, m0);
eh = mtod(m0, struct ether_header *);
m_adj(m0, sizeof(struct ether_header));
ether_input(ifp, eh, m0);
@@ -2620,67 +2617,31 @@ ray_intr_rcs(struct ray_softc *sc, u_int8_t cmd, size_t rcs)
RAY_CCS_FREE(sc, rcs);
}
-#if XXX_MCAST
-
-/*
- * XXX First cut at this code - have not tried compiling it yet. V. confusing
- * XXX interactions between allmulti, promisc and mcast. Going to leave it
- * XXX for now.
- * XXX Don't like the code bloat to set promisc up - we use it here, ray_init,
- * XXX ray_promisc_user and ray_upparams_user...
- * XXX need to use the runq_array
- */
-
/*
* User land entry to multicast list changes
*/
static int
ray_mcast_user(struct ray_softc *sc)
{
- struct ifnet *ifp = &sc->arpcom.ac_if;
struct ray_comq_entry *com[2];
- int error, count;
+ int error, ncom, i;
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
/*
- * The multicast list is only 16 items long so use promiscuous
- * mode if needed.
+ * Do all checking in the runq to preserve ordering.
*
- * We track this stuff even when not running.
+ * We run promisc to pick up changes to the ALL_MULTI
+ * interface flag.
*/
- for (ifma = ifp->if_multiaddrs.lh_first, count = 0; ifma != NULL;
- ifma = ifma->ifma_link.le_next, count++)
- if (count > 16)
- ifp->if_flags |= IFF_ALLMULTI;
- else if (ifp->if_flags & IFF_ALLMULTI)
- ifp->if_flags &= ~IFF_ALLMULTI;
-
- if (!(ifp->if_flags & IFF_RUNNING)) {
- return (0);
- }
-
ncom = 0;
- /*
- * If we need to change the promiscuous mode then do so.
- */
- if (sc->promisc != !!(ifp->if_flags & (IFF_PROMISC|IFF_ALLMULTI)))
- com[ncom++] = RAY_COM_MALLOC(ray_promisc, 0);
-
- /*
- * If we need to set the mcast list then do so.
- */
- if (!(ifp->if_flags & IFF_ALLMULTI))
- com[ncom++] = RAY_COM_MALLOC(ray_mcast, 0);
+ com[ncom++] = RAY_COM_MALLOC(ray_mcast, 0);
+ com[ncom++] = RAY_COM_MALLOC(ray_promisc, 0);
error = ray_com_runq_add(sc, com, ncom, "raymcast");
- if ((error == EINTR) || (error == ERESTART))
- return (error);
/* XXX no real error processing from anything yet! */
- error = com->c_retval;
-
for (i = 0; i < ncom; i++)
FREE(com[i], M_RAYCOM);
@@ -2689,6 +2650,9 @@ ray_mcast_user(struct ray_softc *sc)
/*
* Runq entry to setting the multicast filter list
+ *
+ * MUST always be followed by a call to ray_promisc to pick up changes
+ * to promisc flag
*/
static void
ray_mcast(struct ray_softc *sc, struct ray_comq_entry *com)
@@ -2696,12 +2660,40 @@ ray_mcast(struct ray_softc *sc, struct ray_comq_entry *com)
struct ifnet *ifp = &sc->arpcom.ac_if;
struct ifmultiaddr *ifma;
size_t bufp;
+ int count;
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
RAY_MAP_CM(sc);
+ /*
+ * If card not running we don't need to update this.
+ */
+ if (!(ifp->if_flags & IFF_RUNNING)) {
+ ray_com_runq_done(sc);
+ return;
+ }
+
+ /*
+ * The multicast list is only 16 items long so use promiscuous
+ * mode and don't bother updating the multicast list.
+ */
+ for (ifma = ifp->if_multiaddrs.lh_first, count = 0; ifma != NULL;
+ ifma = ifma->ifma_link.le_next, count++)
+ if (count == 0) {
+ ray_com_runq_done(sc);
+ return;
+ } else if (count > 16) {
+ ifp->if_flags |= IFF_ALLMULTI;
+ ray_com_runq_done(sc);
+ return;
+ } else if (ifp->if_flags & IFF_ALLMULTI)
+ ifp->if_flags &= ~IFF_ALLMULTI;
+
+ /*
+ * Kick the card
+ */
ray_ccs_fill(sc, com->c_ccs, RAY_CMD_UPDATE_MCAST);
- SRAM_WRITE_FIELD_1(sc, com->c_ccs
+ SRAM_WRITE_FIELD_1(sc, com->c_ccs,
ray_cmd_update_mcast, c_nmcast, count);
bufp = RAY_HOST_TO_ECF_BASE;
for (ifma = ifp->if_multiaddrs.lh_first; ifma != NULL;
@@ -2729,38 +2721,6 @@ ray_mcast_done(struct ray_softc *sc, size_t ccs)
ray_com_ecf_done(sc);
}
-#else
-static int ray_mcast_user(struct ray_softc *sc) {return (0);}
-static void ray_mcast(struct ray_softc *sc, struct ray_comq_entry *com) {}
-static void ray_mcast_done(struct ray_softc *sc, size_t ccs) {}
-#endif /* XXX_MCAST */
-
-/*
- * User land entry to promiscuous mode change
- */
-static int
-ray_promisc_user(struct ray_softc *sc)
-{
- struct ray_comq_entry *com[1];
- int error, ncom, i;
-
- RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
-
- ncom = 0;
- com[ncom++] = RAY_COM_MALLOC(ray_promisc, RAY_COM_FWOK);
-
- error = ray_com_runq_add(sc, com, ncom, "raypromisc");
- if ((error == EINTR) || (error == ERESTART))
- return (error);
-
- /* XXX no real error processing from anything yet! */
- error = com[0]->c_retval;
-
- for (i = 0; i < ncom; i++)
- FREE(com[i], M_RAYCOM);
-
- return (error);
-}
/*
* Runq entry to set/reset promiscuous mode
@@ -2769,16 +2729,28 @@ static void
ray_promisc(struct ray_softc *sc, struct ray_comq_entry *com)
{
struct ifnet *ifp = &sc->arpcom.ac_if;
+ int promisc = !!(ifp->if_flags & (IFF_PROMISC|IFF_ALLMULTI));
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
RAY_MAP_CM(sc);
+ /*
+ * If card not running or we already have the right flags
+ * we don't need to update this
+ */
+ if (!(ifp->if_flags & IFF_RUNNING) || (sc->sc_promisc == promisc)) {
+ ray_com_runq_done(sc);
+ return;
+ }
+
+ /*
+ * Kick the card
+ */
ray_ccs_fill(sc, com->c_ccs, RAY_CMD_UPDATE_PARAMS);
SRAM_WRITE_FIELD_1(sc, com->c_ccs,
ray_cmd_update, c_paramid, RAY_MIB_PROMISC);
SRAM_WRITE_FIELD_1(sc, com->c_ccs, ray_cmd_update, c_nparam, 1);
- SRAM_WRITE_1(sc, RAY_HOST_TO_ECF_BASE,
- !!(ifp->if_flags & (IFF_PROMISC|IFF_ALLMULTI)));
+ SRAM_WRITE_1(sc, RAY_HOST_TO_ECF_BASE, promisc);
ray_com_ecf(sc, com);
}
@@ -2789,17 +2761,11 @@ ray_promisc(struct ray_softc *sc, struct ray_comq_entry *com)
static int
ray_repparams_user(struct ray_softc *sc, struct ray_param_req *pr)
{
- struct ifnet *ifp = &sc->arpcom.ac_if;
struct ray_comq_entry *com[1];
int error, ncom, i;
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
- if (!(ifp->if_flags & IFF_RUNNING)) {
- pr->r_failcause = RAY_FAILCAUSE_EDEVSTOP;
- return (EIO);
- }
-
/*
* Test for illegal values or immediate responses
*/
@@ -2887,8 +2853,6 @@ ray_repparams_user(struct ray_softc *sc, struct ray_param_req *pr)
com[ncom-1]->c_pr = pr;
error = ray_com_runq_add(sc, com, ncom, "rayrepparams");
- if ((error == EINTR) || (error == ERESTART))
- return (error);
/* XXX no real error processing from anything yet! */
error = com[0]->c_retval;
@@ -2903,6 +2867,9 @@ ray_repparams_user(struct ray_softc *sc, struct ray_param_req *pr)
/*
* Runq entry to read the required parameter
+ *
+ * The card and driver are happy for parameters to be read
+ * whenever the card is plugged in
*/
static void
ray_repparams(struct ray_softc *sc, struct ray_comq_entry *com)
@@ -2910,8 +2877,10 @@ ray_repparams(struct ray_softc *sc, struct ray_comq_entry *com)
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
RAY_MAP_CM(sc);
+ /*
+ * Kick the card
+ */
ray_ccs_fill(sc, com->c_ccs, RAY_CMD_REPORT_PARAMS);
-
SRAM_WRITE_FIELD_1(sc, com->c_ccs,
ray_cmd_report, c_paramid, com->c_pr->r_paramid);
SRAM_WRITE_FIELD_1(sc, com->c_ccs, ray_cmd_report, c_nparam, 1);
@@ -2948,14 +2917,8 @@ ray_repparams_done(struct ray_softc *sc, size_t ccs)
static int
ray_repstats_user(struct ray_softc *sc, struct ray_stats_req *sr)
{
- struct ifnet *ifp = &sc->arpcom.ac_if;
-
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
- if (!(ifp->if_flags & IFF_RUNNING)) {
- return (EIO);
- }
-
sr->rxoverflow = sc->sc_rxoverflow;
sr->rxcksum = sc->sc_rxcksum;
sr->rxhcksum = sc->sc_rxhcksum;
@@ -2973,7 +2936,6 @@ ray_repstats_user(struct ray_softc *sc, struct ray_stats_req *sr)
static int
ray_upparams_user(struct ray_softc *sc, struct ray_param_req *pr)
{
- struct ifnet *ifp = &sc->arpcom.ac_if;
struct ray_comq_entry *com[3];
int i, todo, error, ncom;
#define RAY_UPP_SJ 0x1
@@ -2981,13 +2943,10 @@ ray_upparams_user(struct ray_softc *sc, struct ray_param_req *pr)
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
- if (!(ifp->if_flags & IFF_RUNNING)) {
- pr->r_failcause = RAY_FAILCAUSE_EDEVSTOP;
- return (EIO); /* XXX Use this for other IFF_RUNNING checks */
- }
-
/*
* Handle certain parameters specially
+ *
+ * XXX Do I want a field to skip start/join in the command?
*/
todo = 0;
pr->r_failcause = 0;
@@ -3001,15 +2960,11 @@ ray_upparams_user(struct ray_softc *sc, struct ray_param_req *pr)
return (EINVAL);
switch (pr->r_paramid) {
case RAY_MIB_NET_TYPE: /* Updated via START_NET JOIN_NET */
- if (sc->sc_c.np_net_type == *pr->r_data)
- return (0);
sc->sc_d.np_net_type = *pr->r_data;
todo |= RAY_UPP_SJ;
break;
case RAY_MIB_SSID: /* Updated via START_NET JOIN_NET */
- if (bcmp(sc->sc_c.np_ssid, pr->r_data, IEEE80211_NWID_LEN) == 0)
- return (0);
bcopy(pr->r_data, sc->sc_d.np_ssid, IEEE80211_NWID_LEN);
todo |= RAY_UPP_SJ;
break;
@@ -3017,15 +2972,11 @@ ray_upparams_user(struct ray_softc *sc, struct ray_param_req *pr)
case RAY_MIB_PRIVACY_MUST_START:/* Updated via START_NET */
if (sc->sc_c.np_net_type != RAY_MIB_NET_TYPE_ADHOC)
return (EINVAL);
- if (sc->sc_c.np_priv_start == *pr->r_data)
- return (0);
sc->sc_d.np_priv_start = *pr->r_data;
todo |= RAY_UPP_SJ;
break;
case RAY_MIB_PRIVACY_CAN_JOIN: /* Updated via START_NET JOIN_NET */
- if (sc->sc_c.np_priv_join == *pr->r_data)
- return (0);
sc->sc_d.np_priv_join = *pr->r_data;
todo |= RAY_UPP_SJ;
break;
@@ -3052,7 +3003,7 @@ ray_upparams_user(struct ray_softc *sc, struct ray_param_req *pr)
com[ncom++] = RAY_COM_MALLOC(ray_upparams, 0);
com[ncom-1]->c_pr = pr;
}
- if ((todo & RAY_UPP_SJ) && (ifp->if_flags & IFF_RUNNING)) {
+ if (todo & RAY_UPP_SJ) {
com[ncom++] = RAY_COM_MALLOC(ray_init_sj, 0);
#if XXX_ASSOC
if (sc->sc_d.np_net_type == RAY_MIB_NET_TYPE_INFRA)
@@ -3061,11 +3012,8 @@ ray_upparams_user(struct ray_softc *sc, struct ray_param_req *pr)
}
error = ray_com_runq_add(sc, com, ncom, "rayupparams");
- if ((error == EINTR) || (error == ERESTART))
- return (error);
/* XXX no real error processing from anything yet! */
-
error = com[0]->c_retval;
if (!error && pr->r_failcause)
error = EINVAL;
@@ -3078,6 +3026,12 @@ ray_upparams_user(struct ray_softc *sc, struct ray_param_req *pr)
/*
* Runq entry to update a parameter
+ *
+ * The card and driver are happy for parameters to be updated
+ * whenever the card is plugged in
+ *
+ * XXX the above is a little bit of a lie until _download is sorted out and we
+ * XXX keep local copies of things
*/
static void
ray_upparams(struct ray_softc *sc, struct ray_comq_entry *com)
@@ -3097,7 +3051,7 @@ ray_upparams(struct ray_softc *sc, struct ray_comq_entry *com)
}
/*
- * Complete the parameter update
+ * Complete the parameter update, note that promisc finishes up here too
*/
static void
ray_upparams_done(struct ray_softc *sc, size_t ccs)
@@ -3192,7 +3146,7 @@ ray_com_runq_add(struct ray_softc *sc, struct ray_comq_entry *com[], int ncom, c
RAY_DCOM(sc, RAY_DBG_COM, com[i], "adding");
TAILQ_INSERT_TAIL(&sc->sc_comq, com[i], c_chain);
}
- com[ncom-1]->c_flags = RAY_COM_FWOK;
+ com[ncom-1]->c_flags |= RAY_COM_FWOK;
/*
* Allocate ccs's for each command. If we fail, we bail
@@ -3642,7 +3596,7 @@ ray_res_alloc_am(struct ray_softc *sc)
}
/* Ensure attribute memory settings */
error = CARD_SET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
- SYS_RES_MEMORY, sc->am_rid, 1); /* XXX card_set_res_flags */
+ SYS_RES_MEMORY, sc->am_rid, PCCARD_A_MEM_ATTR); /* XXX card_set_res_flags */
if (error)
RAY_PRINTF(sc, "CARD_SET_RES_FLAGS returned 0x%0x", error);
sc->am_bsh = rman_get_bushandle(sc->am_res);
@@ -3673,7 +3627,9 @@ ray_res_alloc_am(struct ray_softc *sc)
static int
ray_res_alloc_cm(struct ray_softc *sc)
{
+#if XXX_8BIT
int error;
+#endif /* XXX_8BIT */
RAY_DPRINTF(sc, RAY_DBG_SUBR, "");
@@ -3684,11 +3640,13 @@ ray_res_alloc_cm(struct ray_softc *sc)
RAY_PRINTF(sc, "Cannot allocate common memory");
return (ENOMEM);
}
- /* Ensure 8bit access */
+ /* XXX Ensure 8bit access */
+#if XXX_8BIT
error = CARD_SET_RES_FLAGS(device_get_parent(sc->dev), sc->dev,
SYS_RES_MEMORY, sc->cm_rid, 2); /* XXX card_set_res_flags */
if (error)
RAY_PRINTF(sc, "CARD_SET_RES_FLAGS returned 0x%0x", error);
+#endif /* XXX_8BIT */
sc->cm_bsh = rman_get_bushandle(sc->cm_res);
sc->cm_bst = rman_get_bustag(sc->cm_res);
#if RAY_DEBUG & (RAY_DBG_CM | RAY_DBG_BOOTPARAM)
OpenPOWER on IntegriCloud