PERFORCE change 123165 for review

Andrew Thompson thompsa at FreeBSD.org
Mon Jul 9 01:39:06 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=123165

Change 123165 by thompsa at thompsa_heff on 2007/07/09 01:38:17

	- mised the *.h files in the last submit
	- remove debug printf

Affected files ...

.. //depot/projects/wifi/sys/dev/ipw/if_ipw.c#22 edit
.. //depot/projects/wifi/sys/dev/ipw/if_ipwreg.h#4 edit
.. //depot/projects/wifi/sys/dev/ipw/if_ipwvar.h#6 edit

Differences ...

==== //depot/projects/wifi/sys/dev/ipw/if_ipw.c#22 (text+ko) ====

@@ -339,7 +339,6 @@
 	val <<= 1;
 	for (i = 1; i < 16; i++) {
 		if (val & (1 << i)) {
-			printf("adding channel %d\n",i);
 			c = &ic->ic_channels[ic->ic_nchans++];
 			c->ic_freq = ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
 			c->ic_flags = IEEE80211_CHAN_B;

==== //depot/projects/wifi/sys/dev/ipw/if_ipwreg.h#4 (text+ko) ====


==== //depot/projects/wifi/sys/dev/ipw/if_ipwvar.h#6 (text+ko) ====

@@ -90,21 +90,20 @@
 	device_t		sc_dev;
 
 	struct mtx		sc_mtx;
+	struct mtx		sc_cmdlock;
+	char			sc_cmdname[12];	/* e.g. "ipw0_cmd" */
 	struct taskqueue	*sc_tq;		/* private task queue */
 #if __FreeBSD_version < 700000
 	struct proc		*sc_tqproc;
 #endif
+	struct task		sc_opstask;
 	struct task		sc_radiontask;	/* radio on processing */
 	struct task		sc_radiofftask;	/* radio off processing */
-	struct task		sc_scanstarttask;/* scan start processing */
 	struct task		sc_assoclosttask;/* assoc lost processing */
-	struct task		sc_assoctask;	/* assoc lost processing */
-	struct task		sc_downtask;	/* disassociate processing */
 	struct task		sc_restarttask;	/* restart adapter processing */
 	struct callout		sc_wdtimer;	/* watchdog timer */
 
 	uint32_t		flags;
-#define	IPW_FLAG_FW_LOADING	0x00000001	/* firmware being setup */
 #define	IPW_FLAG_FW_INITED	0x00000002	/* firmware initialized */
 #define	IPW_FLAG_SCANNING	0x00000004	/* busy scanning */
 #define	IPW_FLAG_BUSY		0x00000008	/* busy sending a command */
@@ -112,6 +111,12 @@
 #define	IPW_FLAG_ENABLED	0x00000020	/* adapter enabled */
 #define	IPW_FLAG_HAS_RFSWITCH	0x00010000	/* rfkill switch present */
 #define	IPW_FLAG_HACK		0x00020000
+	uint32_t		fw_state;
+#define IPW_FW_IDLE		0
+#define IPW_FW_LOADING		1
+#define IPW_FW_ASSOCIATING	2
+#define IPW_FW_DISASSOCIATING	3
+#define IPW_FW_SCANNING		4
 
 	int			irq_rid;
 	int			mem_rid;
@@ -164,13 +169,22 @@
 	uint32_t		rxcur;
 	int			txfree;
 
-	int			curchan;	/* current h/w channel # */
+	int			chanmask;	/* supported channels */
 	int			dwelltime;
 
 	int			sc_tx_timer;
 	int			sc_rfkill_timer;/* poll for rfkill change */
 	int			sc_scan_timer;	/* scan request timeout */
+	int			sc_state_timer;
 
+#define IPW_SCAN_START		(1 << 0)
+#define IPW_SET_CHANNEL	        (1 << 1)
+#define	IPW_ASSOC		(1 << 2)
+#define	IPW_DISASSOC		(1 << 3)
+#define	IPW_CMD_MAXOPS		10
+	int                     sc_cmd[IPW_CMD_MAXOPS];
+	int                     sc_cmd_cur;    /* current queued scan task */
+	int                     sc_cmd_next;   /* last queued scan task */
 	struct bpf_if		*sc_drvbpf;
 
 	union {
@@ -187,3 +201,46 @@
 #define sc_txtap	sc_txtapu.th
 	int			sc_txtap_len;
 };
+
+#define	IPW_STATE_BEGIN(_sc, _state)	do {			\
+	KASSERT(_sc->fw_state == IPW_FW_IDLE,			\
+	    ("ipw firmware not idle"));				\
+	_sc->fw_state = _state;					\
+	_sc->sc_state_timer = 5;				\
+	DPRINTF(("enter FW state %d\n",	_state));		\
+} while (0)
+
+#define	IPW_STATE_END(_sc, _state)	do {			\
+	if (_sc->fw_state == _state)				\
+		DPRINTF(("exit FW state %d\n", _state));	\
+	 else							\
+		DPRINTF(("expected FW state %d, got %d\n",	\
+			    _state, _sc->fw_state));		\
+	_sc->fw_state = IPW_FW_IDLE;				\
+	wakeup(_sc);						\
+	_sc->sc_state_timer = 0;				\
+} while (0)
+
+/*
+ * NB.: This models the only instance of async locking in ipw_init_locked
+ *	and must be kept in sync.
+ */
+#define	IPW_LOCK_DECL	int	__waslocked = 0
+#define IPW_LOCK(sc)	do {				\
+	if (!(__waslocked = mtx_owned(&(sc)->sc_mtx)))	\
+		mtx_lock(&sc->sc_mtx);			\
+} while (0)
+#define IPW_UNLOCK(sc)	do {				\
+	if (!__waslocked)				\
+		mtx_unlock(&sc->sc_mtx);		\
+} while (0)
+#define IPW_LOCK_ASSERT(sc)	mtx_assert(&(sc)->sc_mtx, MA_OWNED)
+#define	IPW_CMD_LOCK_INIT(sc) do { \
+	snprintf((sc)->sc_cmdname, sizeof((sc)->sc_cmdname), "%s_cmd", \
+		device_get_nameunit((sc)->sc_dev)); \
+	mtx_init(&(sc)->sc_cmdlock, (sc)->sc_cmdname, NULL, MTX_DEF); \
+} while (0)
+#define	IPW_CMD_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->sc_cmdlock)
+#define	IPW_CMD_LOCK(sc)		mtx_lock(&(sc)->sc_cmdlock)
+#define	IPW_CMD_UNLOCK(sc)		mtx_unlock(&(sc)->sc_cmdlock)
+


More information about the p4-projects mailing list