Intel® PRO/Wireless 3945ABG Driver for Linux
an open source 802.11a/b/g driver for the Intel PRO/Wireless 3945ABG Network Connection - main | downloads | news Logo

Note, this project is deprecated. The development is switched to the iwlwifi project (no binary daemon required!).

You can find the iwlwifi project from Intel Wireless WiFi Link drivers for Linux*.

This project was created by Intel to enable support for the Intel PRO/Wireless 3945ABG Network Connection adapter. This project (IPW3945) is intended to be a community effort as much as is possible. As with our other wireless adapters, there are some working constraints related to documentation we can make publicly available.

The 1.1.0 stable version (any version ending in .0 is 'stable') is available from Intel's Laptop Products page.

If you would like to try a newer unstable/development version, first view this notice and then look below for links to download and use the development snapshots available from this project.

As always, please send feedback, bug reports, feature requests and any fixes you come up with. Please let us know which distribution you use this with, and any problems you encounter.

You can submit bugs to the Bugzilla repository available at BugHost.

Other Intel wireless project pages:
Intel PRO/Wireless 2100 Network Connection
Intel PRO/Wireless 2200BG Network Connection
Intel PRO/Wireless 2915ABG Network Connection

In order to use the Intel PRO/Wireless 3945ABG Network Connection driver for Linux you will need the following:

  1. The binary microcode image, available here.
  2. The binary user space regulatory daemon, available here.
  3. The ieee80211 subsystem version 1.1.11 or newer.
  4. Linux kernel 2.6.13 or newer. See README.ipw3945 for information on specific options required to be enabled in the kernel.
  5. Wireless Extensions (v17) and Tools (v28)
  6. For WPA you need a WPA supplicant compatible with the latest versions of the wireless extensions (v18 and newer).
For instructions on how to build and use the driver, please see the INSTALL document.

We have put up a development mailing list to help in development.

You can frequently find people on IRC channel #ipw2100 on

The following are links to projects, archives, and other sites that may be of use to Intel PRO/Wireless 3945ABG Network Connection users:

Packages (not maintained by ipw3945 project):

Jul 31 2007 Changes in 1.2.2
  • update Kconfig with kernel WLAN_80211 change
  • replace SA_SHIRQ with IRQF_SHARED
  • fix typo in Kconfig
  • remove inta access from tasklet
  • Tune IPW_PACKET_RETRY_TIME from 1 second to 5 second

Apr 30 2007 Changes in 1.2.1
  • Fix driver not make associate request when required
  • Fix iwconfig essid any doesn't associate problem
  • Fix ipw_associate_network() debug log bug
  • Fix ifconfig reports Link-encap as Ether (thanks to Jason)
  • Fix soft lockup during driver load time
  • Add Makefile warning if a different SHELL other than bash is used
  • Use the correct variable to print the direct scan essid
  • Fix a kernel Oops bug #1248
  • Fix hardware/software RF kill switch problem during module loading time

Jan 05 2007 Changes in 1.2.0
  • Workqueue rework for kernel 2.6.20 and above
  • WE-21 ESSID fix
  • Event log output enhancement

Dec 08 2006 Changes in 1.1.3
  • Fixed problem with newer kernels and config.h vs. autoconf.h
  • Fixed problem with IEEE80211 API compatibility build issues.
  • Fixed #1096 problem with soft lockup while loading if RF kill active.
  • Fixed compile warning ignoring pci_enable_device's return code.
  • Added retransmission of association and authentication requests if no response received.
  • Changed the make target install_for_testing to install.

Nov 01 2006 Changes in 1.1.2
  • Fixed #972 problem with wpa_supplicant not selecting hidden APs
  • Fixed #1113 problem with compiling against ieee80211-1.1.14
  • Fixed #1146 problem with last character of SSID being dropped.
  • Fixed #1089 circular locking dependency during register_netdev
  • Fixed #1090 problem with setting rate while not associated.
  • Fixed #1098 possible memory corruption on 64-bit systems

[ more ]

The version numbers used for the snapshots indicate whether a release is a stable release (ends in .0), or an unstable development release (does not end in .0).

For example, 1.0.0 is stable, 1.0.1 is a development snapshot/release.

Only fully tested and verified drivers should be used and deployed by end users. The development and unstable snapshots are intended only for development and testing. For more information, please see this notice.

Date Download md5sum Comments
2007-Jul-31 ipw3945-1.2.2.tgz 9e5ca2f3ffbb84270ede45d5572df4c9 ipw3945-1.2.2.tgz
2007-Apr-30 ipw3945-1.2.1.tgz 9d6b2116122beb33a0d1d923ea49065c ipw3945-1.2.1.tgz
2007-Jan-05 ipw3945-1.2.0.tgz fd4cc3b52b8e1d4d1e303d30c9dcd31b ipw3945-1.2.0.tgz Stable
2006-Dec-08 ipw3945-1.1.3.tgz 2cca7c91ea4c89e72e2b8be96973a7f7 ipw3945-1.1.3.tgz
2006-Nov-01 ipw3945-1.1.2.tgz 9b215a875818154ade298b9180fe241c ipw3945-1.1.2.tgz
2006-Jul-14 ipw3945-1.1.1.tgz 91bf3a11745d8e0e0a5ac063e47e07d6 ipw3945-1.1.1.tgz
2006-Jul-14 ipw3945-1.1.0.tgz 1f393d7a080879dba1a824dec251d71e ipw3945-1.1.0.tgz Stable
2006-Jun-26 ipw3945-1.1.0-pre2.tgz c4c42572e88d5606ba1dc9383e56061d ipw3945-1.1.0-pre2.tgz
2006-Jun-26 ipw3945-1.0.12.tgz 54fc22a21bb519e9d0df8915fcdf6a8a ipw3945-1.0.12.tgz
2006-Jun-23 ipw3945-1.0.11.tgz f9e6074031a2bb10ab49da9daa3faf75 ipw3945-1.0.11.tgz
[ more ]

