⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_misc.c

📁 marvell wifi driver GSPI-8385-LINUX-OMAP1510-5.0.10.p0-144-src.rar
💻 C
字号:
/* 
 * 	File	: os_misc.c
 */

#include "os_headers.h"
#include "os_macros.h"

#include "shimd.h"

unsigned long current;

extern wlan_private *wlanpriv;

int event_type_size[] = {
	IW_EV_LCP_LEN,                  /* IW_HEADER_TYPE_NULL */
	0,
	IW_EV_CHAR_LEN,                 /* IW_HEADER_TYPE_CHAR */
	0,
	IW_EV_UINT_LEN,                 /* IW_HEADER_TYPE_UINT */
	IW_EV_FREQ_LEN,                 /* IW_HEADER_TYPE_FREQ */
	IW_EV_ADDR_LEN,                 /* IW_HEADER_TYPE_ADDR */
	0,
	IW_EV_POINT_LEN,                /* Without variable payload */
	IW_EV_PARAM_LEN,                /* IW_HEADER_TYPE_PARAM */
	IW_EV_QUAL_LEN,                 /* IW_HEADER_TYPE_QUAL */
};

static const struct iw_ioctl_description        standard_ioctl[] = {
	/* SIOCSIWCOMMIT */
	{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
	/* SIOCGIWNAME */
	{ IW_HEADER_TYPE_CHAR, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
	/* SIOCSIWNWID */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, IW_DESCR_FLAG_EVENT},
	/* SIOCGIWNWID */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
	/* SIOCSIWFREQ */
	{ IW_HEADER_TYPE_FREQ, 0, 0, 0, 0, IW_DESCR_FLAG_EVENT},
	/* SIOCGIWFREQ */
	{ IW_HEADER_TYPE_FREQ, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
	/* SIOCSIWMODE */
	{ IW_HEADER_TYPE_UINT, 0, 0, 0, 0, IW_DESCR_FLAG_EVENT},
	/* SIOCGIWMODE */
	{ IW_HEADER_TYPE_UINT, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
	/* SIOCSIWSENS */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCGIWSENS */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCSIWRANGE */	
	{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
	/* SIOCGIWRANGE */
	{ IW_HEADER_TYPE_POINT, 0, 1, 0, 0, IW_DESCR_FLAG_DUMP},//sizeof(struct iw_range), IW_DESCR_FLAG_DUMP},
	/* SIOCSIWPRIV */
	{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
	/* SIOCGIWPRIV (handled directly by us) */
	{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
	/* SIOCSIWSTATS */
	{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
	/* SIOCGIWSTATS (handled directly by us) */
	{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
	/* SIOCSIWSPY */
	{ IW_HEADER_TYPE_POINT, 0, 0, 0, 0}, //sizeof(struct sockaddr), 0, IW_MAX_SPY, 0},
	/* SIOCGIWSPY */
	{ IW_HEADER_TYPE_POINT, 0, 0, 0, 0}, 
//{ IW_HEADER_TYPE_POINT, 0, (sizeof(struct sockaddr) + sizeof(struct iw_quality)), 0, IW_MAX_GET_SPY, 0},
	/* -- hole -- */
	{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
	/* -- hole -- */
	{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
	/* SIOCSIWAP */
	{ IW_HEADER_TYPE_ADDR, 0, 0, 0, 0, 0},
	/* SIOCGIWAP */
	{ IW_HEADER_TYPE_ADDR, 0, 0, 0, 0, IW_DESCR_FLAG_DUMP},
	/* -- hole -- */
	{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
	/* SIOCGIWAPLIST */
	{ IW_HEADER_TYPE_POINT, 0, 0, 0, 0}, 
//{ IW_HEADER_TYPE_POINT, 0, (sizeof(struct sockaddr) + sizeof(struct iw_quality)), 0, IW_MAX_AP, 0},
	/* SIOCSIWSCAN */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCGIWSCAN */
	{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_SCAN_MAX_DATA, 0},
	/* SIOCSIWESSID */
	{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ESSID_MAX_SIZE + 1, IW_DESCR_FLAG_EVENT},
	/* SIOCGIWESSID */
	{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ESSID_MAX_SIZE + 1, IW_DESCR_FLAG_DUMP},
	/* SIOCSIWNICKN */
	{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ESSID_MAX_SIZE + 1, 0},
	/* SIOCGIWNICKN */
	{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ESSID_MAX_SIZE + 1, 0},
	/* -- hole -- */
	{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
	/* -- hole -- */
	{ IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0},
	/* SIOCSIWRATE */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCGIWRATE */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCSIWRTS */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCGIWRTS */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCSIWFRAG */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCGIWFRAG */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCSIWTXPOW */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCGIWTXPOW */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCSIWRETRY */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCGIWRETRY */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCSIWENCODE */
	{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ENCODING_TOKEN_MAX, IW_DESCR_FLAG_EVENT | IW_DESCR_FLAG_RESTRICT},
	/* SIOCGIWENCODE */
	{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_ENCODING_TOKEN_MAX, IW_DESCR_FLAG_DUMP | IW_DESCR_FLAG_RESTRICT},
	/* SIOCSIWPOWER */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
	/* SIOCGIWPOWER */
	{ IW_HEADER_TYPE_PARAM, 0, 0, 0, 0, 0},
};
 static const int standard_ioctl_num = (sizeof(standard_ioctl) /
                                        sizeof(struct iw_ioctl_description));

static const struct iw_ioctl_description        standard_event[] = {
	/* IWEVTXDROP */
	{ IW_HEADER_TYPE_ADDR, 0, 0, 0, 0, 0},
	/* IWEVQUAL */
	{ IW_HEADER_TYPE_QUAL, 0, 0, 0, 0, 0},
	/* IWEVCUSTOM */
	{ IW_HEADER_TYPE_POINT, 0, 1, 0, IW_CUSTOM_MAX, 0},
	/* IWEVREGISTERED */
	{ IW_HEADER_TYPE_ADDR, 0, 0, 0, 0, 0},
	/* IWEVEXPIRED */
	{ IW_HEADER_TYPE_ADDR, 0, 0, 0, 0, 0},
};

static const int standard_event_num = (sizeof(standard_event) /
			sizeof(struct iw_ioctl_description));

/* return net_device structure to SHIMD*/
struct net_device *wlan_get_net_dev() 
{
	return wlanpriv->wlan_dev.netdev;
}

void creat_del_evnt_flags(u8 set_reset) 
{
	if (!set_reset) {
		tx_event_flags_delete(&wlanpriv->adapter->scan_q);
	}
}

int wlan_get_scan(struct net_device *dev, struct iw_request_info *info, 
			struct iw_point *dwrq, struct SCAN_SSID_IE *scan_res)
{
	int 			i, min_aps;
	wlan_private		*priv = dev->priv;
	wlan_adapter		*Adapter = priv->adapter;


	ENTER();

	min_aps = (dwrq->length < Adapter->ulNumOfBSSIDs) ?
			dwrq->length : Adapter->ulNumOfBSSIDs;
	
    for(i = 0; i < min_aps; i++)
    {
        scan_res[i].ssid_len = Adapter->BSSIDList[i].Ssid.SsidLength;
        memcpy(scan_res[i].SSID, Adapter->BSSIDList[i].Ssid.Ssid, 
               Adapter->BSSIDList[i].Ssid.SsidLength);
        memcpy(scan_res[i].BSSID, Adapter->BSSIDList[i].MacAddress, 
               ETH_ALEN);
        memcpy(&scan_res[i].Capability, &Adapter->BSSIDList[i].Cap,sizeof(IEEEtypes_CapInfo_t)); 

        //here copy the WPA_IE info into the structure
#ifdef WPA
        memcpy(scan_res[i].WPA_IE, Adapter->BSSIDList[i].wpa_supplicant.Wpa_ie, 40); 
        scan_res[i].wpa_ie_len = Adapter->BSSIDList[i].wpa_supplicant.Wpa_ie_len; 
#endif
    }
	
	dwrq->length = i;
	
	LEAVE();
	return 0;
}

int wlan_extscan_ioctl(wlan_private *priv,WLAN_802_11_SSID Ext_Scan_SSID )
{

	SendSpecificScan(priv, &Ext_Scan_SSID);

	LEAVE();
	return 0;
}
int wlan_do_ioctl(struct net_device *dev, struct ifreq *req, int i)
{
	return 0;
}


void os_free_tx_packet(wlan_private *priv)
{
	char	*pktBuf;
	u32	pktLen, flags;
	wlan_adapter *Adapter = priv->adapter;
	
	/* 
	 * we set the CurrentTxSkb = NULL before we indicate that 
	 * the TX is complete. This fixes a problem where we have a high  
	 * number of dropped tx packets. The dropped tx packets were being 
	 * caused because the next tx was done in the context of the 
	 * WlanShimDTxPktSent callup before the currentTxSkb had been 
	 * NULLED out. Since CurrentTxSkb was non-null, the tx was dropped.
	 */

	spin_lock_irqsave(&Adapter->CurrentTxLock, flags);

	pktBuf = Adapter->CurrentTxSkb->data;
	pktLen =  Adapter->CurrentTxSkb->len;
	Adapter->CurrentTxSkb = NULL;
	
	spin_unlock_irqrestore(&Adapter->CurrentTxLock, flags);

	WlanShimDTxPktSent(pktBuf, pktLen);
	PRINTK1("Skb Freed $$\n");
}

int CopyMulticastAddrs(wlan_adapter *Adapter, struct net_device *dev)
{
	int	i;

	for (i = 0; i < dev->mc_count; i++) {
		memcpy(&Adapter->MulticastList[i], dev->list[i], ETH_ALEN);
	}

	return i;
}

#ifdef WPA
int wlan_setwpaie_ioctl(wlan_private *priv, char* wpaie, int wpaie_len)
{
	wlan_adapter	*Adapter = priv->adapter;
	int ret;

	ENTER();


	if(wpaie_len){
		memcpy(Adapter->Wpa_ie, wpaie, wpaie_len);
		Adapter->Wpa_ie_len = wpaie_len;
	}else{
		memset(Adapter->Wpa_ie, 0, sizeof(Adapter->Wpa_ie));
		Adapter->Wpa_ie_len = wpaie_len;
		Adapter->SecInfo.WPAEnabled = FALSE;
	}

	if (Adapter->Wpa_ie[0] == WPA_IE){
			Adapter->SecInfo.WPAEnabled = TRUE;
	}else {
			Adapter->SecInfo.WPAEnabled = FALSE;
	}

	/* enable/disable RSN in firmware if WPA is enabled/disabled
	 * depending on variable Adapter->SecInfo.WPAEnabled is set or not
	 */

    	ret = PrepareAndSendCommand(priv, HostCmd_CMD_802_11_ENABLE_RSN,
			HostCmd_ACT_SET, HostCmd_OPTION_USE_INT 
			| HostCmd_OPTION_WAITFORRSP
			, 0, HostCmd_PENDING_ON_NONE, NULL);

	

	LEAVE();
	return ret;
}
#endif

void wireless_send_event(struct net_device *    dev,
                          unsigned int           cmd,
                          union iwreq_data *     wrqu,
                          char *                 extra)
{
         const struct iw_ioctl_description *     descr = NULL;
         struct iw_event*  event;                
         int extra_len = 0;
         int event_len;                         
         int hdr_len;                          
         unsigned        cmd_index;              

     	 printk("!!! wireless_send_event cmd = %#x !!!\n", cmd);
 
         /* Get the description of the IOCTL */
         if(cmd <= SIOCIWLAST) {
                cmd_index = cmd - SIOCIWFIRST;
                 if(cmd_index < standard_ioctl_num)
                         descr = &(standard_ioctl[cmd_index]);
         } else {
                 cmd_index = cmd - IWEVFIRST;
                 if(cmd_index < standard_event_num)
                         descr = &(standard_event[cmd_index]);
         }
         /* Don't accept unknown events */
         if(descr == NULL) {
                 /* Note : we don't return an error to the driver, because
                  * the driver would not know what to do about it. It can't
                  * return an error to the user, because the event is not
                  * initiated by a user request.
                  * The best the driver could do is to log an error message.
                  * We will do it ourselves instead...
                 printk( "%s (WE) : Invalid/Unknown Wireless Event (0x%04X)\n",
                       dev->name, cmd);
                  */
                 printk( "OS_MISC.c:Invalid/Unknown Wireless Event \n");
                 return;
         }

         /* Check extra parameters and set extra_len */
         if(descr->header_type == IW_HEADER_TYPE_POINT) {
         /* Check if number of token fits within bounds */
                 if(wrqu->data.length > descr->max_tokens) {
                         printk( " (WE) : Wireless Event too big ()\n");
                         return;
                 }
                 if(wrqu->data.length < descr->min_tokens) {
                         printk( " (WE) : Wireless Event too small ()\n");
                         return;
                 }
                 /* Calculate extra_len - extra is NULL for restricted events */
                 if(extra != NULL)
                         extra_len = wrqu->data.length * descr->token_size;
         }
 
         /* Total length of the event */
         hdr_len = event_type_size[descr->header_type];
         event_len = hdr_len + extra_len;
 
         event = getMemory(event_len, SCRATCHALLOC);
 
         /* Fill event */
         event->len = event_len;
         event->cmd = cmd;
         memcpy(&event->u, wrqu, hdr_len - IW_EV_LCP_LEN);

         if(extra != NULL)
                 memcpy(((char *)event) + hdr_len, extra, extra_len);

      printk("CALLING wpa_driver_wext_event_wireless event_len = %d!!!!!\n", event_len);
#ifdef WPA
	 wpa_driver_wext_event_wireless(NULL, event, event_len);
#endif
 
     agFree(event);
         return;         /* Always success, I guess  */
 }
struct net_device *init_etherdev(struct net_device * dev, int y) 
{ 
	printk(" allocation enter priv size %d %d\n", y, sizeof(wlan_private));
	dev =  (struct net_device *) AGMALLOC(sizeof(struct net_device), SCRATCHALLOC); 
  
	printk(" dev->priv allocation \n");
	printk(" before memset wlanpriv %p\n", wlanpriv);
   
	memset(dev ,0,sizeof(struct net_device)); 
	printk(" between memset \n");

	wlanpriv =  (wlan_private *) AGMALLOC(sizeof(wlan_private),SCRATCHALLOC);
	memset(wlanpriv ,0,sizeof(wlan_private));
	dev->priv = wlanpriv;
  
  	printk(" After memset \n");

  	return(dev);
}

struct sk_buff * dev_alloc_skb( u32 len)
{
	struct sk_buff *skb;

	skb =  (struct sk_buff *) AGMALLOC(sizeof(struct sk_buff), SCRATCHALLOC); 
	skb->data = (u8 *) AGMALLOC(len, SCRATCHALLOC);
	INIT_LIST_HEAD(skb);	
	skb->tail=skb->data;
	skb->len=len;
	
	return skb;
}

void os_carrier_on(wlan_private *priv)
{
}

void os_carrier_off(wlan_private *priv)
{
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -