I have been experiencing the same behaviour for about 2 weeks now on Lenny (IPW3945, of course). Compiling and loading ipw3945 module version 1.2.2 patched by Alexander Sack for Ubuntu (look at the site LeTic pointed out) helps. I'm attaching a diff against vanilla 1.2.2 module sources.
diff -Nru ipw3945-1.2.2/ipw3945.c ipw3945.asac/ipw3945.c --- ipw3945-1.2.2/ipw3945.c 2007-09-13 21:27:41.000000000 +0200 +++ ipw3945.asac/ipw3945.c 2007-09-13 21:27:45.000000000 +0200 @@ -102,7 +102,7 @@ #define VQ #endif -#define IPW3945_VERSION "1.2.2" VD VM VP VR VQ +#define IPW3945_VERSION "1.2.2" VD VM VP VR VQ ".ubuntu1" #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 3945 Network Connection driver for Linux" #define DRV_COPYRIGHT "Copyright(c) 2003-2006 Intel Corporation" @@ -12223,11 +12223,18 @@ if (length == 0) { IPW_DEBUG_WX("Setting ESSID to ANY\n"); priv->config &= ~CFG_STATIC_ESSID; - priv->config |= CFG_ASSOCIATE; - if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) { + if((priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)) + && !(priv->config & CFG_ASSOCIATE)) { + IPW_DEBUG_ASSOC + ("Deassociating because OFF/ANY set with auto association" + " disabled.\n"); + ipw_disassociate(priv); + } + if ((priv->config & CFG_ASSOCIATE) && + !(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) { IPW_DEBUG_ASSOC ("Attempting to associate with new " - "parameters.\n"); + "parameters because auto association is enabled.\n"); ipw_associate(priv); } mutex_unlock(&priv->mutex); @@ -12239,6 +12246,7 @@ if (priv->essid_len == length && !memcmp(priv->essid, extra, length) && (priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING))) { IPW_DEBUG_WX("ESSID set to current ESSID.\n"); + queue_work(priv->workqueue, &priv->link_up); mutex_unlock(&priv->mutex); return 0; } @@ -12249,8 +12257,8 @@ memcpy(priv->essid, essid, priv->essid_len); /* Network configuration changed -- force [re]association */ IPW_DEBUG_ASSOC("[re]association triggered due to ESSID change.\n"); - if (!ipw_disassociate(priv)) - ipw_associate(priv); + ipw_disassociate(priv); + ipw_associate(priv); mutex_unlock(&priv->mutex); return 0;