diff -urpN acx100-0.2.0pre8_plus_fixes_43/include/acx100_helper.h acx100-0.2.0pre8_plus_fixes_43_patched/include/acx100_helper.h
--- acx100-0.2.0pre8_plus_fixes_43/include/acx100_helper.h	2004-12-05 15:58:53.000000000 +0100
+++ acx100-0.2.0pre8_plus_fixes_43_patched/include/acx100_helper.h	2005-04-03 19:28:14.000000000 +0200
@@ -417,7 +417,7 @@ typedef struct ie_dot11WEPDefaultKey {
 
 typedef struct acx111WEPDefaultKey {
     UINT8	MacAddr[ETH_ALEN] ACX_PACKED;
-    UINT8	action ACX_PACKED;
+    UINT16	action ACX_PACKED;
     UINT16	reserved ACX_PACKED;
     UINT8	keySize ACX_PACKED;
     UINT8	type ACX_PACKED;
diff -urpN acx100-0.2.0pre8_plus_fixes_43/src/acx100_conv.c acx100-0.2.0pre8_plus_fixes_43_patched/src/acx100_conv.c
--- acx100-0.2.0pre8_plus_fixes_43/src/acx100_conv.c	2004-12-05 15:58:54.000000000 +0100
+++ acx100-0.2.0pre8_plus_fixes_43_patched/src/acx100_conv.c	2005-04-03 22:07:12.000000000 +0200
@@ -217,6 +217,21 @@ int acx_ether_to_txdesc(wlandevice_t *pr
 	if ((unsigned long)0xffffffff == (unsigned long)header) /* FIXME: happens on card eject; better method? */
 		return NOT_OK;
 	payload = tx_desc->fixed_size.s.host_desc + 1;
+
+	/* to send raw packets */
+
+	if (priv->monitor == 2 && priv->chip_type == CHIPTYPE_ACX111)
+	{
+	    header->length = cpu_to_le16(WLAN_HDR_A3_LEN + sizeof(wlan_llc_t) + sizeof(wlan_snap_t));
+	    memcpy(header->data, skb->data, le16_to_cpu(header->length));
+	    payload->length = cpu_to_le16(skb->len - le16_to_cpu(header->length));
+	    memcpy(payload->data, skb->data + le16_to_cpu(header->length), le16_to_cpu(payload->length));
+	    header->data_offset = 0;
+	    payload->data_offset = 0;
+	    tx_desc->total_length = cpu_to_le16(le16_to_cpu(header->length) + le16_to_cpu(payload->length));
+	}
+	else /* usual conversion */
+	{
 	e_hdr = (wlan_ethhdr_t *)skb->data;
 
 	/* step 1: classify ether frame, DIX or 802.3? */
@@ -307,6 +322,7 @@ int acx_ether_to_txdesc(wlandevice_t *pr
 	w_hdr->a3.fc = fc;
 	w_hdr->a3.dur = 0;
 	w_hdr->a3.seq = 0;
+	} /* end of usual conversion */
 
 	/* the "<6>" output is from the KERN_INFO channel value */
 	/* Can be used to debug conversion process */
@@ -411,7 +427,7 @@ fail:
 		saddr = w_hdr->a4.a4;
 	}
 	
-	if (0 != WLAN_GET_FC_ISWEP(fc)) {
+	if (0 != WLAN_GET_FC_ISWEP(fc) && priv->chip_type != CHIPTYPE_ACX111) {
 		/* chop off the IV+ICV WEP header and footer */
 		acxlog(L_DATA | L_DEBUG, "rx: it's a WEP packet, chopping off IV and ICV.\n");
 		payload_length -= 8;
diff -urpN acx100-0.2.0pre8_plus_fixes_43/src/acx100_helper.c acx100-0.2.0pre8_plus_fixes_43_patched/src/acx100_helper.c
--- acx100-0.2.0pre8_plus_fixes_43/src/acx100_helper.c	2004-12-05 15:58:54.000000000 +0100
+++ acx100-0.2.0pre8_plus_fixes_43_patched/src/acx100_helper.c	2005-04-03 21:44:28.000000000 +0200
@@ -1537,7 +1537,7 @@ void acx111_set_wepkey( wlandevice_t *pr
     if ( priv->wep_keys[i].size != 0 ) {
       acxlog(L_INIT, "Setting WEP key: %d with size: %d\n", i, priv->wep_keys[i].size);
       memset(&dk, 0, sizeof(dk));
-      dk.action = 1;            /* add key */
+      dk.action = cpu_to_le16(1); /* add key */
       dk.keySize = priv->wep_keys[i].size;
 
     /* are these two lines necessary? */
diff -urpN acx100-0.2.0pre8_plus_fixes_43/src/acx100_ioctl.c acx100-0.2.0pre8_plus_fixes_43_patched/src/acx100_ioctl.c
--- acx100-0.2.0pre8_plus_fixes_43/src/acx100_ioctl.c	2004-12-05 15:58:54.000000000 +0100
+++ acx100-0.2.0pre8_plus_fixes_43_patched/src/acx100_ioctl.c	2005-04-03 22:15:14.000000000 +0200
@@ -2269,6 +2269,7 @@ end:
 static inline int acx_ioctl_wlansniff(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra)
 {
 	wlandevice_t *priv = (wlandevice_t *) dev->priv;
+	struct ACX111FeatureConfig featureconfig;
 	int *params = (int*)extra;
 	int enable = (int)(params[0] > 0);
 	unsigned long flags;
@@ -2300,10 +2301,27 @@ static inline int acx_ioctl_wlansniff(st
 		break;
 	}
 
+	if (priv->chip_type == CHIPTYPE_ACX111)
+		acx111_get_feature_config(priv, &featureconfig);
+
 	if (0 != priv->monitor)
+	{
 		priv->monitor_setting = 0x02; /* don't decrypt default key only, override decryption mechanism */
+		if (priv->chip_type == CHIPTYPE_ACX111) /* disable encryption */
+		{
+		    SET_BIT(featureconfig.data_flow_options, cpu_to_le32(0x81));
+		    acx111_set_feature_config(priv, &featureconfig);
+		}
+	}
 	else
+	{
 		priv->monitor_setting = 0x00; /* don't decrypt default key only, don't override decryption */
+		if (priv->chip_type == CHIPTYPE_ACX111) /* enable encryption */
+		{
+		    CLEAR_BIT(featureconfig.data_flow_options, cpu_to_le32(0x81));
+		    acx111_set_feature_config(priv, &featureconfig);
+		}
+	}
 
 	acx_initialize_rx_config(priv, priv->monitor);
 	SET_BIT(priv->set_mask, SET_RXCONFIG | SET_WEP_OPTIONS);
