Beispiel #1
0
tx80211_MgmtMsg_t *mlmeApiPrepMgtMsg(UINT32 Subtype, IEEEtypes_MacAddr_t *DestAddr, IEEEtypes_MacAddr_t *SrcAddr)
#endif
{
	macmgmtQ_MgmtMsg2_t * MgmtMsg_p;
	//tx80211_MgmtMsg_t * TxMsg_p;
	//UINT32 size;
#ifdef AP_MAC_LINUX
	struct sk_buff *skb;
	UINT8 *frm;

	if ((skb = ieee80211_getmgtframe(&frm, sizeof(struct ieee80211_frame)+2)) != NULL)
	{
		//skb->len = 34;
		//skb->tail+= 34;
		WLDBG_INFO(DBG_LEVEL_8, "mlmeApiPrepMgtMsg length = %d \n", skb->len);
		MgmtMsg_p = (macmgmtQ_MgmtMsg2_t *) skb->data;
		MgmtMsg_p->Hdr.FrmCtl.Type = IEEE_TYPE_MANAGEMENT;
		MgmtMsg_p->Hdr.FrmCtl.Subtype = Subtype;
		MgmtMsg_p->Hdr.FrmCtl.Retry=0;
		MgmtMsg_p->Hdr.Duration = 300;
		memcpy(&MgmtMsg_p->Hdr.DestAddr, DestAddr, sizeof(IEEEtypes_MacAddr_t));
		memcpy(&MgmtMsg_p->Hdr.SrcAddr, SrcAddr, sizeof(IEEEtypes_MacAddr_t));
		memcpy(&MgmtMsg_p->Hdr.BssId, SrcAddr, sizeof(IEEEtypes_MacAddr_t));
	}

	return skb;
#else
#ifdef AP_BUFFER
	if ((TxMsg_p = (tx80211_MgmtMsg_t *)pool_GetBuf(txMgmtPoolId)) != NULL)
	{
		MgmtMsg_p = &TxMsg_p->MgmtFrame;
		MgmtMsg_p->Hdr.FrmCtl.Type = IEEE_TYPE_MANAGEMENT;
		MgmtMsg_p->Hdr.FrmCtl.Subtype = Subtype;
		MgmtMsg_p->Hdr.FrmCtl.Retry=0;
		MgmtMsg_p->Hdr.Duration = 300;
		memcpy(&MgmtMsg_p->Hdr.DestAddr, DestAddr, sizeof(IEEEtypes_MacAddr_t));
		memcpy(&MgmtMsg_p->Hdr.SrcAddr, SrcAddr, sizeof(IEEEtypes_MacAddr_t));
		memcpy(&MgmtMsg_p->Hdr.BssId, SrcAddr, sizeof(IEEEtypes_MacAddr_t));
	}
	return TxMsg_p;
#else
	return NULL;
#endif
#endif
}
Beispiel #2
0
int wlTxRingInit(struct net_device *netdev)
{
    struct wlprivate *wlpptr = NETDEV_PRIV_P(struct wlprivate, netdev);
    int currDescr;
    int num;

    WLDBG_ENTER_INFO(DBG_LEVEL_12, "initializing %i descriptors", MAX_NUM_TX_DESC);
    for(num =0; num < NUM_OF_DESCRIPTOR_DATA; num++)
    {
        QUEUE_INIT(&((struct wlprivate_data *)(wlpptr->wlpd_p))->txQ[num]);
        ((struct wlprivate_data *)(wlpptr->wlpd_p))->fwDescCnt[num] =0;
        if (((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[num].pTxRing != NULL)
        {
            for (currDescr = 0; currDescr < MAX_NUM_TX_DESC; currDescr++)
            {
                CURR_TXD(num).Status    = ENDIAN_SWAP32(EAGLE_TXD_STATUS_IDLE);
                CURR_TXD(num).pNext     = &NEXT_TXD(num);
                CURR_TXD(num).pPhysNext =
                    ENDIAN_SWAP32((u_int32_t) ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[num].pPhysTxRing +
                                  ((currDescr+1)*sizeof(wltxdesc_t)));
                WLDBG_INFO(DBG_LEVEL_12,
                           "txdesc: %i status: 0x%x (%i) vnext: 0x%p pnext: 0x%x",
                           currDescr, EAGLE_TXD_STATUS_IDLE, EAGLE_TXD_STATUS_IDLE,
                           CURR_TXD(num).pNext, ENDIAN_SWAP32(CURR_TXD(num).pPhysNext));
            }
            LAST_TXD(num).pNext = &FIRST_TXD(num);
            LAST_TXD(num).pPhysNext =
                ENDIAN_SWAP32((u_int32_t) ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[num].pPhysTxRing);
            ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[num].pStaleTxDesc = &FIRST_TXD(num);
            ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[num].pNextTxDesc  = &FIRST_TXD(num);

            WLDBG_EXIT_INFO(DBG_LEVEL_12,
                            "last txdesc vnext: 0x%p pnext: 0x%x pstale 0x%x vfirst 0x%x",
                            LAST_TXD(num).pNext, ENDIAN_SWAP32(LAST_TXD(num).pPhysNext),
                            ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[num].pStaleTxDesc, ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[num].pNextTxDesc);
        }
        else
        {
            WLDBG_ERROR(DBG_LEVEL_12, "no valid TX mem");
            return FAIL;
        }
    }
    return SUCCESS;
}
Beispiel #3
0
void wlTxRingCleanup(struct net_device *netdev)
{
    struct wlprivate *wlpptr = NETDEV_PRIV_P(struct wlprivate, netdev);
    int cleanedTxDescr = 0;
    int currDescr;
    int num;

    WLDBG_ENTER(DBG_LEVEL_12);

    for(num =0; num < NUM_OF_DESCRIPTOR_DATA; num++)
    {
        QUEUE_PURGE(&((struct wlprivate_data *)(wlpptr->wlpd_p))->txQ[num]);
        ((struct wlprivate_data *)(wlpptr->wlpd_p))->fwDescCnt[num] =0;
        if (((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[num].pTxRing != NULL)
        {
            for (currDescr = 0; currDescr < MAX_NUM_TX_DESC; currDescr++)
            {
                if (CURR_TXD(num).pSkBuff != NULL)
                {
                    WLDBG_INFO(DBG_LEVEL_12,
                               "unmapped and free'd txdesc %i vaddr: 0x%p paddr: 0x%x",
                               currDescr, CURR_TXD(num).pSkBuff->data,
                               ENDIAN_SWAP32(CURR_TXD(num).PktPtr));
                    pci_unmap_single(wlpptr->pPciDev,
                                     ENDIAN_SWAP32(CURR_TXD(num).PktPtr),
                                     CURR_TXD(num).pSkBuff->len,
                                     PCI_DMA_TODEVICE);
                    {
                        WL_SKB_FREE(CURR_TXD(num).pSkBuff);
                    }
                    CURR_TXD(num).Status    = ENDIAN_SWAP32(EAGLE_TXD_STATUS_IDLE);
                    CURR_TXD(num).pSkBuff   = NULL;
                    CURR_TXD(num).PktPtr    = 0;
                    CURR_TXD(num).PktLen    = 0;
                    cleanedTxDescr++;
                }
            }
        }
    }
    WLDBG_EXIT_INFO(DBG_LEVEL_12, "cleaned %i TX descr", cleanedTxDescr);
}
Beispiel #4
0
void wlRxRingCleanup(struct net_device *netdev)
{
    struct wlprivate *wlpptr = NETDEV_PRIV_P(struct wlprivate, netdev);
    int currDescr;

    WLDBG_ENTER(DBG_LEVEL_12);

    if (((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].pRxRing != NULL)
    {
        for (currDescr = 0; currDescr < MAX_NUM_RX_DESC; currDescr++)
        {
            if (CURR_RXD.pSkBuff != NULL)
            {
                if (skb_shinfo(CURR_RXD.pSkBuff)->nr_frags)
                {
                    skb_shinfo(CURR_RXD.pSkBuff)->nr_frags = 0;
                }
                if (skb_shinfo(CURR_RXD.pSkBuff)->frag_list)
                {
                    skb_shinfo(CURR_RXD.pSkBuff)->frag_list = NULL;
                }
                pci_unmap_single(wlpptr->pPciDev,
                                 ENDIAN_SWAP32(CURR_RXD.pPhysBuffData),
                                 ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxBufSize,
                                 PCI_DMA_FROMDEVICE);
                WL_SKB_FREE(CURR_RXD.pSkBuff);
                WLDBG_INFO(DBG_LEVEL_12,
                           "unmapped+free'd rxdesc %i vaddr: 0x%p paddr: 0x%x len: %i",
                           currDescr, CURR_RXD.pBuffData,
                           ENDIAN_SWAP32(CURR_RXD.pPhysBuffData),
                           ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxBufSize);
                CURR_RXD.pBuffData = NULL;
                CURR_RXD.pSkBuff = NULL;
            }
        }
    }
    WLDBG_EXIT(DBG_LEVEL_12);
}
Beispiel #5
0
static void mwl_rx_ring_cleanup(struct mwl_priv *priv)
{
	int curr_desc;

	WLDBG_ENTER(DBG_LEVEL_4);

	BUG_ON(!priv);

	if (priv->desc_data[0].prx_ring != NULL) {
		for (curr_desc = 0; curr_desc < SYSADPT_MAX_NUM_RX_DESC; curr_desc++) {
			if (CURR_RXD.psk_buff != NULL) {
				if (skb_shinfo(CURR_RXD.psk_buff)->nr_frags)
					skb_shinfo(CURR_RXD.psk_buff)->nr_frags = 0;

				if (skb_shinfo(CURR_RXD.psk_buff)->frag_list)
					skb_shinfo(CURR_RXD.psk_buff)->frag_list = NULL;

				pci_unmap_single(priv->pdev,
						 ENDIAN_SWAP32(CURR_RXD.pphys_buff_data),
						 priv->desc_data[0].rx_buf_size,
						 PCI_DMA_FROMDEVICE);

				dev_kfree_skb_any(CURR_RXD.psk_buff);

				WLDBG_INFO(DBG_LEVEL_4,
					   "unmapped+free'd rxdesc %i vaddr: 0x%p paddr: 0x%x len: %i",
					   curr_desc, CURR_RXD.pbuff_data,
					   ENDIAN_SWAP32(CURR_RXD.pphys_buff_data),
					   priv->desc_data[0].rx_buf_size);

				CURR_RXD.pbuff_data = NULL;
				CURR_RXD.psk_buff = NULL;
			}
		}
	}

	WLDBG_EXIT(DBG_LEVEL_4);
}
Beispiel #6
0
BOOLEAN UpdateCurrentChannelInMIB(vmacApInfo_t *vmacSta_p, UINT32 channel)
{
	MIB_802DOT11 *mib = vmacSta_p->ShadowMib802dot11;
	MIB_PHY_DSSS_TABLE *PhyDSSSTable=mib->PhyDSSSTable;
	UINT8 *mib_extSubCh_p = mib->mib_extSubCh;

	if(domainChannelValid(channel, channel <= 14?FREQ_BAND_2DOT4GHZ:FREQ_BAND_5GHZ))
	{
		PhyDSSSTable->CurrChan = channel;

		/* Currentlly, 40M is not supported for channel 14 */
		if (PhyDSSSTable->CurrChan == 14)
		{
			if ((PhyDSSSTable->Chanflag.ChnlWidth == CH_AUTO_WIDTH) ||
				(PhyDSSSTable->Chanflag.ChnlWidth == CH_40_MHz_WIDTH))
				PhyDSSSTable->Chanflag.ChnlWidth = CH_20_MHz_WIDTH;
		}

		//PhyDSSSTable->Chanflag.ChnlWidth=CH_40_MHz_WIDTH;
		PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
		if(((PhyDSSSTable->Chanflag.ChnlWidth==CH_40_MHz_WIDTH) || 
			(PhyDSSSTable->Chanflag.ChnlWidth==CH_AUTO_WIDTH)))
		{
			switch(PhyDSSSTable->CurrChan)
			{
			case 1:
			case 2:
			case 3:
			case 4:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 5:
				if(*mib_extSubCh_p==0)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				else if(*mib_extSubCh_p==1)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				else if(*mib_extSubCh_p==2)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 6:
			case 7:
			case 8:
			case 9:
			case 10:
				if(*mib_extSubCh_p==0)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				else if(*mib_extSubCh_p==1)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				else if(*mib_extSubCh_p==2)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 11:
			case 12:
			case 13:
			case 14:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
				/* for 5G */
			case 36:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 40:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 44:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 48:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 52:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 56:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 60:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 64:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;

			case 100:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 104:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 108:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 112:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 116:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 120:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 124:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 128:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 132:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 136:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 140:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;

			case 149:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 153:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 157:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 161:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			default:
				break;
			}
		}
		if(PhyDSSSTable->CurrChan<=14)
			PhyDSSSTable->Chanflag.FreqBand=FREQ_BAND_2DOT4GHZ;
		else
			PhyDSSSTable->Chanflag.FreqBand=FREQ_BAND_5GHZ;
	}else 
	{
		WLDBG_INFO(DBG_LEVEL_15,  "invalid channel %d\n", channel);
		return FALSE;
	}
	wlFwApplyChannelSettings(vmacSta_p->dev);
	return TRUE;
}
Beispiel #7
0
/*************************************************************************
* Function:
*
* Description:
*
* Input:
*
* Output:
*
**************************************************************************/
extern SINT8 evtSmeCmdMsg(vmacApInfo_t *vmacSta_p,UINT8 *message)
{
    MhsmEvent_t smMsg;
    macmgmtQ_SmeCmd_t * smeCmd_p;
    extStaDb_StaInfo_t *StaInfo_p;

    WLDBG_ENTER(DBG_CLASS_INFO);
    if (message == NULL)
    {
        return 1;
    }
#ifdef AP_MAC_LINUX
    smMsg.devinfo = (void *) vmacSta_p;
#endif
    smeCmd_p = (macmgmtQ_SmeCmd_t *)message;
    switch (smeCmd_p->CmdType)
    {

    case SME_CMD_DISASSOCIATE:
    {
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_DISASSOCIATE message received. \n");
        if ((StaInfo_p = extStaDb_GetStaInfo(vmacSta_p,&smeCmd_p->Body.AssocCmd.PeerStaAddr, 1)) == NULL)
        {
            return 1;
        }
        smMsg.event = MlmeDisAssoc_Req;
        smMsg.pBody = (UINT8 *)&(smeCmd_p->Body.AssocCmd);
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAssoc.super, &smMsg);
    }
    break;

    case SME_CMD_START:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_START message received. \n");
        syncMsg.opMode = infrastructure;
        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.StartCmd);
        smMsg.event = MlmeStart_Req;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;

    case SME_CMD_RESET:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_RESET message received. \n");
        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.ResetCmd);
        smMsg.event = ResetMAC;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;

#if defined(AP_SITE_SURVEY) || defined(AUTOCHANNEL)
    case SME_CMD_SCAN:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_SCAN message received. \n");
        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.ScanCmd);
        smMsg.event = MlmeScan_Req;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;
#endif /* AP_SITE_SURVEY */

#ifdef IEEE80211H
    case SME_CMD_MREQUEST:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_MREQUEST message received. \n");
        if (!IS_BROADCAST(&smeCmd_p->Body.MrequestCmd.PeerStaAddr))
        {
            if ((StaInfo_p = extStaDb_GetStaInfo(vmacSta_p,&smeCmd_p->Body.MrequestCmd.PeerStaAddr, 1)) == NULL)
            {
                WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_MREQUEST - no station found %x:%x:%x:%x:%x:%x] \n",
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[0],
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[1],
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[2],
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[3],
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[4],
                           smeCmd_p->Body.MrequestCmd.PeerStaAddr[5]);
                return 1;
            }
        }
        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.MrequestCmd);
        smMsg.event = MlmeMrequest_Req;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;

    case SME_CMD_MREPORT:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_MREPORT message received. \n");

        if ((StaInfo_p = extStaDb_GetStaInfo(vmacSta_p,&smeCmd_p->Body.MrequestCmd.PeerStaAddr, 1)) == NULL)
        {
            WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SME_CMD_MREPORT - no station found %x:%x:%x:%x:%x:%x] \n",
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[0],
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[1],
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[2],
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[3],
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[4],
                       smeCmd_p->Body.MrequestCmd.PeerStaAddr[5]);

            return 1;
        }

        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.MreportCmd);
        smMsg.event = MlmeMreport_Req;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;

    case SMC_CMD_CHANNELSWITCH_REQ:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "evtSmeCmdMsg: SMC_CMD_CHANNELSWITCH_REQ message received. \n");
        syncMsg.mgtMsg = (UINT8 *)&(smeCmd_p->Body.ChannelSwitchCmd);
        smMsg.event = MlmeChannelSwitch_Req;
        smMsg.pBody = (unsigned char *)&syncMsg;
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;
#endif /* IEEE80211H */
    default:
        break;
    }
    WLDBG_EXIT(DBG_CLASS_INFO);
    return 0;
}
Beispiel #8
0
extern SINT8 evtDot11MgtMsg(vmacApInfo_t *vmacSta_p,UINT8 *message, struct sk_buff *skb)
#endif
{
    MIB_AUTH_ALG  *mib_AuthAlg_p=vmacSta_p->Mib802dot11->AuthAlg;
    MhsmEvent_t smMsg;
    macmgmtQ_MgmtMsg3_t *MgmtMsg_p;
    extStaDb_StaInfo_t *StaInfo_p;

    if (message == NULL)
    {
        return 1;
    }
    WLDBG_ENTER(DBG_LEVEL_11);
    MgmtMsg_p = (macmgmtQ_MgmtMsg3_t *)message;

#ifdef FILTER_BSSID
    if ( ( memcmp(MgmtMsg_p->Hdr.DestAddr, vmacSta_p->macStaAddr,sizeof(IEEEtypes_MacAddr_t)) ||
            memcmp(MgmtMsg_p->Hdr.BssId, vmacSta_p->macBssId,sizeof(IEEEtypes_MacAddr_t)) )
            && ( MgmtMsg_p->Hdr.FrmCtl.Subtype != IEEE_MSG_PROBE_RQST ) )
#else
    if (memcmp(MgmtMsg_p->Hdr.DestAddr, vmacSta_p->macStaAddr,sizeof(IEEEtypes_MacAddr_t)) &&
            memcmp(MgmtMsg_p->Hdr.DestAddr, vmacSta_p->macStaAddr2,sizeof(IEEEtypes_MacAddr_t)) &&
            (MgmtMsg_p->Hdr.FrmCtl.Subtype != IEEE_MSG_PROBE_RQST) )
#endif
    {
        WLDBG_ENTER_INFO(DBG_LEVEL_11,"mgt frame %d rxved %2x-%2x-%2x-%2x-%2x-%2x\n",MgmtMsg_p->Hdr.FrmCtl.Subtype,
                         MgmtMsg_p->Hdr.DestAddr[0],
                         MgmtMsg_p->Hdr.DestAddr[1],
                         MgmtMsg_p->Hdr.DestAddr[2],
                         MgmtMsg_p->Hdr.DestAddr[3],
                         MgmtMsg_p->Hdr.DestAddr[4],
                         MgmtMsg_p->Hdr.DestAddr[5]);
        return 1;
    }
    if (isMacAccessList(vmacSta_p, &(MgmtMsg_p->Hdr.SrcAddr)) != SUCCESS)
    {
        return 1;
    }
    if ((StaInfo_p = extStaDb_GetStaInfo(vmacSta_p,&MgmtMsg_p->Hdr.SrcAddr,  0)) == NULL)
    {
        if(MgmtMsg_p->Hdr.FrmCtl.Subtype == IEEE_MSG_AUTHENTICATE)
        {
            //added call to check other VAP's StaInfo_p
            if ((StaInfo_p = extStaDb_GetStaInfo(vmacSta_p,&MgmtMsg_p->Hdr.SrcAddr,  2)))
            {
                macMgmtRemoveSta(vmacSta_p, StaInfo_p);
            }
            if ((StaInfo_p = macMgtStaDbInit(vmacSta_p,&MgmtMsg_p->Hdr.SrcAddr,&MgmtMsg_p->Hdr.DestAddr)) == NULL)
            {
                WLDBG_ENTER_INFO(DBG_LEVEL_11,"init data base fail\n");
                return 1;
            }
        }
        else if ((MgmtMsg_p->Hdr.FrmCtl.Subtype != IEEE_MSG_PROBE_RQST))
        {
            if ((MgmtMsg_p->Hdr.FrmCtl.Subtype != IEEE_MSG_DEAUTHENTICATE) &&
                    (MgmtMsg_p->Hdr.FrmCtl.Subtype !=  IEEE_MSG_PROBE_RSP) )

            {

                macMgmtMlme_SendDeauthenticateMsg(vmacSta_p,&MgmtMsg_p->Hdr.SrcAddr,
                                                  0,
                                                  IEEEtypes_REASON_CLASS2_NONAUTH);

            }
            return 1;
        }
    }
#ifdef AP_MAC_LINUX
    smMsg.devinfo = (void *) vmacSta_p;
#endif

    switch (MgmtMsg_p->Hdr.FrmCtl.Subtype)
    {
    case IEEE_MSG_AUTHENTICATE:
    {
        AuthRspSrvApMsg authRspMsg;
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_AUTHENTICATE message received. \n");
        memcpy(authRspMsg.rspMac, MgmtMsg_p->Hdr.SrcAddr, 6);
        authRspMsg.arAlg_in = MgmtMsg_p->Body.Auth.AuthAlg;
        {
            if (mib_AuthAlg_p->Type == AUTH_OPEN_OR_SHARED_KEY)
            {
                authRspMsg.arAlg = authRspMsg.arAlg_in;
            }
            else
            {
                authRspMsg.arAlg = mib_AuthAlg_p->Type;
            }
        }
        authRspMsg.mgtMsg = (UINT8 *)MgmtMsg_p;
        smMsg.event = AuthOdd;
        smMsg.pBody = (unsigned char *)&authRspMsg;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAuthRsp.super, &smMsg);
    }
    break;

    case IEEE_MSG_ASSOCIATE_RQST:
    {
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_ASSOCIATE_RQST message received. \n");
        smMsg.event = AssocReq;
        smMsg.pBody = (unsigned char *)MgmtMsg_p;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAssoc.super,&smMsg);
    }
    break;

    case IEEE_MSG_REASSOCIATE_RQST:
    {
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_REASSOCIATE_RQST message received. \n");
        smMsg.event = ReAssocReq;
        smMsg.pBody = (unsigned char *)MgmtMsg_p;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAssoc.super, &smMsg);
    }
    break;

    case IEEE_MSG_DISASSOCIATE:
    {
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_DISASSOCIATE message received. \n");
        smMsg.event = DisAssoc;
        smMsg.pBody = (unsigned char *)MgmtMsg_p;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAssoc.super, &smMsg);
    }
    break;

    case IEEE_MSG_DEAUTHENTICATE:
    {
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_DEAUTHENTICATE message received. \n");
        smMsg.event = DeAuth;
        smMsg.pBody = (unsigned char *)MgmtMsg_p;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&StaInfo_p->mgtAuthRsp.super, &smMsg);
    }
    break;

    /* Could be handled by HW */
    case IEEE_MSG_PROBE_RQST:
    {
        SyncSrvApMsg syncMsg;
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_PROBE_RQST message received. \n");
        syncMsg.opMode = infrastructure;
        syncMsg.mgtMsg = (UINT8 *)MgmtMsg_p;
        smMsg.event = ProbeReq;
        smMsg.pBody = (unsigned char *)&syncMsg;
#ifdef AP_MAC_LINUX
        smMsg.info = (void *) skb;
#endif
        mhsm_send_event((Mhsm_t *)&vmacSta_p->mgtSync.super, &smMsg);
    }
    break;

