summaryrefslogtreecommitdiffstats
path: root/sys/dev/ray/if_ray.c
diff options
context:
space:
mode:
authordmlb <dmlb@FreeBSD.org>2000-03-09 21:34:47 +0000
committerdmlb <dmlb@FreeBSD.org>2000-03-09 21:34:47 +0000
commit2859a2ebb1bad5fa3590094a7c7d98600781f4e6 (patch)
tree347c449b9f05fef9408ff9c3e6190dd30d48997f /sys/dev/ray/if_ray.c
parentd6841c128a6ab7392af6959116e7ce54a1797e24 (diff)
downloadFreeBSD-src-2859a2ebb1bad5fa3590094a7c7d98600781f4e6.zip
FreeBSD-src-2859a2ebb1bad5fa3590094a7c7d98600781f4e6.tar.gz
Use the ccs update command mechanism for dowloading parameters on startup
Diffstat (limited to 'sys/dev/ray/if_ray.c')
-rw-r--r--sys/dev/ray/if_ray.c170
1 files changed, 58 insertions, 112 deletions
diff --git a/sys/dev/ray/if_ray.c b/sys/dev/ray/if_ray.c
index 7a96b0d..3902bac 100644
--- a/sys/dev/ray/if_ray.c
+++ b/sys/dev/ray/if_ray.c
@@ -157,7 +157,7 @@
* we reset it in all the right places
* _unload - done
* recreated most of stop but as card is unplugged don't try and
- * access it
+ * access it to turn it off
* TX bpf - done
* RX bpf - done
* I would much prefer to have the complete 802.11 packet dropped to
@@ -165,18 +165,20 @@
* 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
+ * use std timeout code for download - done
+ * was mainly moving a call and removing a load of stuff in
+ * download_done as it duplicates check_ccs and ccs_done
+ * promisoius - done
*
- * XXX use std timeout code for download? should only be a move to ccs_done
- * when checked can remove some of the stuff in download_timo as it
- * duplicates check_ccs and ccs_done
- * XXX and changing mode etc.
* XXX add the start_join_net - i needed it anyway - what about the update
+ * can remove startccs and startcmd as those were used for the timeout
+ * XXX and changing mode etc.
*
- * promisoius
* multicast
* shutdown
* ifp->if_hdr length
* antennas and rxlevel
+ * _reset
*
* apm
*
@@ -190,9 +192,6 @@
* spinning in ray_issue_cmd
* fix the XXX code in start_join_done
*
- * command tracking - really needed? if not remove SCP_ stuff
- * will simplify ray_issue_cmd away
- *
* callout handles need rationalising. can probably remove timerh and
* use ccs_timerh for download and sj_timerh
*
@@ -204,7 +203,6 @@
*/
#define XXX 0
-#define XXX_DOWNLOAD_STD_TIMEOUT 0
#define XXX_MCAST 0
#define XXX_NETBSDTX 0
#define XXX_PROM 0
@@ -230,7 +228,6 @@
#define RAY_DEBUG 21
#endif
-#define RAY_DOWNLOAD_TIMEOUT (hz/2) /* Timeout for downloading startup parameters */
#define RAY_CCS_TIMEOUT (hz/2) /* Timeout for CCS commands */
#define RAY_CHECK_SCHED_TIMEOUT (hz) /* Time to wait until command retry, should be > RAY_CCS_TIMEOUT */
@@ -461,13 +458,8 @@ static struct ray_softc ray_softc[NRAY];
/* Update sub commands -- issues are serialized priority to LSB */
#define SCP_UPD_FIRST 0x0100
-#if XXX_DOWNLOAD_STD_TIMEOUT
#define SCP_UPD_STARTUP 0x0100
#define SCP_UPD_STARTJOIN 0x0200
-#else
-#define SCP_UPD_STARTUP 0
-#define SCP_UPD_STARTJOIN 0
-#endif /* XXX_DOWNLOAD_STD_TIMEOUT */
#define SCP_UPD_PROMISC 0x0400
#define SCP_UPD_MCAST 0x0800
#define SCP_UPD_UPDATEPARAMS 0x1000
@@ -499,8 +491,8 @@ static int ray_cmd_is_running __P((struct ray_softc *sc, int cmdf));
static int ray_cmd_is_scheduled __P((struct ray_softc *sc, int cmdf));
static void ray_cmd_ran __P((struct ray_softc *sc, int cmdf));
static void ray_cmd_schedule __P((struct ray_softc *sc, int cmdf));
+static void ray_download_done __P((struct ray_softc *sc));
static void ray_download_params __P((struct ray_softc *sc));
-static void ray_download_timo __P((void *xsc));
#if RAY_DEBUG > 50
static void ray_dump_mbuf __P((struct ray_softc *sc, struct mbuf *m, char *s));
#endif /* RAY_DEBUG > 50 */
@@ -635,9 +627,6 @@ static int ray_nsubcmdtab = sizeof(ray_subcmdtab) / sizeof(*ray_subcmdtab);
#ifndef RAY_CHECK_SCHED_TIMEOUT
#define RAY_CHECK_SCHED_TIMEOUT (hz)
#endif
-#ifndef RAY_DOWNLOAD_TIMEOUT
-#define RAY_DOWNLOAD_TIMEOUT (hz / 2)
-#endif
#ifndef RAY_RESET_TIMEOUT
#define RAY_RESET_TIMEOUT (10 * hz)
#endif
@@ -777,7 +766,6 @@ ray_pccard_unload (dev_p)
#else
untimeout(ray_check_ccs, sc, sc->ccs_timerh);
untimeout(ray_check_scheduled, sc, sc->ccs_timerh);
- untimeout(ray_download_timo, sc, sc->timerh);
untimeout(ray_reset_timo, sc, sc->timerh);
#endif /* RAY_USE_CALLOUT_STOP */
#if RAY_NEED_STARTJOIN_TIMO
@@ -979,17 +967,17 @@ ray_attach (dev_p)
* ray_init does a bit of house keeping before calling ray_download_params.
*
* ray_download_params fills the startup parameter structure out and
- * sends it to the card. The download command simply completes so we
- * use schedule a timeout function call to ray_download_timo instead
- * of spin locking. We pass the ccs in use via sc->sc_startcss.
+ * sends it to the card. The download command simply completes, so we
+ * use the timeout code in ray_check_ccs instead of spin locking. The
+ * passes flow to the standard ccs handler and we eventually end up in
+ * ray_download_done.
*
- * ray_download_timo checks the ccs for command completion and/or
- * errors. Then it tells the card to start an adhoc network or join a
- * managed network. This should complete via the interrupt mechanism,
- * but the NetBSD driver includes a timeout for some buggy stuff
- * somewhere - I've left the hooks in but don't use them. The interrupt
- * handler passes control to ray_start_join_done - the ccs is handled
- * by the interrupt mechanism.
+ * ray_download_done tells the card to start an adhoc network or join
+ * a managed network. This should complete via the interrupt
+ * mechanism, but the NetBSD driver includes a timeout for some buggy
+ * stuff somewhere - I've left the hooks in but don't use them. The
+ * interrupt handler passes control to ray_start_join_done - the ccs
+ * is handled by the interrupt mechanism.
*
* Once ray_start_join_done has checked the ccs and uploaded/updated
* the network parameters we are ready to process packets. It is then
@@ -1129,8 +1117,14 @@ ray_stop (sc)
/*
* Clear out timers and sort out driver state
*/
- untimeout(ray_download_timo, sc, sc->timerh);
+#if RAY_USE_CALLOUT_STOP
+ callout_stop(sc->ccs_timerh);
+ callout_stop(sc->timerh);
+#else
+ untimeout(ray_check_ccs, sc, sc->ccs_timerh);
+ untimeout(ray_check_scheduled, sc, sc->ccs_timerh);
untimeout(ray_reset_timo, sc, sc->timerh);
+#endif /* RAY_USE_CALLOUT_STOP */
#if RAY_NEED_STARTJOIN_TIMO
untimeout(ray_start_join_timo, sc, sc->sj_timerh);
#endif /* RAY_NEED_STARTJOIN_TIMO */
@@ -2214,14 +2208,9 @@ ray_ccs_done (sc, ccs)
switch (cmd) {
case RAY_CMD_START_PARAMS:
-#if XXX_DOWNLOAD_STD_TIMEOUT
- RAY_DPRINTFN(20, "ray%d: ray_ccs_done got START_PARAMS - why?\n",
- sc->unit);
- ray_cmd_done(sc, SCP_UPD_STARTUP);
- ray_download_timo(sc);
-#else
- printf("ray%d: ray_ccs_done got START_PARAMS - why?\n", sc->unit);
-#endif /* XXX_DOWNLOAD_STD_TIMEOUT */
+ RAY_DPRINTFN(20, ("ray%d: ray_ccs_done got START_PARAMS\n",
+ sc->unit));
+ ray_download_done(sc);
break;
case RAY_CMD_UPDATE_PARAMS:
@@ -2816,11 +2805,7 @@ ray_download_params (sc)
RAY_DPRINTFN(5, ("ray%d: Downloading startup parameters\n", sc->unit));
RAY_MAP_CM(sc);
-#if XXX_DOWNLOAD_STD_TIMEOUT
ray_cmd_cancel(sc, SCP_UPD_STARTUP);
-#else
- /* XXX cancel timeouts ? */
-#endif /* XXX_DOWNLOAD_STD_TIMEOUT */
#define MIB4(m) ray_mib_4_default.##m
#define MIB5(m) ray_mib_5_default.##m
@@ -2936,79 +2921,48 @@ PUT2(MIB5(mib_cw_min), RAY_MIB_CW_MIN_V5);
ray_write_region(sc, RAY_HOST_TO_ECF_BASE,
&ray_mib_5_default, sizeof(ray_mib_5_default));
- /*
- * Get a free command ccs and issue the command - there is nothing
- * to fill in for a START_PARAMS command. The start parameters
- * command just gets serviced, so we use a timeout to complete the
- * sequence.
- */
-#if XXX_DOWNLOAD_STD_TIMEOUT
if (!ray_simple_cmd(sc, RAY_CMD_START_PARAMS, SCP_UPD_STARTUP))
printf("ray%d: ray_download_params can't issue command\n", sc->unit);
-#else
-/* XXX do we go back to using the std. timeout code? */
-/* XXX use ray_simple_cmd */
- if (!ray_alloc_ccs(sc, &sc->sc_startccs,
- RAY_CMD_START_PARAMS, SCP_UPD_STARTUP)) {
- printf("ray%d: ray_download_params can't get a CCS\n", sc->unit);
- ray_reset(sc);
- }
- if (!ray_issue_cmd(sc, sc->sc_startccs, SCP_UPD_STARTUP)) {
- printf("ray%d: ray_download_params can't issue command\n", sc->unit);
- ray_reset(sc);
- }
-/* XXX use ray_simple_cmd */
-/* XXX do we go back to using the std. timeout code? */
- sc->timerh = timeout(ray_download_timo, sc, RAY_DOWNLOAD_TIMEOUT);
-#endif /* XXX_DOWNLOAD_STD_TIMEOUT */
- RAY_DPRINTFN(15, ("ray%d: Download now awaiting timeout\n", sc->unit));
+ RAY_DPRINTFN(15, ("ray%d: Download now awaiting completion\n", sc->unit));
return;
}
/*
- * Download timeout routine.
+ * Download completion routine.
*
* Part of ray_init, download, start_join control flow.
+ *
+ * As START_PARAMS is an update command ray_check_ccs has checked the
+ * ccs status and re-scheduled timeouts if needed.
*/
static void
-ray_download_timo (xsc)
- void *xsc;
+ray_download_done (sc)
+ struct ray_softc *sc;
{
- struct ray_softc *sc = xsc;
- size_t ccs;
- u_int8_t status, cmd;
+ size_t ccs;
+ int cmd;
- RAY_DPRINTFN(5, ("ray%d: ray_download_timo\n", sc->unit));
+ RAY_DPRINTFN(5, ("ray%d: ray_download_done\n", sc->unit));
RAY_MAP_CM(sc);
- status = SRAM_READ_FIELD_1(sc, sc->sc_startccs, ray_cmd, c_status);
- cmd = SRAM_READ_FIELD_1(sc, sc->sc_startccs, ray_cmd, c_cmd);
- RAY_DPRINTFN(20, ("ray%d: check rayidx %d ccs 0x%x cmd 0x%x status %d\n",
- sc->unit, RAY_CCS_INDEX(sc->sc_startccs), sc->sc_startccs,
- cmd, status));
- if ((cmd != RAY_CMD_START_PARAMS) ||
- ((status != RAY_CCS_STATUS_FREE) && (status != RAY_CCS_STATUS_BUSY))
- ) {
- printf("ray%d: Download ccs odd cmd = 0x%02x, status = 0x%02x\n",
- sc->unit, cmd, status);
- ray_init(sc);
- }
+ ray_cmd_done(sc, SCP_UPD_STARTUP);
- /*
- * If the card is still busy, re-schedule ourself
- */
- if (status == RAY_CCS_STATUS_BUSY) {
- RAY_DPRINTFN(1, ("ray%d: ray_download_timo still busy, re-schedule\n",
- sc->unit));
- sc->timerh = timeout(ray_download_timo, sc, RAY_DOWNLOAD_TIMEOUT);
- return;
- }
+#if XXX_NETBSD
+ /* start network */
+ ray_cmd_done(sc, SCP_UPD_STARTUP);
- /* Clear the ccs */
- (void)ray_free_ccs(sc, sc->sc_startccs);
- sc->sc_startccs = RAY_CCS_LAST + 1;
+ /* ok to start queueing packets */
+ sc->sc_if.if_flags &= ~IFF_OACTIVE;
+
+ sc->sc_omode = sc->sc_mode;
+ memcpy(sc->sc_cnwid, sc->sc_dnwid, sizeof(sc->sc_cnwid));
+
+ rcmd = ray_start_join_net;
+#endif /* XXX_NETBSD */
+
+ /* XXX use start_join_net when included? */
/*
* Grab a ccs and don't bother updating the network parameters.
@@ -3020,25 +2974,21 @@ ray_download_timo (xsc)
cmd = RAY_CMD_JOIN_NET;
if (!ray_alloc_ccs(sc, &ccs, cmd, SCP_UPD_STARTJOIN)) {
- printf("ray%d: ray_download_timo can't get a CCS to start/join net\n",
+ printf("ray%d: ray_download_done can't get a CCS to start/join net\n",
sc->unit);
ray_reset(sc);
}
-
- SRAM_WRITE_FIELD_1(sc, ccs, ray_cmd_net, c_upd_param, 0);
-
if (!ray_issue_cmd(sc, ccs, SCP_UPD_STARTJOIN)) {
- printf("ray%d: ray_download_timo can't issue start/join\n", sc->unit);
+ printf("ray%d: ray_download_done can't issue start/join\n", sc->unit);
ray_reset(sc);
}
+ RAY_DPRINTFN(15, ("ray%d: Start-join awaiting interrupt\n",
+ sc->unit));
#if RAY_NEED_STARTJOIN_TIMO
sc->sj_timerh = timeout(ray_start_join_timo, sc, RAY_SJ_TIMEOUT);
#endif /* RAY_NEED_STARTJOIN_TIMO */
- RAY_DPRINTFN(15, ("ray%d: Start-join awaiting interrupt/timeout\n",
- sc->unit));
-
return;
}
@@ -3142,11 +3092,7 @@ ray_start_join_done (sc, ccs, status)
untimeout(ray_start_join_timo, sc, sc->sj_timerh);
#endif /* RAY_NEED_STARTJOIN_TIMO */
-#if XXX_DOWNLOAD_STD_TIMEOUT
ray_cmd_done(sc, SCP_UPD_STARTJOIN);
-#else
- /* XXX cancel timeouts ? */
-#endif /* XXX_DOWNLOAD_STD_TIMEOUT */
/*
* XXX This switch and the following test are badly done. I
@@ -3211,7 +3157,7 @@ ray_start_join_done (sc, ccs, status)
sc->unit);
#if XXX
restart ray_start_join sequence
- may need to split download_timo for this
+ may need to split download_done for this
#endif
}
}
OpenPOWER on IntegriCloud