diff -ur ../rt2570-cvs-20050824/Module/mlme.c ./Module/mlme.c --- ../rt2570-cvs-20050824/Module/mlme.c 2005-08-17 11:00:39.000000000 +0200 +++ ./Module/mlme.c 2005-08-24 11:53:01.000000000 +0200 @@ -1690,7 +1690,7 @@ } else { - pAd->PortCfg.TxRate = min((INT)(pAd->PortCfg.MaxTxRate), RATE_11); + pAd->PortCfg.TxRate = min((INT)(pAd->PortCfg.MaxTxRate), RATE_5_5); } } } diff -ur ../rt2570-cvs-20050824/Module/rtusb_bulk.c ./Module/rtusb_bulk.c --- ../rt2570-cvs-20050824/Module/rtusb_bulk.c 2005-07-19 10:20:46.000000000 +0200 +++ ./Module/rtusb_bulk.c 2005-08-24 15:40:14.000000000 +0200 @@ -107,7 +107,8 @@ NdisReleaseSpinLock(&pAdapter->BulkOutLock); return; } - else if (pAdapter->MediaState == NdisMediaStateDisconnected) + else if (pAdapter->MediaState == NdisMediaStateDisconnected && + pAdapter->PortCfg.BssType != BSS_MONITOR) { // // Since there is no connection, so we need to empty the Tx Bulk out Ring. diff -ur ../rt2570-cvs-20050824/Module/rtusb_data.c ./Module/rtusb_data.c --- ../rt2570-cvs-20050824/Module/rtusb_data.c 2005-08-17 11:00:39.000000000 +0200 +++ ./Module/rtusb_data.c 2005-08-24 15:37:06.000000000 +0200 @@ -84,7 +84,8 @@ return 0; } // Drop packets if no associations - else if (!INFRA_ON(pAdapter) && !ADHOC_ON(pAdapter)) + else if (!INFRA_ON(pAdapter) && !ADHOC_ON(pAdapter) && + pAdapter->PortCfg.BssType != BSS_MONITOR) { RTUSBFreeSkbBuffer(skb); return 0; @@ -141,6 +142,14 @@ Priority = 0; AccessCategory = 0; + if (skb && pAdapter->PortCfg.BssType == BSS_MONITOR) + { + NdisAcquireSpinLock(&pAdapter->SendTxWaitQueueLock); + skb_queue_tail(&pAdapter->SendTxWaitQueue, skb); + NdisReleaseSpinLock(&pAdapter->SendTxWaitQueueLock); + return (NDIS_STATUS_SUCCESS); + } + if (skb) { Priority = skb->priority; @@ -806,6 +815,36 @@ DBGPRINT(RT_DEBUG_ERROR, "Error, Null skb data buffer!!!\n"); return (NDIS_STATUS_FAILURE); } + + if (pAdapter->PortCfg.BssType == BSS_MONITOR) + { + pTxContext = &pAdapter->TxContext[pAdapter->NextTxIndex]; + pTxContext->InUse = TRUE; + pTxContext->LastOne = TRUE; + + pAdapter->NextTxIndex++; + if (pAdapter->NextTxIndex >= TX_RING_SIZE) + pAdapter->NextTxIndex = 0; + + pTxD = &(pTxContext->TransferBuffer->TxDesc); + memset(pTxD, 0, sizeof(TXD_STRUC)); + pDest = pTxContext->TransferBuffer->WirelessPacket; + + memcpy( pDest, skb->data, skb->len ); + + RTUSBWriteTxDescriptor(pTxD, FALSE, 0, FALSE, FALSE, TRUE, IFS_BACKOFF, skb->len, FALSE, 0, CW_MIN_IN_BITS, CW_MAX_IN_BITS, skb->len + 4, pAdapter->PortCfg.TxRate, 4, pAdapter->PortCfg.TxPreambleInUsed); + + TransferBufferLength = skb->len + sizeof(TXD_STRUC); + if ((TransferBufferLength % 2) == 1) + TransferBufferLength++; + + pTxContext->BulkOutSize = TransferBufferLength; + atomic_inc(&pAdapter->TxCount); + RTUSB_SET_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_DATA_FRAG); + RTUSBFreeSkbBuffer(skb); + return (NDIS_STATUS_SUCCESS); + } + if (NdisBufferLength < 14) { DBGPRINT_RAW(RT_DEBUG_ERROR, "RTUSBHardEncrypt --> Ndis Packet buffer error !!!\n"); diff -ur ../rt2570-cvs-20050824/Module/rtusb_info.c ./Module/rtusb_info.c --- ../rt2570-cvs-20050824/Module/rtusb_info.c 2005-08-17 11:00:39.000000000 +0200 +++ ./Module/rtusb_info.c 2005-08-24 12:11:05.000000000 +0200 @@ -200,6 +200,12 @@ pAdapter->PortCfg.IbssConfig.Channel = chan; DBGPRINT(RT_DEBUG_ERROR, "<==SIOCSIWFREQ[cmd=0x%x] (Channel=%d)\n", SIOCSIWFREQ, pAdapter->PortCfg.IbssConfig.Channel); + if (pAdapter->PortCfg.BssType == BSS_MONITOR) + { + pAdapter->PortCfg.Channel = pAdapter->PortCfg.IbssConfig.Channel; + AsicSwitchChannel(pAdapter, pAdapter->PortCfg.Channel); + AsicLockChannel(pAdapter, pAdapter->PortCfg.Channel); + } return 0; } @@ -288,10 +294,15 @@ __u32 *mode, char *extra) { PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; - if (ADHOC_ON(pAdapter)) - *mode = IW_MODE_ADHOC; + if (pAdapter->PortCfg.BssType == BSS_MONITOR) + *mode = IW_MODE_MONITOR; else - *mode = IW_MODE_INFRA; + { + if (ADHOC_ON(pAdapter)) + *mode = IW_MODE_ADHOC; + else + *mode = IW_MODE_INFRA; + } DBGPRINT(RT_DEBUG_TEMP,"--->rtusb_ioctl_giwmode\n"); return 0; } diff -ur ../rt2570-cvs-20050824/Module/sync.c ./Module/sync.c --- ../rt2570-cvs-20050824/Module/sync.c 2005-07-27 17:54:29.000000000 +0200 +++ ./Module/sync.c 2005-08-24 14:31:58.000000000 +0200 @@ -203,6 +203,9 @@ UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType; ULONG Now; + if (pAd->PortCfg.BssType == BSS_MONITOR) + return; + DBGPRINT(RT_DEBUG_INFO, "SYNC - MlmeScanReqAction\n"); #if 0 // Check the total scan tries for one single OID command