aboutsummaryrefslogtreecommitdiffstats
path: root/packages/zd1211
diff options
context:
space:
mode:
authorRod Whitby <rod@whitby.id.au>2005-08-24 02:14:20 +0000
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>2005-08-24 02:14:20 +0000
commitddd959ddc62f610a8931ce3d94c8e3c8b965ab0a (patch)
tree02a5b2e959169c395288c3aea071ce3d95dfe172 /packages/zd1211
parenta9c872586c1e2158ec6038da7e923d8e64405077 (diff)
downloadopenembedded-ddd959ddc62f610a8931ce3d94c8e3c8b965ab0a.tar.gz
zd1211: Added zd1211-4916 (rumoured to work with Unslung).
Diffstat (limited to 'packages/zd1211')
-rw-r--r--packages/zd1211/zd1211-4916/.mtn2git_empty0
-rw-r--r--packages/zd1211/zd1211-4916/copy-break.patch11
-rw-r--r--packages/zd1211/zd1211-4916/explicit-key-change.patch24
-rw-r--r--packages/zd1211/zd1211-4916/get-stats.patch77
-rw-r--r--packages/zd1211/zd1211-4916/makefile.patch28
-rw-r--r--packages/zd1211/zd1211-4916/syntax.patch20
-rw-r--r--packages/zd1211/zd1211-4916/usb-endian.patch298
-rw-r--r--packages/zd1211/zd1211-4916/usb-ids.patch21
-rw-r--r--packages/zd1211/zd1211_4916.bb35
9 files changed, 514 insertions, 0 deletions
diff --git a/packages/zd1211/zd1211-4916/.mtn2git_empty b/packages/zd1211/zd1211-4916/.mtn2git_empty
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/packages/zd1211/zd1211-4916/.mtn2git_empty
diff --git a/packages/zd1211/zd1211-4916/copy-break.patch b/packages/zd1211/zd1211-4916/copy-break.patch
new file mode 100644
index 0000000000..a08c543550
--- /dev/null
+++ b/packages/zd1211/zd1211-4916/copy-break.patch
@@ -0,0 +1,11 @@
+--- zd1211-4916-r0/src/zd1205.c.cborig 2005-03-08 14:20:22.846179000 -0800
++++ zd1211-4916-r0/src/zd1205.c 2005-03-08 14:21:09.432096896 -0800
+@@ -267,7 +267,7 @@
+ zd1205_SwTcbQ_t free_txq_buf, active_txq_buf;
+ struct net_device *g_dev;
+ zd_80211Obj_t dot11Obj = {0};
+-#define RX_COPY_BREAK 0//1518 //we do bridge, don't care IP header alignment
++#define RX_COPY_BREAK MAX_WLAN_SIZE //It doesn't appear that unaligned frames work with TCP/UDP beyond a certain size
+ #define BEFORE_BEACON 5
+ /* Definition of Wireless Extension */
+
diff --git a/packages/zd1211/zd1211-4916/explicit-key-change.patch b/packages/zd1211/zd1211-4916/explicit-key-change.patch
new file mode 100644
index 0000000000..ef01f3cb3e
--- /dev/null
+++ b/packages/zd1211/zd1211-4916/explicit-key-change.patch
@@ -0,0 +1,24 @@
+--- zd1211-4916-r0/src/zd1205.c.korig 2005-03-04 13:45:07.000000000 -0800
++++ zd1211-4916-r0/src/zd1205.c 2005-03-08 10:43:26.304994072 -0800
+@@ -5528,7 +5528,8 @@
+ /* Check if the key is not marked as invalid */
+
+ if (!(erq->flags & IW_ENCODE_NOKEY)){
+- pSetting->EncryKeyId = index;
++ // Only change the current keyid when explicitly asked
++ // pSetting->EncryKeyId = index;
+
+
+ memcpy(&pSetting->keyVector[index][0], key, pSetting->WepKeyLen);
+--- zd1211-4916-r0/src/zd1211.c.orig 2005-03-08 17:15:24.085747960 -0800
++++ zd1211-4916-r0/src/zd1211.c 2005-03-08 17:05:02.044312632 -0800
+@@ -3423,8 +3423,8 @@
+ //update card setting
+
+ if (test_bit(KEVENT_UPDATE_SETTING, &macp->kevent_flags)){
+- zd_UpdateCardSetting(&macp->cardSetting);
+ clear_bit(KEVENT_UPDATE_SETTING, &macp->kevent_flags);
++ zd_UpdateCardSetting(&macp->cardSetting);
+ }
+
+
diff --git a/packages/zd1211/zd1211-4916/get-stats.patch b/packages/zd1211/zd1211-4916/get-stats.patch
new file mode 100644
index 0000000000..0525522b43
--- /dev/null
+++ b/packages/zd1211/zd1211-4916/get-stats.patch
@@ -0,0 +1,77 @@
+--- 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 @@
+ ***************************************************************************/
+ struct driver_stats {
+ struct net_device_stats net_stats;
++#ifdef CONFIG_NET_WIRELESS
++ struct iw_statistics iw_stats;
++#endif
+ unsigned long tx_late_col;
+ unsigned long tx_ok_defrd;
+ unsigned long tx_one_retry;
+--- 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);
+ }
+
++/**
++ * 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
++
+
+ /**
+ * zd1205_set_mac - set the MAC address
+--- 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)
+ #define ZD1211_MTU 1500
+ extern struct iw_handler_def p80211wext_handler_def;
++#ifdef CONFIG_NET_WIRELESS
++extern struct iw_statistics *zd1205wext_iw_get_stats(struct net_device *);
++#endif
+
+ u8 zd1211_InitSetup(struct net_device *dev, struct zd1205_private *macp)
+
+@@ -1964,6 +1967,7 @@
+
+ #if WIRELESS_EXT > 12
+ dev->wireless_handlers = (struct iw_handler_def *)&p80211wext_handler_def;
++ dev->get_wireless_stats = &zd1205wext_iw_get_stats;
+ #endif
+
+ dev->hard_start_xmit = zd1205_xmit_frame;
diff --git a/packages/zd1211/zd1211-4916/makefile.patch b/packages/zd1211/zd1211-4916/makefile.patch
new file mode 100644
index 0000000000..a01cb085bc
--- /dev/null
+++ b/packages/zd1211/zd1211-4916/makefile.patch
@@ -0,0 +1,28 @@
+--- zd1211-4916-r0/Makefile.orig 2005-01-28 22:55:15.000000000 -0800
++++ zd1211-4916-r0/Makefile 2005-02-18 17:03:09.009560224 -0800
+@@ -11,12 +11,12 @@
+
+
+ # if the kernel is 2.6.x, trun on this
+-KERN_26=y
+-KERNEL_SOURCE=/usr/src/linux-2.6.7
++#KERN_26=y
++#KERNEL_SOURCE=/usr/src/linux-2.6.7
+
+ # if the kernel is 2.4.x, trun on this
+-#KERN_24=y
+-#KERNEL_SOURCE=/usr/src/linux-2.4.24
++KERN_24=y
++KERNEL_SOURCE=/usr/src/linux-2.4.24
+
+ SRC_DIR=src
+ DEFINES=-D__KERNEL__ -DMODULE=1
+@@ -154,7 +154,7 @@
+ all: $(MODULE)
+
+ $(MODULE): $(OBJECTS)
+- ld -r $(OBJECTS) -o $(MODULE)
++ $(LD) -r $(OBJECTS) -o $(MODULE)
+ chmod -x $(MODULE)
+
+ %.o: %.c
diff --git a/packages/zd1211/zd1211-4916/syntax.patch b/packages/zd1211/zd1211-4916/syntax.patch
new file mode 100644
index 0000000000..969839e8dd
--- /dev/null
+++ b/packages/zd1211/zd1211-4916/syntax.patch
@@ -0,0 +1,20 @@
+--- zd1211-4916-r0/src/zd1205.c.orig 2005-01-28 22:55:14.000000000 -0800
++++ zd1211-4916-r0/src/zd1205.c 2005-02-18 17:40:39.136488936 -0800
+@@ -5182,6 +5182,7 @@
+
+
+ exit:
++ 1;
+ //read_unlock(&(macp->isolate_lock));
+
+ }
+--- zd1211-4916-r0/src/zdhci.c.orig 2005-01-28 22:55:15.000000000 -0800
++++ zd1211-4916-r0/src/zdhci.c 2005-02-18 21:01:45.426134088 -0800
+@@ -10,6 +10,7 @@
+ #define MAX_CHANNEL_ALLOW 13
+ zd_80211Obj_t *pdot11Obj = 0;
+ U16 CurrScanCH = 1;
++void zd_ChooseAP(void);
+
+ BOOLEAN zd_SendPkt(U8 *pEthHdr, U8 *pBody, U32 bodyLen, void *buf, U8 bEapol, void *pHash)
+ {
diff --git a/packages/zd1211/zd1211-4916/usb-endian.patch b/packages/zd1211/zd1211-4916/usb-endian.patch
new file mode 100644
index 0000000000..f2516ff783
--- /dev/null
+++ b/packages/zd1211/zd1211-4916/usb-endian.patch
@@ -0,0 +1,298 @@
+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
+ CFLAGS += -DfWRITE_WORD_REG=1
+ CFLAGS += -DfREAD_MUL_REG=1
+-#CFLAGS += -DENHANCE_RX=1
++CFLAGS += -DENHANCE_RX=1
+
+ all: $(MODULE)
+
+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);
+
+
+- ((PUSB_WRITE_REG)pRegBuffer)->RequestID = REGID_PROG_FLSH;
+- ((PUSB_SET_RF) pRegBuffer)->Value = Value[0];
+- ((PUSB_SET_RF) pRegBuffer)->Index = Value[1];
++ ((PUSB_WRITE_REG)pRegBuffer)->RequestID = cpu_to_le16(REGID_PROG_FLSH);
++ ((PUSB_SET_RF) pRegBuffer)->Value = cpu_to_le16(Value[0]);
++ ((PUSB_SET_RF) pRegBuffer)->Index = cpu_to_le16(Value[1]);
+
+
+
+
+
+ for (ii = 2; ii < RegCount; ii ++)
+- ((PUSB_SET_RF)pRegBuffer)->Data[ii - 2] = Value[ii];
++ ((PUSB_SET_RF)pRegBuffer)->Data[ii - 2] = cpu_to_le16(Value[ii]);
+
+
+ bufSize = sizeof(u16) * (1+RegCount);
+@@ -513,7 +513,7 @@
+ }else
+ memset(pRegBuffer, 0x0, size);
+
+- ((PUSB_READ_REG_REQ)pRegBuffer)->RequestID = REGID_READ;
++ ((PUSB_READ_REG_REQ)pRegBuffer)->RequestID = cpu_to_le16(REGID_READ);
+
+
+
+@@ -526,7 +526,7 @@
+ else if ((Address[ii] & BASE_ADDR_MASK_HOST) == USB_BASE_ADDR_EEPROM)
+ Address[ii] = ((Address[ii] - USB_BASE_ADDR_EEPROM) / 2) + cFIRMWARE_EEPROM_OFFSET;
+ //0x9900 //0xF817
+- ((PUSB_READ_REG_REQ) pRegBuffer)->Address[ii] = Address[ii];
++ ((PUSB_READ_REG_REQ) pRegBuffer)->Address[ii] = cpu_to_le16(Address[ii]);
+
+ }
+
+@@ -608,7 +608,7 @@
+ }
+ else {
+ for (ii = 0; ii < (macp->ReadRegCount-2) / 4; ii++){
+- pValue[ii] = *((u16 *) macp->IntEPBuffer2 + 1 + ii * 2 + 1);
++ pValue[ii] = le16_to_cpu(*((u16 *) macp->IntEPBuffer2 + 1 + ii * 2 + 1));
+ }
+ ret = 0;
+
+@@ -686,7 +686,7 @@
+ }
+
+ down(&macp->reg_sem);
+-
++
+
+
+ if ((RegCount == 0) || (!macp->bUSBDeveiceAttached) || !test_bit(ZD1211_RUNNING, &macp->flags)) {
+@@ -712,7 +712,7 @@
+
+
+
+- ((PUSB_WRITE_REG)pRegBuffer)->RequestID = REGID_WRITE;
++ ((PUSB_WRITE_REG)pRegBuffer)->RequestID = cpu_to_le16(REGID_WRITE);
+
+ if (RegCount > cMIN_MULTI_WRITE_REG_NUM){
+ for (i=cMIN_MULTI_WRITE_REG_NUM; i<RegCount; i++){
+@@ -724,8 +724,8 @@
+ else if ((Address[i] & BASE_ADDR_MASK_HOST) == USB_BASE_ADDR_EEPROM)
+ Address[i] = ((Address[i] - USB_BASE_ADDR_EEPROM) / 2) + cFIRMWARE_EEPROM_OFFSET;
+
+- ((PUSB_WRITE_REG)pRegBuffer)->WritePackage[i].Address = Address[i];
+- ((PUSB_WRITE_REG)pRegBuffer)->WritePackage[i].WriteData_low = Value[i];
++ ((PUSB_WRITE_REG)pRegBuffer)->WritePackage[i].Address = cpu_to_le16(Address[i]);
++ ((PUSB_WRITE_REG)pRegBuffer)->WritePackage[i].WriteData_low = cpu_to_le16(Value[i]);
+ }
+ }
+
+@@ -1726,17 +1726,17 @@
+
+
+
+- ((PUSB_SET_RF)pRegBuffer)->RequestID = REGID_RFOFDMSET;
++ ((PUSB_SET_RF)pRegBuffer)->RequestID = cpu_to_le16(REGID_RFOFDMSET);
+
+ if (bIs3683A)
+- ((PUSB_SET_RF)pRegBuffer)->Value = 1;
++ ((PUSB_SET_RF)pRegBuffer)->Value = cpu_to_le16(1);
+ else
+- ((PUSB_SET_RF)pRegBuffer)->Value = 2;
++ ((PUSB_SET_RF)pRegBuffer)->Value = cpu_to_le16(2);
+
+- ((PUSB_SET_RF)pRegBuffer)->Index = (u16)S_bit_cnt;
++ ((PUSB_SET_RF)pRegBuffer)->Index = cpu_to_le16((u16)S_bit_cnt);
+
+ for (i = 0; i < S_bit_cnt; i ++)
+- ((PUSB_SET_RF)pRegBuffer)->Data[i] = InputValue[i];
++ ((PUSB_SET_RF)pRegBuffer)->Data[i] = cpu_to_le16(InputValue[i]);
+
+
+ bufSize = sizeof(u16) * (3+S_bit_cnt);
+@@ -2229,7 +2229,7 @@
+
+
+
+- ZD1211DEBUG(4, "actual_length = %x\n", urb->actual_length);
++ ZD1211DEBUG(2, "actual_length = %x\n", urb->actual_length);
+
+
+ rx_struct = list_entry(macp->active_rx_list.next,
+@@ -2266,7 +2266,7 @@
+ if (last_pkt_len <= (macp->wMaxPacketSize - 4)){
+
+
+- if (((u16 *) pRxBuffer)[TotalLength / sizeof(u16) - 1] == 0x697E){
++ if (le16_to_cpu(((u16 *) pRxBuffer)[TotalLength / sizeof(u16) - 1]) == 0x697E){
+
+ total_rx_struct = 3;
+ //ZD1211DEBUG(0, "Got merged Rx Frames!!\n");
+@@ -2288,8 +2288,8 @@
+ int CurFrmLen;
+
+ if (total_rx_struct> 1){
+- CurFrmLen = ((u16 *) pRxBuffer)[TotalLength / sizeof(u16) + i - 4];
+- //ZD1211DEBUG(2, "CurFrmLen = %x\n", CurFrmLen);
++ CurFrmLen = le16_to_cpu(((u16 *) pRxBuffer)[TotalLength / sizeof(u16) + i - 4]);
++ //ZD1211DEBUG(2, "[RX] CurFrmLen = %x\n", CurFrmLen);
+ }
+
+ else
+@@ -2316,22 +2316,22 @@
+
+
+
+- rfd->CbStatus = RFD_STATUS_COMPLETE;
+- rfd->ActualCount = CurFrmLen;
++ rfd->CbStatus = cpu_to_le32(RFD_STATUS_COMPLETE);
++ rfd->ActualCount = cpu_to_le32(CurFrmLen);
+
+
+ if (i > 0){
+ memcpy(&rfd->RxBuffer[macp->rxOffset],
+ pRxBuffer + tmpLen,
+- rfd->ActualCount);
++ CurFrmLen);
+
+ }
+
+
+- tmpLen += (rfd->ActualCount & ~0x03);
++ tmpLen += (CurFrmLen & ~0x03);
+
+
+- if (rfd->ActualCount & 0x03)
++ if (CurFrmLen & 0x03)
+ tmpLen += 4;
+
+ }
+@@ -2361,8 +2361,8 @@
+
+ #else
+
+- rfd->CbStatus = RFD_STATUS_COMPLETE;
+- rfd->ActualCount = TotalLength;
++ rfd->CbStatus = cpu_to_le32(RFD_STATUS_COMPLETE);
++ rfd->ActualCount = cpu_to_le32(TotalLength);
+ zd1205_rx_isr(macp);
+ #endif
+
+@@ -2521,8 +2521,8 @@
+ // this is USB_READ_REGISTER response
+ macp->ReadRegCount = (u16)actual_length;
+
+- intNum = *(u16 *)(macp->IntEPBuffer+2);
+- //intNum = macp->IntEPBuffer[2] + (((u16)macp->IntEPBuffer[3]) << 8);
++ //intNum = *(u16 *)(macp->IntEPBuffer+2);
++ intNum = macp->IntEPBuffer[2] + (((u16)macp->IntEPBuffer[3]) << 8);
+
+ if (intNum == (InterruptCtrl | macp->USBCSRAddress)){
+ // Handle non-RxTx interrupt
+@@ -2549,8 +2549,8 @@
+ case EPINT_RetryFial_Event:
+ {
+ u8 *pMacAddr = macp->IntEPBuffer + 4;
+- u8 NewRate = (u8)(*(u16 *)(macp->IntEPBuffer + 2));
+- //u8 NewRate = macp->IntEPBuffer[2];
++ //u8 NewRate = (u8)(*(u16 *)(macp->IntEPBuffer + 2));
++ u8 NewRate = (u8)macp->IntEPBuffer[2];
+ u16 aid;
+
+
+@@ -2568,7 +2568,7 @@
+ //ZD1211DEBUG(2, "NewRate = %x\n", NewRate);
+ aid = zd_AidLookUp(pMacAddr);
+ zd_EventNotify(EVENT_TX_COMPLETE, ZD_RETRY_FAILED, 0xff, (U32)aid);
+- macp->retryFailCnt += *(u16 *)(macp->IntEPBuffer + 10);
++ macp->retryFailCnt += le16_to_cpu(*(u16 *)(macp->IntEPBuffer + 10));
+ break;
+
+ }
+@@ -2634,7 +2634,7 @@
+ // in current design, no need to use spinlock
+
+
+- intr_status = *(u16 *)(macp->IntEPBuffer3+4);
++ intr_status = le16_to_cpu(*(u16 *)(macp->IntEPBuffer3+4));
+ //ZD1211DEBUG(2, "intr_status = %x\n", intr_status);
+
+ if (!intr_status)
+@@ -2765,7 +2765,7 @@
+
+ sw_tcb = macp->activeTxQ->first;
+ if (sw_tcb)
+- sw_tcb->pTcb->CbStatus = CB_STATUS_COMPLETE;
++ sw_tcb->pTcb->CbStatus = cpu_to_le32(CB_STATUS_COMPLETE);
+
+ zd1205_tx_isr(macp);
+
+@@ -2889,23 +2889,25 @@
+ Tbd++;
+
+ //Mac Header
+- memcpy(dst, (u8 *)Tbd->TbdBufferAddrLowPart, Tbd->TbdCount);
++ memcpy(dst, (u8 *)le32_to_cpu(Tbd->TbdBufferAddrLowPart),
++ le32_to_cpu(Tbd->TbdCount));
+
+ ZD1211DEBUG(2, "MAC Header Length = %x\n", Tbd->TbdCount);
+- dst += Tbd->TbdCount;
++ dst += le32_to_cpu(Tbd->TbdCount);
+
+- TotalLength += Tbd->TbdCount;
++ TotalLength += le32_to_cpu(Tbd->TbdCount);
+
+ Tbd++;
+
+ //MAC Body
+- memcpy(dst, (u8 *)Tbd->TbdBufferAddrLowPart, Tbd->TbdCount);
++ memcpy(dst, (u8 *)le32_to_cpu(Tbd->TbdBufferAddrLowPart),
++ le32_to_cpu(Tbd->TbdCount));
+
+ ZD1211DEBUG(2, "Tx DATA Length = %x\n", Tbd->TbdCount);
+- dst += Tbd->TbdCount;
++ dst += le32_to_cpu(Tbd->TbdCount);
+
+
+- TotalLength += Tbd->TbdCount;
++ TotalLength += le32_to_cpu(Tbd->TbdCount);
+ Tbd++;
+
+ ZD1211DEBUG(2, "TotalLength = %x\n", TotalLength);
+@@ -2914,7 +2916,7 @@
+
+
+ // write down total length
+- *((u16 *)(macp->tx_buff+4)) = (u16)TotalLength + 14;
++ *((u16 *)(macp->tx_buff+4)) = cpu_to_le16((u16)TotalLength + 14);
+
+ ZD1211DEBUG(2, "macp->tx_buff+4 = %x\n", *((u16 *)(macp->tx_buff+4)));
+
+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 {
+ u16 RequestID;
+ USB_WRITE_REG_PACKAGE WritePackage[cMAX_MULTI_WRITE_REG_NUM];
+-} USB_WRITE_REG, * PUSB_WRITE_REG;
++} __attribute__((__packed__));
++
++typedef struct _USB_WRITE_REG USB_WRITE_REG, * PUSB_WRITE_REG;
+
+
+ typedef struct _USB_SET_RF {
+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;
+ Frame_t *pf = pfrmDesc->mpdu;
+
++ pf->header[2] = pf->header[3] = 0; // Initialize them to something?
+ setFrameType(pf, ST_PROBE_REQ);
+ pf->body = pfrmDesc->buffer;
+ body = pf->body;
diff --git a/packages/zd1211/zd1211-4916/usb-ids.patch b/packages/zd1211/zd1211-4916/usb-ids.patch
new file mode 100644
index 0000000000..3bb9b00e35
--- /dev/null
+++ b/packages/zd1211/zd1211-4916/usb-ids.patch
@@ -0,0 +1,21 @@
+--- zd1211-4916-r0/src/zdusb.h~ 2005-01-29 17:25:15.000000000 +1030
++++ zd1211-4916-r0/src/zdusb.h 2005-08-24 10:39:06.000000000 +0930
+@@ -10,6 +10,8 @@
+ #define PRODUCT_1211 0x1211
+ #define VENDOR_ZYXEL 0x0586 //ZyXEL
+ #define PRODUCT_G220 0x3401
++#define VENDOR_3COM 0x6891 //3COM
++#define PRODUCT_3CRUSB10075 0xa727
+
+
+ #endif
+--- zd1211-4916-r0/src/zdusb.c~ 2005-01-29 17:25:15.000000000 +1030
++++ zd1211-4916-r0/src/zdusb.c 2005-08-24 10:39:30.000000000 +0930
+@@ -59,6 +59,7 @@
+ static struct usb_device_id zd1211_ids [] = {
+ { USB_DEVICE(VENDOR_ZYDAS, PRODUCT_1211) },
+ { USB_DEVICE(VENDOR_ZYXEL, PRODUCT_G220) },
++ { USB_DEVICE(VENDOR_3COM, PRODUCT_3CRUSB10075) },
+ { } /* Terminating entry */
+ };
+
diff --git a/packages/zd1211/zd1211_4916.bb b/packages/zd1211/zd1211_4916.bb
new file mode 100644
index 0000000000..4d49409b5e
--- /dev/null
+++ b/packages/zd1211/zd1211_4916.bb
@@ -0,0 +1,35 @@
+SRC_URI = "${SOURCEFORGE_MIRROR}/zd1211/sf-zd1211-${PV}-src.tar.gz \
+ file://makefile.patch;patch=1 \
+ file://syntax.patch;patch=1 \
+ file://usb-endian.patch;patch=1 \
+ file://usb-ids.patch;patch=1 \
+ file://get-stats.patch;patch=1 \
+ file://explicit-key-change.patch;patch=1 \
+ file://copy-break.patch;patch=1"
+S = "${WORKDIR}"
+LICENSE = "GPL"
+
+inherit module-base
+SECTION = "base"
+
+do_configure() {
+ :
+}
+
+CFLAGS = "-DLINUX_OS -D__KERNEL__ -DMODULE -I${S}/src/includes -I${S}/src/includes/pcmcia -I${STAGING_KERNEL_DIR}/include"
+
+do_compile() {
+ unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS
+ oe_runmake KERNEL_PATH=${STAGING_KERNEL_DIR} \
+ KERNEL_SRC=${STAGING_KERNEL_DIR} \
+ KERNEL_VERSION=${KERNEL_VERSION} \
+ CC="${KERNEL_CC}" LD="${KERNEL_LD}" \
+ ${MAKE_TARGETS}
+}
+
+do_install() {
+ install -d ${D}/opt/lib/modules/${KERNEL_VERSION}/wireless
+ install -m 0644 zd1211.o ${D}/opt/lib/modules/${KERNEL_VERSION}/wireless/zd1211.o
+}
+
+FILES_${PN} = "/opt/lib/modules"