#if defined(QOS_FEATURE)||defined(IEEE80211H)
    case IEEE_MSG_QOS_ACTION:
    {
        WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_QOS_ACTION message received. \n");

        if(MgmtMsg_p->Body.Action.Category == HT_CATEGORY)
        {
            switch (MgmtMsg_p->Body.Action.Action)
            {
            case ACTION_SMPS:
            {
                extern int wlFwSetMimoPsHt(struct net_device *netdev, UINT8 *addr, UINT8 enable, UINT8 mode);
                IEEEtypes_SM_PwrCtl_t *p =  (IEEEtypes_SM_PwrCtl_t *)&MgmtMsg_p->Body.Act.Field.SmPwrCtl;
                WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_QOS_ACTION MIMO PS HT message received. \n");
                wlFwSetMimoPsHt(vmacSta_p->dev, (UINT8 *)MgmtMsg_p->Hdr.SrcAddr, p->Enable, p->Mode);
                break;
            }
#ifdef INTOLERANT40
            case ACTION_INFOEXCH:
            {
                extern void RecHTIntolerant(vmacApInfo_t *vmacSta_p,UINT8 enable);
                IEEEtypes_InfoExch_t *p =  (IEEEtypes_InfoExch_t *)&MgmtMsg_p->Body.Act.Field.InfoExch;
                WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_QOS_ACTION Info Exch HT message received. \n");

                RecHTIntolerant(vmacSta_p,p->FortyMIntolerant);
                break;
            }
#endif //#ifdef INTOLERANT40
            default:
                break;
            }
            break;
        }
#ifdef IEEE80211H
        if(TRUE == macMgmtMlme_80211hAct(vmacSta_p,(macmgmtQ_MgmtMsg3_t *) MgmtMsg_p)) /* if it's mine frame, then return true */
            break;
#endif /* IEEE80211H */
#ifdef COEXIST_20_40_SUPPORT
        if(TRUE == macMgmtMlme_80211PublicAction(vmacSta_p,(macmgmtQ_MgmtMsg3_t *) MgmtMsg_p)) /* if it's mine frame, then return true */
            break;
#endif
#ifdef QOS_FEATURE
        /*smMsg.event = QoSAction;
        smMsg.pBody = MgmtMsg_p;
        mhsm_send_event((Mhsm_t *)&wlpptr->vmacSta_p->mgtSync.super, &smMsg);*/
        macMgmtMlme_QoSAct(vmacSta_p,(macmgmtQ_MgmtMsg3_t *) MgmtMsg_p);
        break;
#endif /* QOS_FEATURE */
    }