Problems building with kernel v2.6.20
The work queue structure changed with 2.6.20. In addition, pci_module_init was deprecated. The three patches below in Patches were provided by Mattiaa Dongili to correct this behavior. Download them and apply them to ipw3945-1.1.3 James

[PATCH] Fix ipw3945 for 2.6.22 onwards on 64bit archs: patch
In 2.6.22 onwards (since git commit 27a884dc3cb63b93c2b3b643f5b31eed5f8a4d26),
on 64bit archs, skb->tail is no more a pointer, but just an offset from
skb->head, and an appropriate wrapper (skb_tail_pointer(skb)) must be used.

See the following snippet from include/linux/skbuff.h:

static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
return skb->head + skb->tail;

For older kernel releases, an appropriate default definition of the kernel
offset is given in ipw3945.h.

Signed-off-by: Paolo 'Blaisorblade' Giarrusso <>

Index: ipw3945-1.2.2/ipw3945.c
--- ipw3945-1.2.2.orig/ipw3945.c
+++ ipw3945-1.2.2/ipw3945.c
@@ -14928,7 +14928,7 @@ static inline void ipw_build_tx_cmd_hwcr
tx_cmd->sec_ctl = TX_CMD_SEC_TKIP;

if (last_frag)
-			memcpy(tx_cmd->tkip_mic.byte, skb_frag->tail - 8, 8);
+			memcpy(tx_cmd->tkip_mic.byte, skb_tail_pointer(skb_frag) - 8, 8);
memset(tx_cmd->tkip_mic.byte, 0, 8);

Index: ipw3945-1.2.2/ipw3945.h
--- ipw3945-1.2.2.orig/ipw3945.h
+++ ipw3945-1.2.2/ipw3945.h
@@ -76,6 +76,13 @@ typedef void irqreturn_t;
#include <linux/mutex.h>

+static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)
+	return skb->tail;

Fix potential driver lockup problem: patch
Since we have already store the inta to priv->isr_inta in the
interrupt handler we don't need to get it from the hardware again
in the tasklet. Some people find ipw3945-1.2.1 still didn't
resolve the boot lockup problem as reported in bugzilla #1096.

If you still find the lockup problem in ipw3945-1.2.1, please try
this patch and report if it resolves your problem or not to

Thanks to Egon for providing this patch!

Signed-off-by: Egon <>
Signed-off-by: Zhu Yi <>

--- a/ipw3945.c	2007-04-11 14:46:58.000000000 +0800
+++ b/ipw3945.c	2007-05-14 15:55:56.000000000 +0800
@@ -2769,8 +2769,8 @@ static void ipw_irq_tasklet(struct ipw_p

spin_lock_irqsave(&priv->lock, flags);

-	inta = ipw_read32(priv, CSR_INT);
-	inta_mask = ipw_read32(priv, CSR_INT_MASK);
+	inta = 0;
+	inta_mask = 0;
ipw_write32(priv, CSR_INT, inta);
inta &= (CSR_INI_SET_MASK & inta_mask);

[PATCH 1/1] Change call to the deprecated pci_driver_init to pci_register_driver.: patch
Change call to the deprecated pci_driver_init to pci_register_driver.

Signed-off-by: Mattia Dongili <>
ipw3945.c |    2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

bogus character appended to ESSID: patch

On a Fedora Core 6 box (WE-20) with wireless-tools both v28 and v29 I’m
seeing a bogus character appended to ESSID on iwconfig output since

The reason seems to be the patch in bug #1146, which I guess has a typo
that attached patch fixes.



diff -Nupr ipw3945/ipw3945.c ipw3945-new/ipw3945.c
--- ipw3945/ipw3945.c	2006-12-08 19:33:45.000000000 +0200
+++ ipw3945-new/ipw3945.c	2006-12-15 01:08:29.000000000 +0200
@@ -12210,7 +12210,7 @@ static int ipw_wx_get_essid(struct net_d
IPW_DEBUG_WX("Getting essid: '%s'\n",
escape_essid(priv->essid, priv->essid_len));
memcpy(extra, priv->essid, priv->essid_len);
-		wrqu->essid.length = priv->essid_len + IW_ESSID_FIX;
+		wrqu->essid.length = priv->essid_len;
wrqu->essid.flags = 1;	/* active */
} else {
IPW_DEBUG_WX("Getting essid: ANY\n");

[PATCH 2/2] workqueue rework: patch
Delayed works and normal works have been split to allow smaller memory
usage. Use struct delayed_work where necessary.

Signed-off-by: Mattia Dongili <>
ipw3945.c |  106 +++++++++++++++++++++++++++++++++----------------------------
ipw3945.h |   27 ++++++++-------
2 files changed, 71 insertions(+), 62 deletions(-)

[PATCH 1/2] workqueue rework: patch
INIT_WORK now takes 2 arguments and we can get the user data through the
container_of macro.

Signed-off-by: Mattia Dongili <>
ipw3945.c |  198 ++++++++++++++++++++++++++++++-------------------------------
1 files changed, 98 insertions(+), 100 deletions(-)

If you have any questions, concerns, etc. please email
Last Updated: May 07 2012