--- /dev/null
+--- zd1211-4916-r0/src/zd1205.h.orig 2005-01-28 22:55:15.000000000 -0800
++++ zd1211-4916-r0/src/zd1205.h 2005-03-04 13:41:16.879006208 -0800
+@@ -611,6 +611,9 @@
+ ***************************************************************************/\r
+ struct driver_stats {\r
+ struct net_device_stats net_stats;\r
++#ifdef CONFIG_NET_WIRELESS
++ struct iw_statistics iw_stats;
++#endif
+ unsigned long tx_late_col;\r
+ unsigned long tx_ok_defrd;\r
+ unsigned long tx_one_retry;\r
+--- zd1211-4916-r0/src/zd1205.c.orig 2005-03-03 18:43:48.000000000 -0800
++++ zd1211-4916-r0/src/zd1205.c 2005-03-04 13:45:07.134002128 -0800
+@@ -4196,6 +4196,42 @@
+ return &(macp->drv_stats.net_stats);\r
+ }\r
+ \r
++/**
++ * zd1205wext_iw_get_stats - get driver statistics
++
++ * @dev: adapter's net_device struct
++ *
++ * This routine is called when the OS wants the adapter's wireless
++ * stats returned. It returns the address of the iw_statistics
++ * stucture for the device. If the statistics are currently being
++ * updated, then they might be incorrect for a short while. However,
++ * since this cannot actually cause damage, no locking is used.
++ */
++#if WIRELESS_EXT > 12
++struct iw_statistics *
++zd1205wext_iw_get_stats(struct net_device *dev)
++{
++ struct zd1205_private *macp = dev->priv;
++ struct iw_statistics *iw_stats = &macp->drv_stats.iw_stats;
++
++ iw_stats->qual.noise = 161;
++ iw_stats->qual.qual = 0;//macp->rxInfo.rxSignalQuality;
++ iw_stats->qual.level = 0;//macp->rxInfo.rxSignalStrength;
++ iw_stats->qual.updated = 7;
++
++ iw_stats->discard.nwid = 0;
++ iw_stats->discard.code = 0;
++ iw_stats->discard.fragment = 0;
++ iw_stats->discard.retries = macp->retryFailCnt;
++ iw_stats->discard.misc = macp->DropFirstFragCnt + macp->ErrLongFrmCnt +
++ macp->ErrShortFrmCnt + macp->ErrZeroLenFrmCnt;
++
++ iw_stats->miss.beacon = 0;
++
++ return iw_stats;
++}
++#endif
++
+ \r
+ /**\r
+ * zd1205_set_mac - set the MAC address\r
+--- zd1211-4916-r0/src/zd1211.c.orig 2005-03-03 18:43:49.000000000 -0800
++++ zd1211-4916-r0/src/zd1211.c 2005-03-04 13:44:31.122476712 -0800
+@@ -1873,6 +1873,9 @@
+ #define ZD1211_TX_TIMEOUT (HZ*10)\r
+ #define ZD1211_MTU 1500\r
+ extern struct iw_handler_def p80211wext_handler_def;\r
++#ifdef CONFIG_NET_WIRELESS
++extern struct iw_statistics *zd1205wext_iw_get_stats(struct net_device *);
++#endif
+ \r
+ u8 zd1211_InitSetup(struct net_device *dev, struct zd1205_private *macp)\r
+ \r
+@@ -1964,6 +1967,7 @@
+ \r
+ #if WIRELESS_EXT > 12\r
+ dev->wireless_handlers = (struct iw_handler_def *)&p80211wext_handler_def;\r
++ dev->get_wireless_stats = &zd1205wext_iw_get_stats;
+ #endif\r
+ \r
+ dev->hard_start_xmit = zd1205_xmit_frame;\r
--- /dev/null
+diff -ur zdold/Makefile zd1211-4916-r0/Makefile
+--- zdold/Makefile 2005-02-18 21:58:36.000000000 -0800
++++ zd1211-4916-r0/Makefile 2005-02-28 17:59:05.000000000 -0800
+@@ -149,7 +149,7 @@
+ CFLAGS += -DfNEW_CODE_MAP=1\r
+ CFLAGS += -DfWRITE_WORD_REG=1\r
+ CFLAGS += -DfREAD_MUL_REG=1\r
+-#CFLAGS += -DENHANCE_RX=1\r
++CFLAGS += -DENHANCE_RX=1\r
+ \r
+ all: $(MODULE)\r
+ \r
+diff -ur zdold/src/zd1211.c zd1211-4916-r0/src/zd1211.c
+--- zdold/src/zd1211.c 2005-01-28 22:55:15.000000000 -0800
++++ zd1211-4916-r0/src/zd1211.c 2005-03-01 14:41:07.003613776 -0800
+@@ -429,16 +429,16 @@
+ memset(pRegBuffer, 0x0, size); \r
+ \r
+ \r
+- ((PUSB_WRITE_REG)pRegBuffer)->RequestID = REGID_PROG_FLSH;\r
+- ((PUSB_SET_RF) pRegBuffer)->Value = Value[0];\r
+- ((PUSB_SET_RF) pRegBuffer)->Index = Value[1];\r
++ ((PUSB_WRITE_REG)pRegBuffer)->RequestID = cpu_to_le16(REGID_PROG_FLSH);\r
++ ((PUSB_SET_RF) pRegBuffer)->Value = cpu_to_le16(Value[0]);\r
++ ((PUSB_SET_RF) pRegBuffer)->Index = cpu_to_le16(Value[1]);\r
+ \r
+ \r
+ \r
+ \r
+ \r
+ for (ii = 2; ii < RegCount; ii ++)\r
+- ((PUSB_SET_RF)pRegBuffer)->Data[ii - 2] = Value[ii];\r
++ ((PUSB_SET_RF)pRegBuffer)->Data[ii - 2] = cpu_to_le16(Value[ii]);\r
+ \r
+ \r
+ bufSize = sizeof(u16) * (1+RegCount);\r
+@@ -513,7 +513,7 @@
+ }else\r
+ memset(pRegBuffer, 0x0, size);\r
+ \r
+- ((PUSB_READ_REG_REQ)pRegBuffer)->RequestID = REGID_READ;\r
++ ((PUSB_READ_REG_REQ)pRegBuffer)->RequestID = cpu_to_le16(REGID_READ);\r
+ \r
+ \r
+ \r
+@@ -526,7 +526,7 @@
+ else if ((Address[ii] & BASE_ADDR_MASK_HOST) == USB_BASE_ADDR_EEPROM)\r
+ Address[ii] = ((Address[ii] - USB_BASE_ADDR_EEPROM) / 2) + cFIRMWARE_EEPROM_OFFSET;\r
+ //0x9900 //0xF817\r
+- ((PUSB_READ_REG_REQ) pRegBuffer)->Address[ii] = Address[ii];\r
++ ((PUSB_READ_REG_REQ) pRegBuffer)->Address[ii] = cpu_to_le16(Address[ii]);\r
+ \r
+ }\r
+ \r
+@@ -608,7 +608,7 @@
+ } \r
+ else {\r
+ for (ii = 0; ii < (macp->ReadRegCount-2) / 4; ii++){\r
+- pValue[ii] = *((u16 *) macp->IntEPBuffer2 + 1 + ii * 2 + 1);\r
++ pValue[ii] = le16_to_cpu(*((u16 *) macp->IntEPBuffer2 + 1 + ii * 2 + 1));
+ } \r
+ ret = 0; \r
+ \r
+@@ -686,7 +686,7 @@
+ } \r
+ \r
+ down(&macp->reg_sem); \r
+- \r
++\r
+ \r
+ \r
+ if ((RegCount == 0) || (!macp->bUSBDeveiceAttached) || !test_bit(ZD1211_RUNNING, &macp->flags)) { \r
+@@ -712,7 +712,7 @@
+ \r
+ \r
+ \r
+- ((PUSB_WRITE_REG)pRegBuffer)->RequestID = REGID_WRITE;\r
++ ((PUSB_WRITE_REG)pRegBuffer)->RequestID = cpu_to_le16(REGID_WRITE);\r
+ \r
+ if (RegCount > cMIN_MULTI_WRITE_REG_NUM){\r
+ for (i=cMIN_MULTI_WRITE_REG_NUM; i<RegCount; i++){\r
+@@ -724,8 +724,8 @@
+ else if ((Address[i] & BASE_ADDR_MASK_HOST) == USB_BASE_ADDR_EEPROM)\r
+ Address[i] = ((Address[i] - USB_BASE_ADDR_EEPROM) / 2) + cFIRMWARE_EEPROM_OFFSET;\r
+ \r
+- ((PUSB_WRITE_REG)pRegBuffer)->WritePackage[i].Address = Address[i];\r
+- ((PUSB_WRITE_REG)pRegBuffer)->WritePackage[i].WriteData_low = Value[i];\r
++ ((PUSB_WRITE_REG)pRegBuffer)->WritePackage[i].Address = cpu_to_le16(Address[i]);\r
++ ((PUSB_WRITE_REG)pRegBuffer)->WritePackage[i].WriteData_low = cpu_to_le16(Value[i]);\r
+ }\r
+ }\r
+ \r
+@@ -1726,17 +1726,17 @@
+ \r
+ \r
+ \r
+- ((PUSB_SET_RF)pRegBuffer)->RequestID = REGID_RFOFDMSET;\r
++ ((PUSB_SET_RF)pRegBuffer)->RequestID = cpu_to_le16(REGID_RFOFDMSET);\r
+ \r
+ if (bIs3683A)\r
+- ((PUSB_SET_RF)pRegBuffer)->Value = 1;\r
++ ((PUSB_SET_RF)pRegBuffer)->Value = cpu_to_le16(1);\r
+ else\r
+- ((PUSB_SET_RF)pRegBuffer)->Value = 2;\r
++ ((PUSB_SET_RF)pRegBuffer)->Value = cpu_to_le16(2);\r
+ \r
+- ((PUSB_SET_RF)pRegBuffer)->Index = (u16)S_bit_cnt;\r
++ ((PUSB_SET_RF)pRegBuffer)->Index = cpu_to_le16((u16)S_bit_cnt);\r
+ \r
+ for (i = 0; i < S_bit_cnt; i ++)\r
+- ((PUSB_SET_RF)pRegBuffer)->Data[i] = InputValue[i];\r
++ ((PUSB_SET_RF)pRegBuffer)->Data[i] = cpu_to_le16(InputValue[i]);\r
+ \r
+ \r
+ bufSize = sizeof(u16) * (3+S_bit_cnt);\r
+@@ -2229,7 +2229,7 @@
+ \r
+ \r
+ \r
+- ZD1211DEBUG(4, "actual_length = %x\n", urb->actual_length);\r
++ ZD1211DEBUG(2, "actual_length = %x\n", urb->actual_length);\r
+ \r
+ \r
+ rx_struct = list_entry(macp->active_rx_list.next,\r
+@@ -2266,7 +2266,7 @@
+ if (last_pkt_len <= (macp->wMaxPacketSize - 4)){\r
+ \r
+ \r
+- if (((u16 *) pRxBuffer)[TotalLength / sizeof(u16) - 1] == 0x697E){\r
++ if (le16_to_cpu(((u16 *) pRxBuffer)[TotalLength / sizeof(u16) - 1]) == 0x697E){\r
+ \r
+ total_rx_struct = 3;\r
+ //ZD1211DEBUG(0, "Got merged Rx Frames!!\n");\r
+@@ -2288,8 +2288,8 @@
+ int CurFrmLen;\r
+ \r
+ if (total_rx_struct> 1){\r
+- CurFrmLen = ((u16 *) pRxBuffer)[TotalLength / sizeof(u16) + i - 4];\r
+- //ZD1211DEBUG(2, "CurFrmLen = %x\n", CurFrmLen);\r
++ CurFrmLen = le16_to_cpu(((u16 *) pRxBuffer)[TotalLength / sizeof(u16) + i - 4]);\r
++ //ZD1211DEBUG(2, "[RX] CurFrmLen = %x\n", CurFrmLen);\r
+ } \r
+ \r
+ else\r
+@@ -2316,22 +2316,22 @@
+ \r
+ \r
+ \r
+- rfd->CbStatus = RFD_STATUS_COMPLETE;\r
+- rfd->ActualCount = CurFrmLen;\r
++ rfd->CbStatus = cpu_to_le32(RFD_STATUS_COMPLETE);\r
++ rfd->ActualCount = cpu_to_le32(CurFrmLen);\r
+ \r
+ \r
+ if (i > 0){\r
+ memcpy(&rfd->RxBuffer[macp->rxOffset],\r
+ pRxBuffer + tmpLen,\r
+- rfd->ActualCount);\r
++ CurFrmLen);\r
+ \r
+ } \r
+ \r
+ \r
+- tmpLen += (rfd->ActualCount & ~0x03);\r
++ tmpLen += (CurFrmLen & ~0x03);\r
+ \r
+ \r
+- if (rfd->ActualCount & 0x03)\r
++ if (CurFrmLen & 0x03)\r
+ tmpLen += 4;\r
+ \r
+ }\r
+@@ -2361,8 +2361,8 @@
+ \r
+ #else\r
+ \r
+- rfd->CbStatus = RFD_STATUS_COMPLETE;\r
+- rfd->ActualCount = TotalLength;\r
++ rfd->CbStatus = cpu_to_le32(RFD_STATUS_COMPLETE);\r
++ rfd->ActualCount = cpu_to_le32(TotalLength);\r
+ zd1205_rx_isr(macp);\r
+ #endif\r
+ \r
+@@ -2521,8 +2521,8 @@
+ // this is USB_READ_REGISTER response\r
+ macp->ReadRegCount = (u16)actual_length;\r
+ \r
+- intNum = *(u16 *)(macp->IntEPBuffer+2);\r
+- //intNum = macp->IntEPBuffer[2] + (((u16)macp->IntEPBuffer[3]) << 8);\r
++ //intNum = *(u16 *)(macp->IntEPBuffer+2);\r
++ intNum = macp->IntEPBuffer[2] + (((u16)macp->IntEPBuffer[3]) << 8);\r
+ \r
+ if (intNum == (InterruptCtrl | macp->USBCSRAddress)){ \r
+ // Handle non-RxTx interrupt\r
+@@ -2549,8 +2549,8 @@
+ case EPINT_RetryFial_Event:\r
+ {\r
+ u8 *pMacAddr = macp->IntEPBuffer + 4;\r
+- u8 NewRate = (u8)(*(u16 *)(macp->IntEPBuffer + 2));\r
+- //u8 NewRate = macp->IntEPBuffer[2];\r
++ //u8 NewRate = (u8)(*(u16 *)(macp->IntEPBuffer + 2));\r
++ u8 NewRate = (u8)macp->IntEPBuffer[2];\r
+ u16 aid;\r
+ \r
+ \r
+@@ -2568,7 +2568,7 @@
+ //ZD1211DEBUG(2, "NewRate = %x\n", NewRate);\r
+ aid = zd_AidLookUp(pMacAddr);\r
+ zd_EventNotify(EVENT_TX_COMPLETE, ZD_RETRY_FAILED, 0xff, (U32)aid);\r
+- macp->retryFailCnt += *(u16 *)(macp->IntEPBuffer + 10);\r
++ macp->retryFailCnt += le16_to_cpu(*(u16 *)(macp->IntEPBuffer + 10));\r
+ break;\r
+ \r
+ }\r
+@@ -2634,7 +2634,7 @@
+ // in current design, no need to use spinlock\r
+ \r
+ \r
+- intr_status = *(u16 *)(macp->IntEPBuffer3+4);\r
++ intr_status = le16_to_cpu(*(u16 *)(macp->IntEPBuffer3+4));\r
+ //ZD1211DEBUG(2, "intr_status = %x\n", intr_status);\r
+ \r
+ if (!intr_status)\r
+@@ -2765,7 +2765,7 @@
+ \r
+ sw_tcb = macp->activeTxQ->first;\r
+ if (sw_tcb) \r
+- sw_tcb->pTcb->CbStatus = CB_STATUS_COMPLETE;\r
++ sw_tcb->pTcb->CbStatus = cpu_to_le32(CB_STATUS_COMPLETE);\r
+ \r
+ zd1205_tx_isr(macp);\r
+ \r
+@@ -2889,23 +2889,25 @@
+ Tbd++;\r
+ \r
+ //Mac Header\r
+- memcpy(dst, (u8 *)Tbd->TbdBufferAddrLowPart, Tbd->TbdCount);\r
++ memcpy(dst, (u8 *)le32_to_cpu(Tbd->TbdBufferAddrLowPart),
++ le32_to_cpu(Tbd->TbdCount));\r
+ \r
+ ZD1211DEBUG(2, "MAC Header Length = %x\n", Tbd->TbdCount);\r
+- dst += Tbd->TbdCount;\r
++ dst += le32_to_cpu(Tbd->TbdCount);\r
+ \r
+- TotalLength += Tbd->TbdCount;\r
++ TotalLength += le32_to_cpu(Tbd->TbdCount);\r
+ \r
+ Tbd++;\r
+ \r
+ //MAC Body\r
+- memcpy(dst, (u8 *)Tbd->TbdBufferAddrLowPart, Tbd->TbdCount);\r
++ memcpy(dst, (u8 *)le32_to_cpu(Tbd->TbdBufferAddrLowPart),
++ le32_to_cpu(Tbd->TbdCount));
+ \r
+ ZD1211DEBUG(2, "Tx DATA Length = %x\n", Tbd->TbdCount);\r
+- dst += Tbd->TbdCount;\r
++ dst += le32_to_cpu(Tbd->TbdCount);\r
+ \r
+ \r
+- TotalLength += Tbd->TbdCount;\r
++ TotalLength += le32_to_cpu(Tbd->TbdCount);\r
+ Tbd++;\r
+ \r
+ ZD1211DEBUG(2, "TotalLength = %x\n", TotalLength);\r
+@@ -2914,7 +2916,7 @@
+ \r
+ \r
+ // write down total length\r
+- *((u16 *)(macp->tx_buff+4)) = (u16)TotalLength + 14;\r
++ *((u16 *)(macp->tx_buff+4)) = cpu_to_le16((u16)TotalLength + 14);\r
+ \r
+ ZD1211DEBUG(2, "macp->tx_buff+4 = %x\n", *((u16 *)(macp->tx_buff+4)));\r
+ \r
+diff -ur zdold/src/zd1211.h zd1211-4916-r0/src/zd1211.h
+--- zdold/src/zd1211.h 2005-01-28 22:55:14.000000000 -0800
++++ zd1211-4916-r0/src/zd1211.h 2005-03-01 14:12:15.023914712 -0800
+@@ -146,7 +146,9 @@
+ typedef struct _USB_WRITE_REG {\r
+ u16 RequestID;\r
+ USB_WRITE_REG_PACKAGE WritePackage[cMAX_MULTI_WRITE_REG_NUM];\r
+-} USB_WRITE_REG, * PUSB_WRITE_REG;\r
++} __attribute__((__packed__));\r
++\r
++typedef struct _USB_WRITE_REG USB_WRITE_REG, * PUSB_WRITE_REG;\r
+ \r
+ \r
+ typedef struct _USB_SET_RF {\r
+diff -ur zdold/src/zdshared.c zd1211-4916-r0/src/zdshared.c
+--- zdold/src/zdshared.c 2005-01-28 22:55:15.000000000 -0800
++++ zd1211-4916-r0/src/zdshared.c 2005-03-01 14:43:35.078103032 -0800
+@@ -416,6 +416,7 @@
+ U16 len;\r
+ Frame_t *pf = pfrmDesc->mpdu;\r
+ \r
++ pf->header[2] = pf->header[3] = 0; // Initialize them to something?
+ setFrameType(pf, ST_PROBE_REQ);\r
+ pf->body = pfrmDesc->buffer;\r
+ body = pf->body;\r