#endif
    default:
        break;
    }
    WLDBG_EXIT(DBG_LEVEL_11);

    return 0;
}
Beispiel #9
0
void receiveWlanMsg(struct net_device *dev, struct sk_buff *skb, UINT32 rssi, BOOLEAN stationpacket)
{
	struct wlprivate *priv = NETDEV_PRIV_P(struct wlprivate, dev);
	vmacApInfo_t *vmacSta_p = priv->vmacSta_p;
	//	MIB_802DOT11 *mib=vmacSta_p->Mib802dot11;
	//	macmgmtQ_SmeCmd_t *SmeCmd_p;
	//	struct sk_buff *mgmtBuff_p;
	IEEEtypes_Frame_t *wlanMsg_p;

	wlanMsg_p = (IEEEtypes_Frame_t *) ((UINT8 *)skb->data -2);

	wlanMsg_p->Hdr.FrmBodyLen = skb->len;

#ifdef SOC_W8764
    dispTxBf((macmgmtQ_MgmtMsg3_t *)wlanMsg_p);
#endif

	switch (wlanMsg_p->Hdr.FrmCtl.Type)
	{
	case IEEE_TYPE_DATA:
		break;
	case IEEE_TYPE_MANAGEMENT:
		{
			WLDBG_INFO(DBG_LEVEL_11, "IEEE_TYPE_MANAGEMENT message received. \n");
			switch (wlanMsg_p->Hdr.FrmCtl.Subtype)
			{
			case 0xf:	//fw debug type
				printk("FW: %s\n", (UINT8 *)((UINT32)wlanMsg_p+6));
				/*WLDBG_INFO(DBG_LEVEL_11,"%s\n", (UINT8 *)((UINT32)wlanMsg_p+2+sizeof(IEEEtypes_MgmtHdr2_t)));*/
				break;
#ifndef INTEROP
			case IEEE_MSG_QOS_ACTION:

				WLDBG_INFO(DBG_LEVEL_11, "IEEE_MSG_QOS_ACTION message received. \n");
				break;
#endif
			case IEEE_MSG_PROBE_RQST:
				macMgmtMlme_ProbeRqst(vmacSta_p,(macmgmtQ_MgmtMsg3_t *)wlanMsg_p);
				break;
#ifdef CLIENT_SUPPORT
				/* Intercept beacon here for AP.
				* Client beacon will be handled later.
				*/
			case IEEE_MSG_BEACON:
				RxBeacon(vmacSta_p,wlanMsg_p, skb->len);
#endif //CLIENT_SUPPORT
			default:
				/* 802.11 Management frame::feed MLME State Machines */
#ifdef CLIENT_SUPPORT
				{
#define SK_BUF_RESERVED_PAD     6
					if(stationpacket)
					{
						vmacEntry_t *targetVMacEntry_p = NULL;
						IEEEtypes_MgmtHdr_t *Hdr_p;
						if( (wlanMsg_p->Hdr.FrmCtl.Subtype == IEEE_MSG_BEACON )
                            	|| (wlanMsg_p->Hdr.FrmCtl.Subtype == IEEE_MSG_QOS_ACTION ))						
{
							targetVMacEntry_p = sme_GetParentVMacEntry(vmacSta_p->VMacEntry.phyHwMacIndx) ;
						}
						else
						{
							targetVMacEntry_p = vmacGetVMacEntryByAddr((UINT8 *)&wlanMsg_p->Hdr.Addr1) ;
						}
						if( targetVMacEntry_p )
						{
							curRxInfo_g.RSSI = (UINT8)rssi;
							//printk("****** client process dot11 rssi=%d\n",curRxInfo_g.RSSI);
							//skb_push(skb, SK_BUF_RESERVED_PAD);
							skb_push(skb, 2); /* For UINT16 FrmBodyLen */
							Hdr_p = (IEEEtypes_MgmtHdr_t *)(skb->data);
							Hdr_p->FrmBodyLen = skb->len;
							skb_push(skb, 4); /* For UINT32 priv_p pointer */
							targetVMacEntry_p->dot11MsgEvt(skb->data, (UINT8 *)&curRxInfo_g, targetVMacEntry_p->info_p);
							skb_pull(skb, SK_BUF_RESERVED_PAD);
						}
					}
					else
					{
						evtDot11MgtMsg(vmacSta_p,(UINT8 *)wlanMsg_p, skb);
					}
				}
#else /* CLIENT_SUPPORT */
				evtDot11MgtMsg(vmacSta_p,(UINT8 *)wlanMsg_p, skb);
#endif /* CLIENT_SUPPORT */
				break;
			}
			break;
		}
	case IEEE_TYPE_CONTROL:
		{
			WLDBG_INFO(DBG_LEVEL_11, "IEEE_TYPE_CONTROL message received. \n");
			{
				switch (wlanMsg_p->Hdr.FrmCtl.Subtype)
				{
				case PS_POLL:
				case RTS:
				case CTS:
				case ACK:
				case CF_END:
				case CF_END_CF_ACK:
					break;
				default:
					break;
				}
			} /* end if */

			break;
		}
	default:
		/* Uknown Type */
		break;
	}
	dev_kfree_skb_any(skb);    
}
Beispiel #10
0
int wlRxRingInit(struct net_device *netdev)
{
    struct wlprivate *wlpptr = NETDEV_PRIV_P(struct wlprivate, netdev);
    int currDescr;

    WLDBG_ENTER_INFO(DBG_LEVEL_12,  "initializing %i descriptors", MAX_NUM_RX_DESC);

    if (((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].pRxRing != NULL)
    {
        ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxBufSize = MAX_AGGR_SIZE;
        for (currDescr = 0; currDescr < MAX_NUM_RX_DESC; currDescr++)
        {
            CURR_RXD.pSkBuff   = dev_alloc_skb(((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxBufSize);
            if(skb_linearize(CURR_RXD.pSkBuff))
            {
                WL_SKB_FREE(CURR_RXD.pSkBuff);
                printk(KERN_ERR "%s: Need linearize memory\n", netdev->name);
                return FAIL;
            }
            skb_reserve(CURR_RXD.pSkBuff , MIN_BYTES_HEADROOM);
            CURR_RXD.RxControl = EAGLE_RXD_CTRL_DRIVER_OWN;
            CURR_RXD.Status    = EAGLE_RXD_STATUS_OK;
            CURR_RXD.QosCtrl   = 0x0000;
            CURR_RXD.Channel   = 0x00;
            CURR_RXD.RSSI      = 0x00;
            CURR_RXD.SQ2       = 0x00;

            if (CURR_RXD.pSkBuff != NULL)
            {
                CURR_RXD.PktLen    = 6*netdev->mtu + NUM_EXTRA_RX_BYTES;
                CURR_RXD.pBuffData = CURR_RXD.pSkBuff->data;
                CURR_RXD.pPhysBuffData =
                    ENDIAN_SWAP32(pci_map_single(wlpptr->pPciDev,
                                                 CURR_RXD.pSkBuff->data,
                                                 ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxBufSize,
                                                 PCI_DMA_FROMDEVICE));
                CURR_RXD.pNext = &NEXT_RXD;
                CURR_RXD.pPhysNext =
                    ENDIAN_SWAP32((u_int32_t) ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].pPhysRxRing +
                                  ((currDescr+1)*sizeof(wlrxdesc_t)));
                WLDBG_INFO(DBG_LEVEL_12,
                           "rxdesc: %i status: 0x%x (%i) len: 0x%x (%i)",
                           currDescr, EAGLE_TXD_STATUS_IDLE, EAGLE_TXD_STATUS_IDLE,
                           ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxBufSize, ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxBufSize);
                WLDBG_INFO(DBG_LEVEL_12,
                           "rxdesc: %i vnext: 0x%p pnext: 0x%x", currDescr,
                           CURR_RXD.pNext, ENDIAN_SWAP32(CURR_RXD.pPhysNext));
            } else
            {
                WLDBG_ERROR(DBG_LEVEL_12,
                            "rxdesc %i: no skbuff available", currDescr);
                return FAIL;
            }
        }
        LAST_RXD.pPhysNext =
            ENDIAN_SWAP32((u_int32_t) ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].pPhysRxRing);
        LAST_RXD.pNext             = &FIRST_RXD;
        ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].pNextRxDesc = &FIRST_RXD;

        WLDBG_EXIT_INFO(DBG_LEVEL_12,
                        "last rxdesc vnext: 0x%p pnext: 0x%x vfirst 0x%x",
                        LAST_RXD.pNext, ENDIAN_SWAP32(LAST_RXD.pPhysNext),
                        ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].pNextRxDesc);
        return SUCCESS;
    }
    WLDBG_ERROR(DBG_LEVEL_12, "no valid RX mem");
    return FAIL;
}
Beispiel #11
0
void wlRecv(struct net_device *netdev)
{
	struct wlprivate *wlpptr = NETDEV_PRIV_P(struct wlprivate, netdev);
	int work_done = 0;
	wlrxdesc_t *pCurrent = ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].pNextRxDesc;
	static Bool_e isFunctionBusy = WL_FALSE;
	int receivedHandled = 0;
	u_int32_t rxRdPtr;
	u_int32_t rxWrPtr;
	struct sk_buff *pRxSkBuff=NULL;
	WL_BUFF *wlb = NULL;
	void *pCurrentData;
	u_int8_t rxRate;
	int rxCount;
	int rssi;
	vmacApInfo_t *vmacSta_p = wlpptr->vmacSta_p;
	u_int32_t status;
    u_int32_t rssi_paths;
	WLDBG_ENTER(DBG_LEVEL_14);

    /* In a corner case the descriptors may be uninitialized and not usable, accessing these may cause a crash */
	if (isFunctionBusy || (pCurrent == NULL))
	{
		return;
	}
	isFunctionBusy = WL_TRUE;

	rxRdPtr = readl(wlpptr->ioBase0 + ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxDescRead);
	rxWrPtr = readl(wlpptr->ioBase0 + ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxDescWrite);

	while ((pCurrent->RxControl ==EAGLE_RXD_CTRL_DMA_OWN)
		&& (work_done < vmacSta_p->work_to_do)
		)
	{		
		/* AUTOCHANNEL */
		{
			if(vmacSta_p->StopTraffic)
				goto out;
		} /* AUTOCHANNEL */

		rxCount = ENDIAN_SWAP16(pCurrent->PktLen);
		pRxSkBuff = pCurrent->pSkBuff;
		if (pRxSkBuff == NULL)
		{
			goto out;
		}
		pci_unmap_single(wlpptr->pPciDev, 
			ENDIAN_SWAP32(pCurrent->pPhysBuffData),
			((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxBufSize,
			PCI_DMA_FROMDEVICE);
		pCurrentData = pCurrent->pBuffData;
		rxRate = pCurrent->Rate;
		status = (u_int32_t)pCurrent->Status;
		pRxSkBuff->protocol = 0;
		if(pCurrent->QosCtrl & IEEE_QOS_CTL_AMSDU)
		{
			pRxSkBuff->protocol |= WL_WLAN_TYPE_AMSDU;
		}
		rssi = (int)pCurrent->RSSI + W836X_RSSI_OFFSET;
        rssi_paths = *((u_int32_t *)&pCurrent->HwRssiInfo);
		if (skb_tailroom(pRxSkBuff) >= rxCount)
		{
			skb_put(pRxSkBuff, rxCount ); 
			skb_pull(pRxSkBuff, 2); 
		}
		else
		{
			WLDBG_INFO(DBG_LEVEL_14,"Not enough tail room =%x recvlen=%x, pCurrent=%x, pCurrentData=%x", WL_BUFF_TAILROOM(pRxSkBuff), rxCount,pCurrent, pCurrentData);
			WL_SKB_FREE(pRxSkBuff);
			goto out;
		}

		wlpptr->netDevStats->rx_packets++;
		wlb = WL_BUFF_PTR(pRxSkBuff);
		WL_PREPARE_BUF_INFO(pRxSkBuff);
		if(pCurrent->HtSig2 & 0x8 )
		{
			u_int8_t ampdu_qos;
			/** use bit 3 for ampdu flag, and 0,1,2,3 for qos so as to save a register **/	
			ampdu_qos = 8|(pCurrent->QosCtrl&0x7);
			work_done+=ieee80211_input(wlpptr, wlb,rssi,rssi_paths,ampdu_qos,status);
		}	
		else
		{
			u_int8_t ampdu_qos;
			/** use bit 3 for ampdu flag, and 0,1,2,3 for qos so as to save a register **/	
			ampdu_qos = 0|(pCurrent->QosCtrl&0x7); 
			work_done+=ieee80211_input(wlpptr, wlb,rssi,rssi_paths,ampdu_qos,status);
		}

		wlpptr->netDevStats->rx_bytes += pRxSkBuff->len;
		{
			pCurrent->pSkBuff   = dev_alloc_skb(((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxBufSize);
			if (pCurrent->pSkBuff != NULL)
			{
				if(skb_linearize(pCurrent->pSkBuff))
				{
					WL_SKB_FREE(pCurrent->pSkBuff);
					printk(KERN_ERR "%s: Need linearize memory\n", netdev->name);
					goto out;
				}
				skb_reserve(pCurrent->pSkBuff , MIN_BYTES_HEADROOM);
				pCurrent->Status    = EAGLE_RXD_STATUS_OK;
				pCurrent->QosCtrl   = 0x0000;
				pCurrent->Channel   = 0x00;
				pCurrent->RSSI      = 0x00;
				pCurrent->SQ2       = 0x00;

				pCurrent->PktLen    = 6*netdev->mtu + NUM_EXTRA_RX_BYTES;
				pCurrent->pBuffData = pCurrent->pSkBuff->data;
				pCurrent->pPhysBuffData =
					ENDIAN_SWAP32(pci_map_single(wlpptr->pPciDev,
					pCurrent->pSkBuff->data,
					((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxBufSize/*+sizeof(struct skb_shared_info)*/,
					PCI_DMA_BIDIRECTIONAL));
			}
		}
out:

		receivedHandled++;
		pCurrent->RxControl = EAGLE_RXD_CTRL_DRIVER_OWN;
		pCurrent->QosCtrl =0;
		rxRdPtr = ENDIAN_SWAP32(pCurrent->pPhysNext);
		pCurrent = pCurrent->pNext;
	}
	writel(rxRdPtr, wlpptr->ioBase0 + ((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].rxDescRead);
	((struct wlprivate_data *)(wlpptr->wlpd_p))->descData[0].pNextRxDesc = pCurrent;
	isFunctionBusy = WL_FALSE;
	WLDBG_EXIT(DBG_LEVEL_14);
}
Beispiel #12
0
static int mwl_rx_ring_init(struct mwl_priv *priv)
{
	int curr_desc;

	WLDBG_ENTER_INFO(DBG_LEVEL_4,  "initializing %i descriptors", SYSADPT_MAX_NUM_RX_DESC);

	if (priv->desc_data[0].prx_ring != NULL) {
		priv->desc_data[0].rx_buf_size = SYSADPT_MAX_AGGR_SIZE;

		for (curr_desc = 0; curr_desc < SYSADPT_MAX_NUM_RX_DESC; curr_desc++) {
			CURR_RXD.psk_buff = dev_alloc_skb(priv->desc_data[0].rx_buf_size);

			if (skb_linearize(CURR_RXD.psk_buff)) {
				dev_kfree_skb_any(CURR_RXD.psk_buff);
				WLDBG_ERROR(DBG_LEVEL_4, "need linearize memory");
				WLDBG_EXIT_INFO(DBG_LEVEL_4, "no suitable memory");
				return -ENOMEM;
			}

			skb_reserve(CURR_RXD.psk_buff, SYSADPT_MIN_BYTES_HEADROOM);
			CURR_RXD.rx_control = EAGLE_RXD_CTRL_DRIVER_OWN;
			CURR_RXD.status = EAGLE_RXD_STATUS_OK;
			CURR_RXD.qos_ctrl = 0x0000;
			CURR_RXD.channel = 0x00;
			CURR_RXD.rssi = 0x00;

			if (CURR_RXD.psk_buff != NULL) {
				CURR_RXD.pkt_len = SYSADPT_MAX_AGGR_SIZE;
				CURR_RXD.pbuff_data = CURR_RXD.psk_buff->data;
				CURR_RXD.pphys_buff_data =
					ENDIAN_SWAP32(pci_map_single(priv->pdev,
								     CURR_RXD.psk_buff->data,
								     priv->desc_data[0].rx_buf_size,
								     PCI_DMA_FROMDEVICE));
				CURR_RXD.pnext = &NEXT_RXD;
				CURR_RXD.pphys_next =
					ENDIAN_SWAP32((u32)priv->desc_data[0].pphys_rx_ring +
						      ((curr_desc + 1) * sizeof(struct mwl_rx_desc)));
				WLDBG_INFO(DBG_LEVEL_4,
					   "rxdesc: %i status: 0x%x (%i) len: 0x%x (%i)",
					   curr_desc, EAGLE_TXD_STATUS_IDLE, EAGLE_TXD_STATUS_IDLE,
					   priv->desc_data[0].rx_buf_size, priv->desc_data[0].rx_buf_size);
				WLDBG_INFO(DBG_LEVEL_4,
					   "rxdesc: %i vnext: 0x%p pnext: 0x%x", curr_desc,
					   CURR_RXD.pnext, ENDIAN_SWAP32(CURR_RXD.pphys_next));
			} else {
				WLDBG_ERROR(DBG_LEVEL_4,
					    "rxdesc %i: no skbuff available", curr_desc);
				WLDBG_EXIT_INFO(DBG_LEVEL_4, "no socket buffer");
				return -ENOMEM;
			}
		}
		LAST_RXD.pphys_next =
			ENDIAN_SWAP32((u32)priv->desc_data[0].pphys_rx_ring);
		LAST_RXD.pnext = &FIRST_RXD;
		priv->desc_data[0].pnext_rx_desc = &FIRST_RXD;

		WLDBG_EXIT_INFO(DBG_LEVEL_4,
				"last rxdesc vnext: 0x%p pnext: 0x%x vfirst 0x%x",
				LAST_RXD.pnext, ENDIAN_SWAP32(LAST_RXD.pphys_next),
				priv->desc_data[0].pnext_rx_desc);

		return 0;
	}

	WLDBG_ERROR(DBG_LEVEL_4, "no valid RX mem");
	WLDBG_EXIT_INFO(DBG_LEVEL_4, "no valid RX mem");

	return -ENOMEM;
}
Beispiel #13
0
int wlset_mibChannel(vmacEntry_t *clientVMacEntry_p, UINT8 mib_STAMode)
{
	int rc = 0;
	//not sure the purpose of changing wdev0's mib, TODO
#ifndef MBSS
	mibMaster = vmacSta_p->master->ShadowMib802dot11;
	if ((mib_STAMode == CLIENT_MODE_N_5) || (mib_STAMode == CLIENT_MODE_A) ||(mib_STAMode == CLIENT_MODE_AUTO))
	{
		channel = 64;
		*mibMaster->mib_ApMode = AP_MODE_AandN;
	}
	else
	{
		channel = 6;
		*mibMaster->mib_ApMode = AP_MODE_BandGandN;
	}

	//#ifdef BRS_SUPPORT
	ieee80211_reset_rate_mask(mibMaster);
#if 0	
	switch (*(mibMaster->mib_ApMode))
	{
	case AP_MODE_B_ONLY:
		*(mibMaster->BssBasicRateMask) = MRVL_BSSBASICRATEMASK_B;
		*(mibMaster->NotBssBasicRateMask) = MRVL_NOTBSSBASICRATEMASK_B;
		break;

	case AP_MODE_G_ONLY:
		*(mibMaster->BssBasicRateMask) = MRVL_BSSBASICRATEMASK_G;
		*(mibMaster->NotBssBasicRateMask)  = MRVL_NOTBSSBASICRATEMASK_G;
		break;

	case AP_MODE_A_ONLY:
	case AP_MODE_AandN:
	case AP_MODE_5GHZ_N_ONLY:
		*(mibMaster->BssBasicRateMask) = MRVL_BSSBASICRATEMASK_A;
		*(mibMaster->NotBssBasicRateMask)  = MRVL_NOTBSSBASICRATEMASK_A;
		break;

	case AP_MODE_N_ONLY:
	case AP_MODE_MIXED:
	default:
		*(mibMaster->BssBasicRateMask) = MRVL_BSSBASICRATEMASK_BGN;
		*(mibMaster->NotBssBasicRateMask)  = MRVL_NOTBSSBASICRATEMASK_BGN;
		break;
	}
#endif	
	//#endif

	if(domainChannelValid(channel, channel <= 14?FREQ_BAND_2DOT4GHZ:FREQ_BAND_5GHZ))
	{
		PhyDSSSTable->CurrChan = channel;
		/* Currentlly, 40M is not supported for channel 14 */
		if (PhyDSSSTable->CurrChan == 14)
		{
			if ((PhyDSSSTable->Chanflag.ChnlWidth == CH_AUTO_WIDTH) || 
				(PhyDSSSTable->Chanflag.ChnlWidth == CH_40_MHz_WIDTH))
				PhyDSSSTable->Chanflag.ChnlWidth = CH_20_MHz_WIDTH;
		}

		//PhyDSSSTable->Chanflag.ChnlWidth=CH_40_MHz_WIDTH;
		PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
		if(((PhyDSSSTable->Chanflag.ChnlWidth==CH_40_MHz_WIDTH) || (PhyDSSSTable->Chanflag.ChnlWidth==CH_AUTO_WIDTH)))
		{
			switch(PhyDSSSTable->CurrChan)
			{
			case 1:
			case 2:
			case 3:
			case 4:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 5:
				/* Now AutoBW use 5-1 instead of 5-9 for wifi cert convenience*/
				/*if(*mib_extSubCh_p==0)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				else if(*mib_extSubCh_p==1)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				else if(*mib_extSubCh_p==2)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;*/
			case 6:
			case 7:
			case 8:
			case 9:
			case 10:
				if(*mib_extSubCh_p==0)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				else if(*mib_extSubCh_p==1)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				else if(*mib_extSubCh_p==2)
					PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 11:
			case 12:
			case 13:
			case 14:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
				/* for 5G */
			case 36:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 40:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 44:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 48:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 52:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 56:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 60:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 64:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;

			case 100:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 104:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 108:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 112:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 116:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 120:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 124:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 128:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 132:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 136:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 140:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;

			case 149:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 153:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			case 157:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_ABOVE_CTRL_CH;
				break;
			case 161:
				PhyDSSSTable->Chanflag.ExtChnlOffset=EXT_CH_BELOW_CTRL_CH;
				break;
			}
		}
		if(PhyDSSSTable->CurrChan<=14)
			PhyDSSSTable->Chanflag.FreqBand=FREQ_BAND_2DOT4GHZ;
		else
			PhyDSSSTable->Chanflag.FreqBand=FREQ_BAND_5GHZ;
	}else
		WLDBG_INFO(DBG_LEVEL_1,  "invalid channel %d\n", channel);
#endif
	return rc;
}