You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
staging: Beeceem USB Wimax driver
The Sprint 4G network uses a Wimax dongle with Beecem chipset. The driver is typical of out of tree drivers, but maybe useful for people, and the hardware is readily available. Here is a staging ready version (i.e warts and all) 0. Started with Rel_5.2.7.3P1_USB from Sprint4GDeveloperPack-1.1 1. Consolidated files in staging 2. Remove Dos cr/lf 3. Remove unnecessary ioctl from usbbcm_fops Applied patches that were in the developer pack, surprising there were ones for 2.6.35 already. This is compile tested only, see TODO for what still needs to be done. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2d2f03b022
commit
f8942e07a3
@@ -161,5 +161,7 @@ source "drivers/staging/ath6kl/Kconfig"
|
||||
|
||||
source "drivers/staging/keucr/Kconfig"
|
||||
|
||||
source "drivers/staging/bcm/Kconfig"
|
||||
|
||||
endif # !STAGING_EXCLUDE_BUILD
|
||||
endif # STAGING
|
||||
|
||||
@@ -61,3 +61,4 @@ obj-$(CONFIG_WESTBRIDGE_ASTORIA) += westbridge/astoria/
|
||||
obj-$(CONFIG_SBE_2T3E3) += sbe-2t3e3/
|
||||
obj-$(CONFIG_ATH6K_LEGACY) += ath6kl/
|
||||
obj-$(CONFIG_USB_ENESTORAGE) += keucr/
|
||||
obj-$(CONFIG_BCM_WIMAX) += bcm/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,94 @@
|
||||
|
||||
/*
|
||||
* File Name: Arp.c
|
||||
* Abstract: This file contains the routines for handling ARP PACKETS
|
||||
*/
|
||||
#include "headers.h"
|
||||
#define ARP_PKT_SIZE 60
|
||||
|
||||
/* =========================================================================
|
||||
* Function - reply_to_arp_request()
|
||||
*
|
||||
* Description - When this host tries to broadcast ARP request packet through
|
||||
* the virtual interface (veth0), reply directly to upper layer.
|
||||
* This function allocates a new skb for ARP reply packet,
|
||||
* fills in the fields of the packet and then sends it to
|
||||
* upper layer.
|
||||
*
|
||||
* Parameters - skb: Pointer to sk_buff structure of the ARP request pkt.
|
||||
*
|
||||
* Returns - None
|
||||
* =========================================================================*/
|
||||
|
||||
VOID
|
||||
reply_to_arp_request(struct sk_buff *skb)
|
||||
{
|
||||
PMINI_ADAPTER Adapter;
|
||||
struct ArpHeader *pArpHdr = NULL;
|
||||
struct ethhdr *pethhdr = NULL;
|
||||
UCHAR uiIPHdr[4];
|
||||
/* Check for valid skb */
|
||||
if(skb == NULL)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "Invalid skb: Cannot reply to ARP request\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Adapter = GET_BCM_ADAPTER(skb->dev);
|
||||
/* Print the ARP Request Packet */
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, ARP_RESP, DBG_LVL_ALL, "ARP Packet Dump :");
|
||||
BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_TX, ARP_RESP, DBG_LVL_ALL, (PUCHAR)(skb->data), skb->len);
|
||||
|
||||
/*
|
||||
* Extract the Ethernet Header and Arp Payload including Header
|
||||
*/
|
||||
pethhdr = (struct ethhdr *)skb->data;
|
||||
pArpHdr = (struct ArpHeader *)(skb->data+ETH_HLEN);
|
||||
|
||||
if(Adapter->bETHCSEnabled)
|
||||
{
|
||||
if(memcmp(pethhdr->h_source, Adapter->dev->dev_addr, ETH_ALEN))
|
||||
{
|
||||
bcm_kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Set the Ethernet Header First.
|
||||
memcpy(pethhdr->h_dest, pethhdr->h_source, ETH_ALEN);
|
||||
if(!memcmp(pethhdr->h_source, Adapter->dev->dev_addr, ETH_ALEN))
|
||||
{
|
||||
pethhdr->h_source[5]++;
|
||||
}
|
||||
|
||||
/* Set the reply to ARP Reply */
|
||||
pArpHdr->arp.ar_op = ntohs(ARPOP_REPLY);
|
||||
|
||||
/* Set the HW Address properly */
|
||||
memcpy(pArpHdr->ar_sha, pethhdr->h_source, ETH_ALEN);
|
||||
memcpy(pArpHdr->ar_tha, pethhdr->h_dest, ETH_ALEN);
|
||||
|
||||
// Swapping the IP Adddress
|
||||
memcpy(uiIPHdr,pArpHdr->ar_sip,4);
|
||||
memcpy(pArpHdr->ar_sip,pArpHdr->ar_tip,4);
|
||||
memcpy(pArpHdr->ar_tip,uiIPHdr,4);
|
||||
|
||||
/* Print the ARP Reply Packet */
|
||||
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, ARP_RESP, DBG_LVL_ALL, "ARP REPLY PACKET: ");
|
||||
|
||||
/* Send the Packet to upper layer */
|
||||
BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_TX, ARP_RESP, DBG_LVL_ALL, (PUCHAR)(skb->data), skb->len);
|
||||
|
||||
skb->protocol = eth_type_trans(skb,skb->dev);
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
|
||||
// skb->mac.raw=skb->data+LEADER_SIZE;
|
||||
skb_set_mac_header (skb, LEADER_SIZE);
|
||||
netif_rx(skb);
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, ARP_RESP, DBG_LVL_ALL, "<=============\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,266 @@
|
||||
#include "headers.h"
|
||||
|
||||
static INT bcm_notify_event(struct notifier_block *nb, ULONG event, PVOID dev)
|
||||
{
|
||||
struct net_device *ndev = (struct net_device*)dev;
|
||||
PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
|
||||
//PMINI_ADAPTER Adapter = (PMINI_ADAPTER)ndev->priv;
|
||||
if(strncmp(ndev->name,gblpnetdev->name,5)==0)
|
||||
{
|
||||
switch(event)
|
||||
{
|
||||
case NETDEV_CHANGEADDR:
|
||||
case NETDEV_GOING_DOWN:
|
||||
/*ignore this */
|
||||
break;
|
||||
case NETDEV_DOWN:
|
||||
break;
|
||||
|
||||
case NETDEV_UP:
|
||||
break;
|
||||
|
||||
case NETDEV_REGISTER:
|
||||
/* Increment the Reference Count for "veth0" */
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Register RefCount: %x\n",
|
||||
atomic_read(&ndev->refcnt));
|
||||
atomic_inc(&ndev->refcnt);
|
||||
break;
|
||||
|
||||
case NETDEV_UNREGISTER:
|
||||
/* Decrement the Reference Count for "veth0" */
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Unregister RefCnt: %x\n",
|
||||
atomic_read(&ndev->refcnt));
|
||||
atomic_dec(&ndev->refcnt);
|
||||
if((int)atomic_read(&ndev->refcnt) < 0)
|
||||
atomic_set(&ndev->refcnt, 0);
|
||||
break;
|
||||
};
|
||||
}
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
/* Notifier block to receive netdevice events */
|
||||
static struct notifier_block bcm_notifier_block =
|
||||
{
|
||||
.notifier_call = bcm_notify_event,
|
||||
};
|
||||
|
||||
struct net_device *gblpnetdev;
|
||||
/***************************************************************************************/
|
||||
/* proto-type of lower function */
|
||||
#ifdef BCM_SHM_INTERFACE
|
||||
const char *bcmVirtDeviceName="bcmeth";
|
||||
#endif
|
||||
|
||||
static INT bcm_open(struct net_device *dev)
|
||||
{
|
||||
PMINI_ADAPTER Adapter = NULL ; //(PMINI_ADAPTER)dev->priv;
|
||||
Adapter = GET_BCM_ADAPTER(dev);
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "======>");
|
||||
if(Adapter->fw_download_done==FALSE)
|
||||
return -EINVAL;
|
||||
Adapter->if_up=1;
|
||||
if(Adapter->LinkUpStatus == 1){
|
||||
if(netif_queue_stopped(Adapter->dev)){
|
||||
netif_carrier_on(Adapter->dev);
|
||||
netif_start_queue(Adapter->dev);
|
||||
}
|
||||
}
|
||||
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "<======");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT bcm_close(struct net_device *dev)
|
||||
{
|
||||
PMINI_ADAPTER Adapter = NULL ;//gpadapter ;
|
||||
Adapter = GET_BCM_ADAPTER(dev);
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "=====>");
|
||||
Adapter->if_up=0;
|
||||
if(!netif_queue_stopped(dev)) {
|
||||
netif_carrier_off(dev);
|
||||
netif_stop_queue(dev);
|
||||
}
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL,"<=====");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct net_device_stats *bcm_get_stats(struct net_device *dev)
|
||||
{
|
||||
PLINUX_DEP_DATA pLinuxData=NULL;
|
||||
PMINI_ADAPTER Adapter = NULL ;// gpadapter ;
|
||||
Adapter = GET_BCM_ADAPTER(dev);
|
||||
pLinuxData = (PLINUX_DEP_DATA)(Adapter->pvOsDepData);
|
||||
|
||||
//BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Dev = %p, pLinuxData = %p", dev, pLinuxData);
|
||||
pLinuxData->netstats.rx_packets=atomic_read(&Adapter->RxRollOverCount)*64*1024+Adapter->PrevNumRecvDescs;
|
||||
pLinuxData->netstats.rx_bytes=atomic_read(&Adapter->GoodRxByteCount)+atomic_read(&Adapter->BadRxByteCount);
|
||||
pLinuxData->netstats.rx_dropped=atomic_read(&Adapter->RxPacketDroppedCount);
|
||||
pLinuxData->netstats.rx_errors=atomic_read(&Adapter->RxPacketDroppedCount);
|
||||
pLinuxData->netstats.rx_length_errors=0;
|
||||
pLinuxData->netstats.rx_frame_errors=0;
|
||||
pLinuxData->netstats.rx_crc_errors=0;
|
||||
pLinuxData->netstats.tx_bytes=atomic_read(&Adapter->GoodTxByteCount);
|
||||
pLinuxData->netstats.tx_packets=atomic_read(&Adapter->TxTotalPacketCount);
|
||||
pLinuxData->netstats.tx_dropped=atomic_read(&Adapter->TxDroppedPacketCount);
|
||||
|
||||
return &(pLinuxData->netstats);
|
||||
}
|
||||
/**
|
||||
@ingroup init_functions
|
||||
Register other driver entry points with the kernel
|
||||
*/
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
|
||||
struct net_device_ops bcmNetDevOps = {
|
||||
.ndo_open = bcm_open,
|
||||
.ndo_stop = bcm_close,
|
||||
.ndo_get_stats = bcm_get_stats,
|
||||
.ndo_start_xmit = bcm_transmit,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
};
|
||||
#endif
|
||||
|
||||
int register_networkdev(PMINI_ADAPTER Adapter)
|
||||
{
|
||||
int result=0;
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
||||
int *temp = NULL ;
|
||||
#endif
|
||||
Adapter->dev = alloc_etherdev(sizeof(PMINI_ADAPTER));
|
||||
if(!Adapter->dev)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "ERR: No Dev");
|
||||
return -ENOMEM;
|
||||
}
|
||||
gblpnetdev = Adapter->dev;
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
|
||||
Adapter->dev->priv = Adapter;
|
||||
#else
|
||||
temp = netdev_priv(Adapter->dev);
|
||||
*temp = (UINT)Adapter;
|
||||
#endif
|
||||
//BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "init adapterptr: %x %x\n", (UINT)Adapter, temp);
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
|
||||
Adapter->dev->netdev_ops = &bcmNetDevOps;
|
||||
#else
|
||||
Adapter->dev->open = bcm_open;
|
||||
Adapter->dev->stop = bcm_close;
|
||||
Adapter->dev->get_stats = bcm_get_stats;
|
||||
Adapter->dev->hard_start_xmit = bcm_transmit;
|
||||
Adapter->dev->hard_header_len = ETH_HLEN + LEADER_SIZE;
|
||||
#endif
|
||||
|
||||
#ifndef BCM_SHM_INTERFACE
|
||||
Adapter->dev->mtu = MTU_SIZE; /* 1400 Bytes */
|
||||
/* Read the MAC Address from EEPROM */
|
||||
ReadMacAddressFromNVM(Adapter);
|
||||
|
||||
|
||||
/* Register the notifier block for getting netdevice events */
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Registering netdevice notifier\n");
|
||||
result = register_netdevice_notifier(&bcm_notifier_block);
|
||||
if(result)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "BCM Notifier Block did not get registered");
|
||||
Adapter->bNetdeviceNotifierRegistered = FALSE;
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "BCM Notifier got Registered");
|
||||
Adapter->bNetdeviceNotifierRegistered = TRUE;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
Adapter->dev->mtu = CPE_MTU_SIZE;
|
||||
|
||||
#if 0
|
||||
//for CPE - harcode the virtual mac address
|
||||
Adapter->dev->dev_addr[0] = MII_WIMAX_MACADDRESS[0];
|
||||
Adapter->dev->dev_addr[1] = MII_WIMAX_MACADDRESS[1];
|
||||
Adapter->dev->dev_addr[2] = MII_WIMAX_MACADDRESS[2];
|
||||
Adapter->dev->dev_addr[3] = MII_WIMAX_MACADDRESS[3];
|
||||
Adapter->dev->dev_addr[4] = MII_WIMAX_MACADDRESS[4];
|
||||
Adapter->dev->dev_addr[5] = MII_WIMAX_MACADDRESS[5];
|
||||
#else
|
||||
ReadMacAddressFromNVM(Adapter);
|
||||
#endif
|
||||
strcpy(Adapter->dev->name, bcmVirtDeviceName); //Copy the device name
|
||||
|
||||
#endif
|
||||
|
||||
result = register_netdev(Adapter->dev);
|
||||
if (!result)
|
||||
{
|
||||
Adapter->bNetworkInterfaceRegistered = TRUE ;
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Beceem Network device name is %s!", Adapter->dev->name);
|
||||
}
|
||||
else
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Network device can not be registered!");
|
||||
Adapter->bNetworkInterfaceRegistered = FALSE ;
|
||||
return result;
|
||||
}
|
||||
|
||||
#if 0
|
||||
Adapter->stDebugState.debug_level = DBG_LVL_CURR;
|
||||
Adapter->stDebugState.type =(UINT)0xffffffff;
|
||||
Adapter->stDebugState.subtype[DBG_TYPE_OTHERS] = 0xffffffff;
|
||||
Adapter->stDebugState.subtype[DBG_TYPE_RX] = 0xffffffff;
|
||||
Adapter->stDebugState.subtype[DBG_TYPE_TX] = 0xffffffff;
|
||||
Adapter->stDebugState.subtype[DBG_TYPE_INITEXIT] = 0xffffffff;
|
||||
|
||||
printk("-------ps_adapter->stDebugState.type=%x\n",Adapter->stDebugState.type);
|
||||
printk("-------ps_adapter->stDebugState.subtype[DBG_TYPE_OTHERS]=%x\n",Adapter->stDebugState.subtype[DBG_TYPE_OTHERS]);
|
||||
printk("-------ps_adapter->stDebugState.subtype[DBG_TYPE_RX]=%x\n",Adapter->stDebugState.subtype[DBG_TYPE_RX]);
|
||||
printk("-------ps_adapter->stDebugState.subtype[DBG_TYPE_TX]=%x\n",Adapter->stDebugState.subtype[DBG_TYPE_TX]);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bcm_unregister_networkdev(PMINI_ADAPTER Adapter)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Unregistering the Net Dev...\n");
|
||||
if(Adapter->dev && !IS_ERR(Adapter->dev) && Adapter->bNetworkInterfaceRegistered)
|
||||
unregister_netdev(Adapter->dev);
|
||||
/* Unregister the notifier block */
|
||||
if(Adapter->bNetdeviceNotifierRegistered == TRUE)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Unregistering netdevice notifier\n");
|
||||
unregister_netdevice_notifier(&bcm_notifier_block);
|
||||
}
|
||||
}
|
||||
|
||||
static int bcm_init(void)
|
||||
{
|
||||
int result;
|
||||
result = InterfaceInitialize();
|
||||
if(result)
|
||||
{
|
||||
printk("Initialisation failed for usbbcm");
|
||||
}
|
||||
else
|
||||
{
|
||||
printk("Initialised usbbcm");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
static void bcm_exit(void)
|
||||
{
|
||||
printk("%s %s Calling InterfaceExit\n",__FILE__, __FUNCTION__);
|
||||
InterfaceExit();
|
||||
printk("%s %s InterfaceExit returned\n",__FILE__, __FUNCTION__);
|
||||
}
|
||||
|
||||
module_init(bcm_init);
|
||||
module_exit(bcm_exit);
|
||||
MODULE_LICENSE ("GPL");
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,166 @@
|
||||
/// **************************************************************************
|
||||
/// (c) Beceem Communications Inc.
|
||||
/// All Rights Reserved
|
||||
///
|
||||
/// \file : CmHost.h
|
||||
/// \author : Rajeev Tirumala
|
||||
/// \date : September 8 , 2006
|
||||
/// \brief : Definitions for Connection Management Requests structure
|
||||
/// which we will use to setup our connection structures.Its high
|
||||
/// time we had a header file for CmHost.cpp to isolate the way
|
||||
/// f/w sends DSx messages and the way we interpret them in code.
|
||||
/// Revision History
|
||||
///
|
||||
/// Date Author Version Description
|
||||
/// 08-Sep-06 Rajeev 0.1 Created
|
||||
/// **************************************************************************
|
||||
#ifndef _CM_HOST_H
|
||||
#define _CM_HOST_H
|
||||
|
||||
#pragma once
|
||||
#pragma pack (push,4)
|
||||
|
||||
#define DSX_MESSAGE_EXCHANGE_BUFFER 0xBF60AC84 // This contains the pointer
|
||||
#define DSX_MESSAGE_EXCHANGE_BUFFER_SIZE 72000 // 24 K Bytes
|
||||
|
||||
/// \brief structure stLocalSFAddRequest
|
||||
typedef struct stLocalSFAddRequestAlt{
|
||||
B_UINT8 u8Type;
|
||||
B_UINT8 u8Direction;
|
||||
|
||||
B_UINT16 u16TID;
|
||||
/// \brief 16bitCID
|
||||
B_UINT16 u16CID;
|
||||
/// \brief 16bitVCID
|
||||
B_UINT16 u16VCID;
|
||||
|
||||
|
||||
/// \brief structure ParameterSet
|
||||
stServiceFlowParamSI sfParameterSet;
|
||||
|
||||
//USE_MEMORY_MANAGER();
|
||||
}stLocalSFAddRequestAlt;
|
||||
|
||||
/// \brief structure stLocalSFAddIndication
|
||||
typedef struct stLocalSFAddIndicationAlt{
|
||||
B_UINT8 u8Type;
|
||||
B_UINT8 u8Direction;
|
||||
B_UINT16 u16TID;
|
||||
/// \brief 16bitCID
|
||||
B_UINT16 u16CID;
|
||||
/// \brief 16bitVCID
|
||||
B_UINT16 u16VCID;
|
||||
/// \brief structure AuthorizedSet
|
||||
stServiceFlowParamSI sfAuthorizedSet;
|
||||
/// \brief structure AdmittedSet
|
||||
stServiceFlowParamSI sfAdmittedSet;
|
||||
/// \brief structure ActiveSet
|
||||
stServiceFlowParamSI sfActiveSet;
|
||||
|
||||
B_UINT8 u8CC; /**< Confirmation Code*/
|
||||
B_UINT8 u8Padd; /**< 8-bit Padding */
|
||||
B_UINT16 u16Padd; /**< 16 bit Padding */
|
||||
// USE_MEMORY_MANAGER();
|
||||
}stLocalSFAddIndicationAlt;
|
||||
|
||||
/// \brief structure stLocalSFAddConfirmation
|
||||
typedef struct stLocalSFAddConfirmationAlt{
|
||||
B_UINT8 u8Type;
|
||||
B_UINT8 u8Direction;
|
||||
B_UINT16 u16TID;
|
||||
/// \brief 16bitCID
|
||||
B_UINT16 u16CID;
|
||||
/// \brief 16bitVCID
|
||||
B_UINT16 u16VCID;
|
||||
/// \brief structure AuthorizedSet
|
||||
stServiceFlowParamSI sfAuthorizedSet;
|
||||
/// \brief structure AdmittedSet
|
||||
stServiceFlowParamSI sfAdmittedSet;
|
||||
/// \brief structure ActiveSet
|
||||
stServiceFlowParamSI sfActiveSet;
|
||||
}stLocalSFAddConfirmationAlt;
|
||||
|
||||
|
||||
/// \brief structure stLocalSFChangeRequest
|
||||
typedef struct stLocalSFChangeRequestAlt{
|
||||
B_UINT8 u8Type;
|
||||
B_UINT8 u8Direction;
|
||||
B_UINT16 u16TID;
|
||||
/// \brief 16bitCID
|
||||
B_UINT16 u16CID;
|
||||
/// \brief 16bitVCID
|
||||
B_UINT16 u16VCID;
|
||||
/*
|
||||
//Pointer location at which following Service Flow param Structure can be read
|
||||
//from the target. We get only the address location and we need to read out the
|
||||
//entire SF param structure at the given location on target
|
||||
*/
|
||||
/// \brief structure AuthorizedSet
|
||||
stServiceFlowParamSI sfAuthorizedSet;
|
||||
/// \brief structure AdmittedSet
|
||||
stServiceFlowParamSI sfAdmittedSet;
|
||||
/// \brief structure ParameterSet
|
||||
stServiceFlowParamSI sfActiveSet;
|
||||
|
||||
B_UINT8 u8CC; /**< Confirmation Code*/
|
||||
B_UINT8 u8Padd; /**< 8-bit Padding */
|
||||
B_UINT16 u16Padd; /**< 16 bit */
|
||||
|
||||
}stLocalSFChangeRequestAlt;
|
||||
|
||||
/// \brief structure stLocalSFChangeConfirmation
|
||||
typedef struct stLocalSFChangeConfirmationAlt{
|
||||
B_UINT8 u8Type;
|
||||
B_UINT8 u8Direction;
|
||||
B_UINT16 u16TID;
|
||||
/// \brief 16bitCID
|
||||
B_UINT16 u16CID;
|
||||
/// \brief 16bitVCID
|
||||
B_UINT16 u16VCID;
|
||||
/// \brief structure AuthorizedSet
|
||||
stServiceFlowParamSI sfAuthorizedSet;
|
||||
/// \brief structure AdmittedSet
|
||||
stServiceFlowParamSI sfAdmittedSet;
|
||||
/// \brief structure ActiveSet
|
||||
stServiceFlowParamSI sfActiveSet;
|
||||
|
||||
}stLocalSFChangeConfirmationAlt;
|
||||
|
||||
/// \brief structure stLocalSFChangeIndication
|
||||
typedef struct stLocalSFChangeIndicationAlt{
|
||||
B_UINT8 u8Type;
|
||||
B_UINT8 u8Direction;
|
||||
B_UINT16 u16TID;
|
||||
/// \brief 16bitCID
|
||||
B_UINT16 u16CID;
|
||||
/// \brief 16bitVCID
|
||||
B_UINT16 u16VCID;
|
||||
/// \brief structure AuthorizedSet
|
||||
stServiceFlowParamSI sfAuthorizedSet;
|
||||
/// \brief structure AdmittedSet
|
||||
stServiceFlowParamSI sfAdmittedSet;
|
||||
/// \brief structure ActiveSet
|
||||
stServiceFlowParamSI sfActiveSet;
|
||||
|
||||
B_UINT8 u8CC; /**< Confirmation Code*/
|
||||
B_UINT8 u8Padd; /**< 8-bit Padding */
|
||||
B_UINT16 u16Padd; /**< 16 bit */
|
||||
|
||||
}stLocalSFChangeIndicationAlt;
|
||||
|
||||
ULONG StoreCmControlResponseMessage(PMINI_ADAPTER Adapter,PVOID pvBuffer,UINT *puBufferLength);
|
||||
|
||||
ULONG GetNextTargetBufferLocation(PMINI_ADAPTER Adapter,B_UINT16 tid);
|
||||
|
||||
INT AllocAdapterDsxBuffer(PMINI_ADAPTER Adapter);
|
||||
|
||||
INT FreeAdapterDsxBuffer(PMINI_ADAPTER Adapter);
|
||||
ULONG SetUpTargetDsxBuffers(PMINI_ADAPTER Adapter);
|
||||
|
||||
BOOLEAN CmControlResponseMessage(PMINI_ADAPTER Adapter,PVOID pvBuffer);
|
||||
|
||||
VOID deleteSFBySfid(PMINI_ADAPTER Adapter, UINT uiSearchRuleIndex);
|
||||
|
||||
#pragma pack (pop)
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,9 @@
|
||||
#ifndef _DDR_INIT_H_
|
||||
#define _DDR_INIT_H_
|
||||
|
||||
|
||||
|
||||
int ddr_init(PMINI_ADAPTER psAdapter);
|
||||
int download_ddr_settings(PMINI_ADAPTER psAdapter);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,40 @@
|
||||
#include "headers.h"
|
||||
|
||||
char *buff_dump_base[]={"DEC", "HEX", "OCT", "BIN" };
|
||||
|
||||
static UINT current_debug_level=BCM_SCREAM;
|
||||
|
||||
int bcm_print_buffer( UINT debug_level, const char *function_name,
|
||||
char *file_name, int line_number, unsigned char *buffer, int bufferlen, unsigned int base)
|
||||
{
|
||||
if(debug_level>=current_debug_level)
|
||||
{
|
||||
int i=0;
|
||||
printk("\n%s:%s:%d:Buffer dump of size 0x%x in the %s:\n", file_name, function_name, line_number, bufferlen, buff_dump_base[1]);
|
||||
for(;i<bufferlen;i++)
|
||||
{
|
||||
if(i && !(i%16) )
|
||||
printk("\n");
|
||||
switch(base)
|
||||
{
|
||||
case BCM_BASE_TYPE_DEC:
|
||||
printk("%03d ", buffer[i]);
|
||||
break;
|
||||
case BCM_BASE_TYPE_OCT:
|
||||
printk("%0x03o ", buffer[i]);
|
||||
break;
|
||||
case BCM_BASE_TYPE_BIN:
|
||||
printk("%02x ", buffer[i]);
|
||||
break;
|
||||
case BCM_BASE_TYPE_HEX:
|
||||
default:
|
||||
printk("%02X ", buffer[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
printk("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,297 @@
|
||||
/*
|
||||
* Debug.h
|
||||
*
|
||||
* Dynamic (runtime) debug framework implementation.
|
||||
* -kaiwan.
|
||||
*/
|
||||
#ifndef _DEBUG_H
|
||||
#define _DEBUG_H
|
||||
#include <linux/string.h>
|
||||
#define NONE 0xFFFF
|
||||
|
||||
typedef enum _BASE_TYPE
|
||||
{
|
||||
BCM_BASE_TYPE_DEC,
|
||||
BCM_BASE_TYPE_OCT,
|
||||
BCM_BASE_TYPE_BIN,
|
||||
BCM_BASE_TYPE_HEX,
|
||||
BCM_BASE_TYPE_NONE,
|
||||
} BASE_TYPE, *PBASE_TYPE;
|
||||
|
||||
int bcm_print_buffer( UINT debug_level, const char *function_name,
|
||||
char *file_name, int line_number, unsigned char *buffer, int bufferlen, BASE_TYPE base);
|
||||
|
||||
#ifdef BCM_SHM_INTERFACE
|
||||
#define CPE_VIRTUAL_ERROR_CODE_BASE_ADDR (0xBFC02E00 + 0x4C)
|
||||
// ERROR codes for debugging
|
||||
extern unsigned char u32ErrorCounter ;
|
||||
#define ERROR_DEVICE_REMOVED 0x1
|
||||
#define ERROR_LEADER_LENGTH_ZERO 0x2
|
||||
#define ERROR_LEADER_LENGTH_CORRUPTED 0x3
|
||||
#define ERROR_NO_SKBUFF 0x4
|
||||
|
||||
#define ERROR_DL_MODULE 0xaa000000
|
||||
extern void CPE_ERROR_LOG(unsigned int module,unsigned int code);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
/* TYPE and SUBTYPE
|
||||
* Define valid TYPE (or category or code-path, however you like to think of it)
|
||||
* and SUBTYPE s.
|
||||
* Type and SubType are treated as bitmasks.
|
||||
*/
|
||||
/*-----------------BEGIN TYPEs------------------------------------------*/
|
||||
#define DBG_TYPE_INITEXIT (1 << 0) // 1
|
||||
#define DBG_TYPE_TX (1 << 1) // 2
|
||||
#define DBG_TYPE_RX (1 << 2) // 4
|
||||
#define DBG_TYPE_OTHERS (1 << 3) // 8
|
||||
/*-----------------END TYPEs------------------------------------------*/
|
||||
#define NUMTYPES 4 // careful!
|
||||
|
||||
/*-----------------BEGIN SUBTYPEs---------------------------------------*/
|
||||
|
||||
/*-SUBTYPEs for TX : TYPE is DBG_TYPE_TX -----//
|
||||
Transmit.c ,Arp.c, LeakyBucket.c, And Qos.c
|
||||
total 17 macros */
|
||||
// Transmit.c
|
||||
#define TX 1
|
||||
#define MP_SEND (TX<<0)
|
||||
#define NEXT_SEND (TX<<1)
|
||||
#define TX_FIFO (TX<<2)
|
||||
#define TX_CONTROL (TX<<3)
|
||||
|
||||
// Arp.c
|
||||
#define IP_ADDR (TX<<4)
|
||||
#define ARP_REQ (TX<<5)
|
||||
#define ARP_RESP (TX<<6)
|
||||
|
||||
// dhcp.c
|
||||
//#define DHCP TX
|
||||
//#define DHCP_REQ (DHCP<<7)
|
||||
|
||||
// Leakybucket.c
|
||||
#define TOKEN_COUNTS (TX<<8)
|
||||
#define CHECK_TOKENS (TX<<9)
|
||||
#define TX_PACKETS (TX<<10)
|
||||
#define TIMER (TX<<11)
|
||||
|
||||
// Qos.c
|
||||
#define QOS TX
|
||||
#define QUEUE_INDEX (QOS<<12)
|
||||
#define IPV4_DBG (QOS<<13)
|
||||
#define IPV6_DBG (QOS<<14)
|
||||
#define PRUNE_QUEUE (QOS<<15)
|
||||
#define SEND_QUEUE (QOS<<16)
|
||||
|
||||
//TX_Misc
|
||||
#define TX_OSAL_DBG (TX<<17)
|
||||
|
||||
|
||||
//--SUBTYPEs for ------INIT & EXIT---------------------
|
||||
/*------------ TYPE is DBG_TYPE_INITEXIT -----//
|
||||
DriverEntry.c, bcmfwup.c, ChipDetectTask.c, HaltnReset.c, InterfaceDDR.c */
|
||||
#define MP 1
|
||||
#define DRV_ENTRY (MP<<0)
|
||||
#define MP_INIT (MP<<1)
|
||||
#define READ_REG (MP<<3)
|
||||
#define DISPATCH (MP<<2)
|
||||
#define CLAIM_ADAP (MP<<4)
|
||||
#define REG_IO_PORT (MP<<5)
|
||||
#define INIT_DISP (MP<<6)
|
||||
#define RX_INIT (MP<<7)
|
||||
|
||||
|
||||
//-SUBTYPEs for --RX----------------------------------
|
||||
//------------RX : TYPE is DBG_TYPE_RX -----//
|
||||
// Receive.c
|
||||
#define RX 1
|
||||
#define RX_DPC (RX<<0)
|
||||
#define RX_CTRL (RX<<3)
|
||||
#define RX_DATA (RX<<4)
|
||||
#define MP_RETURN (RX<<1)
|
||||
#define LINK_MSG (RX<<2)
|
||||
|
||||
|
||||
//-SUBTYPEs for ----OTHER ROUTINES------------------
|
||||
//------------OTHERS : TYPE is DBG_TYPE_OTHER -----//
|
||||
// HaltnReset,CheckForHang,PnP,Misc,CmHost
|
||||
// total 12 macros
|
||||
#define OTHERS 1
|
||||
// ??ISR.C
|
||||
|
||||
#define ISR OTHERS
|
||||
#define MP_DPC (ISR<<0)
|
||||
|
||||
// HaltnReset.c
|
||||
#define HALT OTHERS
|
||||
#define MP_HALT (HALT<<1)
|
||||
#define CHECK_HANG (HALT<<2)
|
||||
#define MP_RESET (HALT<<3)
|
||||
#define MP_SHUTDOWN (HALT<<4)
|
||||
|
||||
// pnp.c
|
||||
#define PNP OTHERS
|
||||
#define MP_PNP (PNP<<5)
|
||||
|
||||
// Misc.c
|
||||
#define MISC OTHERS
|
||||
#define DUMP_INFO (MISC<<6)
|
||||
#define CLASSIFY (MISC<<7)
|
||||
#define LINK_UP_MSG (MISC<<8)
|
||||
#define CP_CTRL_PKT (MISC<<9)
|
||||
#define DUMP_CONTROL (MISC<<10)
|
||||
#define LED_DUMP_INFO (MISC<<11)
|
||||
|
||||
// CmHost.c
|
||||
#define CMHOST OTHERS
|
||||
|
||||
|
||||
#define SERIAL (OTHERS<<12)
|
||||
#define IDLE_MODE (OTHERS<<13)
|
||||
|
||||
#define WRM (OTHERS<<14)
|
||||
#define RDM (OTHERS<<15)
|
||||
|
||||
// TODO - put PHS_SEND in Tx PHS_RECEIVE in Rx path ?
|
||||
#define PHS_SEND (OTHERS<<16)
|
||||
#define PHS_RECIEVE (OTHERS<<17)
|
||||
#define PHS_MODULE (OTHERS<<18)
|
||||
|
||||
#define INTF_INIT (OTHERS<<19)
|
||||
#define INTF_ERR (OTHERS<<20)
|
||||
#define INTF_WARN (OTHERS<<21)
|
||||
#define INTF_NORM (OTHERS<<22)
|
||||
|
||||
#define IRP_COMPLETION (OTHERS<<23)
|
||||
#define SF_DESCRIPTOR_CNTS (OTHERS<<24)
|
||||
#define PHS_DISPATCH (OTHERS << 25)
|
||||
#define OSAL_DBG (OTHERS << 26)
|
||||
#define NVM_RW (OTHERS << 27)
|
||||
|
||||
#define HOST_MIBS (OTHERS << 28)
|
||||
#define CONN_MSG (CMHOST << 29)
|
||||
//#define OTHERS_MISC (OTHERS << 29) // ProcSupport.c
|
||||
/*-----------------END SUBTYPEs------------------------------------------*/
|
||||
|
||||
|
||||
/* Debug level
|
||||
* We have 8 debug levels, in (numerical) increasing order of verbosity.
|
||||
* IMP: Currently implementing ONLY DBG_LVL_ALL , i.e. , all debug prints will
|
||||
* appear (of course, iff global debug flag is ON and we match the Type and SubType).
|
||||
* Finer granularity debug levels are currently not in use, although the feature exists.
|
||||
*
|
||||
* Another way to say this:
|
||||
* All the debug prints currently have 'debug_level' set to DBG_LVL_ALL .
|
||||
* You can compile-time change that to any of the below, if you wish to. However, as of now, there's
|
||||
* no dynamic facility to have the userspace 'TestApp' set debug_level. Slated for future expansion.
|
||||
*/
|
||||
#define BCM_ALL 7
|
||||
#define BCM_LOW 6
|
||||
#define BCM_PRINT 5
|
||||
#define BCM_NORMAL 4
|
||||
#define BCM_MEDIUM 3
|
||||
#define BCM_SCREAM 2
|
||||
#define BCM_ERR 1
|
||||
/* Not meant for developer in debug prints.
|
||||
* To be used to disable all prints by setting the DBG_LVL_CURR to this value */
|
||||
#define BCM_NONE 0
|
||||
|
||||
/* The current driver logging level.
|
||||
* Everything at this level and (numerically) lower (meaning higher prio)
|
||||
* is logged.
|
||||
* Replace 'BCM_ALL' in the DBG_LVL_CURR macro with the logging level desired.
|
||||
* For eg. to set the logging level to 'errors only' use:
|
||||
* #define DBG_LVL_CURR (BCM_ERR)
|
||||
*/
|
||||
|
||||
#define DBG_LVL_CURR (BCM_ALL)
|
||||
#define DBG_LVL_ALL BCM_ALL
|
||||
|
||||
/*---Userspace mapping of Debug State.
|
||||
* Delibrately matches that of the Windows driver..
|
||||
* The TestApp's ioctl passes this struct to us.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
unsigned int Subtype, Type;
|
||||
unsigned int OnOff;
|
||||
// unsigned int debug_level; /* future expansion */
|
||||
} __attribute__((packed)) USER_BCM_DBG_STATE;
|
||||
|
||||
//---Kernel-space mapping of Debug State
|
||||
typedef struct _S_BCM_DEBUG_STATE {
|
||||
UINT type;
|
||||
/* A bitmap of 32 bits for Subtype per Type.
|
||||
* Valid indexes in 'subtype' array are *only* 1,2,4 and 8,
|
||||
* corresponding to valid Type values. Hence we use the 'Type' field
|
||||
* as the index value, ignoring the array entries 0,3,5,6,7 !
|
||||
*/
|
||||
UINT subtype[(NUMTYPES*2)+1];
|
||||
UINT debug_level;
|
||||
} S_BCM_DEBUG_STATE;
|
||||
/* Instantiated in the Adapter structure */
|
||||
/* We'll reuse the debug level parameter to include a bit (the MSB) to indicate whether or not
|
||||
* we want the function's name printed. */
|
||||
#define DBG_NO_FUNC_PRINT 1 << 31
|
||||
#define DBG_LVL_BITMASK 0xFF
|
||||
|
||||
//--- Only for direct printk's; "hidden" to API.
|
||||
#define DBG_TYPE_PRINTK 3
|
||||
#define PRINTKS_ON 1 // "hidden" from API, set to 0 to turn off all printk's
|
||||
|
||||
#define BCM_DEBUG_PRINT(Adapter, Type, SubType, dbg_level, string, args...) do { \
|
||||
if ((DBG_TYPE_PRINTK == Type) && (PRINTKS_ON)) { \
|
||||
printk ("%s:" string, __FUNCTION__, ##args); \
|
||||
printk("\n"); \
|
||||
} else if (!Adapter) \
|
||||
; \
|
||||
else { \
|
||||
if (((dbg_level & DBG_LVL_BITMASK) <= Adapter->stDebugState.debug_level) && \
|
||||
((Type & Adapter->stDebugState.type) && (SubType & Adapter->stDebugState.subtype[Type]))) { \
|
||||
if (dbg_level & DBG_NO_FUNC_PRINT) \
|
||||
printk (string, ##args); \
|
||||
else \
|
||||
{ \
|
||||
printk ("%s:" string, __FUNCTION__, ##args); \
|
||||
printk("\n"); \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define BCM_DEBUG_PRINT_BUFFER(Adapter, Type, SubType, dbg_level, buffer, bufferlen) do { \
|
||||
if ((DBG_TYPE_PRINTK == Type) && (PRINTKS_ON)) { \
|
||||
bcm_print_buffer( dbg_level, __FUNCTION__, __FILE__, __LINE__, buffer, bufferlen, BCM_BASE_TYPE_HEX); \
|
||||
} else if (!Adapter) \
|
||||
; \
|
||||
else { \
|
||||
if (((dbg_level & DBG_LVL_BITMASK) <= Adapter->stDebugState.debug_level) && \
|
||||
((Type & Adapter->stDebugState.type) && (SubType & Adapter->stDebugState.subtype[Type]))) { \
|
||||
if (dbg_level & DBG_NO_FUNC_PRINT) \
|
||||
bcm_print_buffer( dbg_level, NULL, NULL, __LINE__, buffer, bufferlen, BCM_BASE_TYPE_HEX); \
|
||||
else \
|
||||
bcm_print_buffer( dbg_level, __FUNCTION__, __FILE__, __LINE__, buffer, bufferlen, BCM_BASE_TYPE_HEX); \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define BCM_SHOW_DEBUG_BITMAP(Adapter) do { \
|
||||
int i; \
|
||||
for (i=0; i<(NUMTYPES*2)+1; i++) { \
|
||||
if ((i == 1) || (i == 2) || (i == 4) || (i == 8)) { \
|
||||
/* CAUTION! Forcefully turn on ALL debug paths and subpaths! \
|
||||
Adapter->stDebugState.subtype[i] = 0xffffffff; */ \
|
||||
BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "subtype[%d] = 0x%08x\n", \
|
||||
i, Adapter->stDebugState.subtype[i]); \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,247 @@
|
||||
/**
|
||||
@file HandleControlPacket.c
|
||||
This file contains the routines to deal with
|
||||
sending and receiving of control packets.
|
||||
*/
|
||||
#include "headers.h"
|
||||
|
||||
/**
|
||||
When a control packet is received, analyze the
|
||||
"status" and call appropriate response function.
|
||||
Enqueue the control packet for Application.
|
||||
@return None
|
||||
*/
|
||||
VOID handle_rx_control_packet(PMINI_ADAPTER Adapter, /**<Pointer to the Adapter structure*/
|
||||
struct sk_buff *skb) /**<Pointer to the socket buffer*/
|
||||
{
|
||||
PPER_TARANG_DATA pTarang = NULL;
|
||||
BOOLEAN HighPriorityMessage = FALSE;
|
||||
struct sk_buff * newPacket = NULL;
|
||||
CHAR cntrl_msg_mask_bit = 0;
|
||||
BOOLEAN drop_pkt_flag = TRUE ;
|
||||
USHORT usStatus = *(PUSHORT)(skb->data);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "=====>");
|
||||
/* Get the Leader field */
|
||||
|
||||
switch(usStatus)
|
||||
{
|
||||
case CM_RESPONSES: // 0xA0
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "MAC Version Seems to be Non Multi-Classifier, rejected by Driver");
|
||||
HighPriorityMessage = TRUE ;
|
||||
break;
|
||||
case CM_CONTROL_NEWDSX_MULTICLASSIFIER_RESP:
|
||||
HighPriorityMessage = TRUE ;
|
||||
if(Adapter->LinkStatus==LINKUP_DONE)
|
||||
{
|
||||
CmControlResponseMessage(Adapter,(skb->data +sizeof(USHORT)));
|
||||
}
|
||||
break;
|
||||
case LINK_CONTROL_RESP: //0xA2
|
||||
case STATUS_RSP: //0xA1
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL,"LINK_CONTROL_RESP");
|
||||
HighPriorityMessage = TRUE ;
|
||||
LinkControlResponseMessage(Adapter,(skb->data + sizeof(USHORT)));
|
||||
break;
|
||||
case STATS_POINTER_RESP: //0xA6
|
||||
HighPriorityMessage = TRUE ;
|
||||
StatisticsResponse(Adapter, (skb->data + sizeof(USHORT)));
|
||||
break;
|
||||
case IDLE_MODE_STATUS: //0xA3
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL,"IDLE_MODE_STATUS Type Message Got from F/W");
|
||||
InterfaceIdleModeRespond(Adapter, (PUINT)(skb->data +
|
||||
sizeof(USHORT)));
|
||||
HighPriorityMessage = TRUE ;
|
||||
break;
|
||||
|
||||
case AUTH_SS_HOST_MSG:
|
||||
HighPriorityMessage = TRUE ;
|
||||
break;
|
||||
|
||||
default:
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL,"Got Default Response");
|
||||
/* Let the Application Deal with This Packet */
|
||||
break;
|
||||
}
|
||||
|
||||
//Queue The Control Packet to The Application Queues
|
||||
down(&Adapter->RxAppControlQueuelock);
|
||||
|
||||
for (pTarang = Adapter->pTarangs; pTarang; pTarang = pTarang->next)
|
||||
{
|
||||
if(Adapter->device_removed)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
drop_pkt_flag = TRUE ;
|
||||
/*
|
||||
There are cntrl msg from A0 to AC. It has been mapped to 0 to C bit in the cntrl mask.
|
||||
Also, by default AD to BF has been masked to the rest of the bits... which wil be ON by default.
|
||||
if mask bit is enable to particular pkt status, send it out to app else stop it.
|
||||
*/
|
||||
cntrl_msg_mask_bit = (usStatus & 0x1F);
|
||||
//printk("\ninew msg mask bit which is disable in mask:%X", cntrl_msg_mask_bit);
|
||||
if(pTarang->RxCntrlMsgBitMask & (1<<cntrl_msg_mask_bit))
|
||||
drop_pkt_flag = FALSE;
|
||||
|
||||
if ((drop_pkt_flag == TRUE) || (pTarang->AppCtrlQueueLen > MAX_APP_QUEUE_LEN) ||
|
||||
((pTarang->AppCtrlQueueLen > MAX_APP_QUEUE_LEN/2) && (HighPriorityMessage == FALSE)))
|
||||
{
|
||||
/*
|
||||
Assumption:-
|
||||
1. every tarang manages it own dropped pkt statitistics
|
||||
2. Total packet dropped per tarang will be equal to the sum of all types of dropped
|
||||
pkt by that tarang only.
|
||||
|
||||
*/
|
||||
switch(*(PUSHORT)skb->data)
|
||||
{
|
||||
case CM_RESPONSES:
|
||||
pTarang->stDroppedAppCntrlMsgs.cm_responses++;
|
||||
break;
|
||||
case CM_CONTROL_NEWDSX_MULTICLASSIFIER_RESP:
|
||||
pTarang->stDroppedAppCntrlMsgs.cm_control_newdsx_multiclassifier_resp++;
|
||||
break;
|
||||
case LINK_CONTROL_RESP:
|
||||
pTarang->stDroppedAppCntrlMsgs.link_control_resp++;
|
||||
break;
|
||||
case STATUS_RSP:
|
||||
pTarang->stDroppedAppCntrlMsgs.status_rsp++;
|
||||
break;
|
||||
case STATS_POINTER_RESP:
|
||||
pTarang->stDroppedAppCntrlMsgs.stats_pointer_resp++;
|
||||
break;
|
||||
case IDLE_MODE_STATUS:
|
||||
pTarang->stDroppedAppCntrlMsgs.idle_mode_status++ ;
|
||||
break;
|
||||
case AUTH_SS_HOST_MSG:
|
||||
pTarang->stDroppedAppCntrlMsgs.auth_ss_host_msg++ ;
|
||||
break;
|
||||
default:
|
||||
pTarang->stDroppedAppCntrlMsgs.low_priority_message++ ;
|
||||
break;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
newPacket = skb_clone(skb, GFP_KERNEL);
|
||||
if (!newPacket)
|
||||
break;
|
||||
ENQUEUEPACKET(pTarang->RxAppControlHead,pTarang->RxAppControlTail,
|
||||
newPacket);
|
||||
pTarang->AppCtrlQueueLen++;
|
||||
}
|
||||
up(&Adapter->RxAppControlQueuelock);
|
||||
wake_up(&Adapter->process_read_wait_queue);
|
||||
bcm_kfree_skb(skb);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "After wake_up_interruptible");
|
||||
}
|
||||
|
||||
/**
|
||||
@ingroup ctrl_pkt_functions
|
||||
Thread to handle control pkt reception
|
||||
*/
|
||||
int control_packet_handler (PMINI_ADAPTER Adapter /**< pointer to adapter object*/
|
||||
)
|
||||
{
|
||||
struct sk_buff *ctrl_packet= NULL;
|
||||
unsigned long flags = 0;
|
||||
//struct timeval tv ;
|
||||
//int *puiBuffer = NULL ;
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "Entering to make thread wait on control packet event!");
|
||||
while(1)
|
||||
{
|
||||
wait_event_interruptible(Adapter->process_rx_cntrlpkt,
|
||||
atomic_read(&Adapter->cntrlpktCnt) ||
|
||||
Adapter->bWakeUpDevice ||
|
||||
kthread_should_stop()
|
||||
);
|
||||
|
||||
|
||||
if(kthread_should_stop())
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "Exiting \n");
|
||||
return 0;
|
||||
}
|
||||
if(TRUE == Adapter->bWakeUpDevice)
|
||||
{
|
||||
Adapter->bWakeUpDevice = FALSE;
|
||||
if((FALSE == Adapter->bTriedToWakeUpFromlowPowerMode) &&
|
||||
((TRUE == Adapter->IdleMode)|| (TRUE == Adapter->bShutStatus)))
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "Calling InterfaceAbortIdlemode\n");
|
||||
// Adapter->bTriedToWakeUpFromlowPowerMode = TRUE;
|
||||
InterfaceIdleModeWakeup (Adapter);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
while(atomic_read(&Adapter->cntrlpktCnt))
|
||||
{
|
||||
spin_lock_irqsave(&Adapter->control_queue_lock, flags);
|
||||
ctrl_packet = Adapter->RxControlHead;
|
||||
if(ctrl_packet)
|
||||
{
|
||||
DEQUEUEPACKET(Adapter->RxControlHead,Adapter->RxControlTail);
|
||||
// Adapter->RxControlHead=ctrl_packet->next;
|
||||
((PLINUX_DEP_DATA)Adapter->pvOsDepData)->netstats.rx_packets++;
|
||||
((PLINUX_DEP_DATA)Adapter->pvOsDepData)->netstats.rx_bytes+=
|
||||
((PLEADER)ctrl_packet->data)->PLength;
|
||||
}
|
||||
#if 0 //Idle mode debug profiling...
|
||||
if(*(PUSHORT)ctrl_packet->data == IDLE_MODE_STATUS)
|
||||
{
|
||||
puiBuffer = (PUINT)(ctrl_packet->data +sizeof(USHORT));
|
||||
if((ntohl(*puiBuffer) == GO_TO_IDLE_MODE_PAYLOAD))
|
||||
{
|
||||
memset(&tv, 0, sizeof(tv));
|
||||
do_gettimeofday(&tv);
|
||||
if((ntohl(*(puiBuffer+1)) == 0))
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "IdleMode Wake-up Msg from f/w at time :%ld ms", tv.tv_sec *1000 + tv.tv_usec /1000);
|
||||
}
|
||||
else
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "IdleMode req Msg from f/w at time :%ld ms", tv.tv_sec *1000 + tv.tv_usec /1000);
|
||||
}
|
||||
}
|
||||
else if((ntohl(*puiBuffer) == IDLE_MODE_SF_UPDATE_MSG))
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, CP_CTRL_PKT, DBG_LVL_ALL, "GOT IDLE_MODE_SF_UPDATE MSG at time :%ld ms", tv.tv_sec *1000 + tv.tv_usec /1000);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
spin_unlock_irqrestore (&Adapter->control_queue_lock, flags);
|
||||
handle_rx_control_packet(Adapter, ctrl_packet);
|
||||
atomic_dec(&Adapter->cntrlpktCnt);
|
||||
}
|
||||
|
||||
SetUpTargetDsxBuffers(Adapter);
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
INT flushAllAppQ()
|
||||
{
|
||||
PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
|
||||
PPER_TARANG_DATA pTarang = NULL;
|
||||
struct sk_buff *PacketToDrop = NULL;
|
||||
for(pTarang = Adapter->pTarangs; pTarang; pTarang = pTarang->next)
|
||||
{
|
||||
while(pTarang->RxAppControlHead != NULL)
|
||||
{
|
||||
PacketToDrop=pTarang->RxAppControlHead;
|
||||
DEQUEUEPACKET(pTarang->RxAppControlHead,pTarang->RxAppControlTail);
|
||||
bcm_kfree_skb(PacketToDrop);
|
||||
}
|
||||
pTarang->AppCtrlQueueLen = 0;
|
||||
//dropped contrl packet statistics also should be reset.
|
||||
memset((PVOID)&pTarang->stDroppedAppCntrlMsgs, 0, sizeof(S_MIBS_DROPPED_APP_CNTRL_MESSAGES));
|
||||
|
||||
}
|
||||
return STATUS_SUCCESS ;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,230 @@
|
||||
|
||||
|
||||
#ifndef _HOST_MIBSINTERFACE_H
|
||||
#define _HOST_MIBSINTERFACE_H
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Beceem Communications Pvt. Ltd
|
||||
* File Name: HostMIBSInterface.h
|
||||
* Abstract: This file contains DS used by the Host to update the Host
|
||||
* statistics used for the MIBS.
|
||||
*/
|
||||
|
||||
#define MIBS_MAX_CLASSIFIERS 100
|
||||
#define MIBS_MAX_PHSRULES 100
|
||||
#define MIBS_MAX_SERVICEFLOWS 17
|
||||
#define MIBS_MAX_IP_RANGE_LENGTH 4
|
||||
#define MIBS_MAX_PORT_RANGE 4
|
||||
#define MIBS_MAX_PROTOCOL_LENGTH 32
|
||||
#define MIBS_MAX_PHS_LENGTHS 255
|
||||
#define MIBS_IPV6_ADDRESS_SIZEINBYTES 0x10
|
||||
#define MIBS_IP_LENGTH_OF_ADDRESS 4
|
||||
#define MIBS_MAX_HIST_ENTRIES 12
|
||||
#define MIBS_PKTSIZEHIST_RANGE 128
|
||||
|
||||
typedef union _U_MIBS_IP_ADDRESS
|
||||
{
|
||||
struct
|
||||
{
|
||||
//Source Ip Address Range
|
||||
ULONG ulIpv4Addr[MIBS_MAX_IP_RANGE_LENGTH];
|
||||
//Source Ip Mask Address Range
|
||||
ULONG ulIpv4Mask[MIBS_MAX_IP_RANGE_LENGTH];
|
||||
};
|
||||
struct
|
||||
{
|
||||
//Source Ip Address Range
|
||||
ULONG ulIpv6Addr[MIBS_MAX_IP_RANGE_LENGTH * 4];
|
||||
//Source Ip Mask Address Range
|
||||
ULONG ulIpv6Mask[MIBS_MAX_IP_RANGE_LENGTH * 4];
|
||||
|
||||
};
|
||||
struct
|
||||
{
|
||||
UCHAR ucIpv4Address[MIBS_MAX_IP_RANGE_LENGTH *
|
||||
MIBS_IP_LENGTH_OF_ADDRESS];
|
||||
UCHAR ucIpv4Mask[MIBS_MAX_IP_RANGE_LENGTH *
|
||||
MIBS_IP_LENGTH_OF_ADDRESS];
|
||||
};
|
||||
struct
|
||||
{
|
||||
UCHAR ucIpv6Address[MIBS_MAX_IP_RANGE_LENGTH * MIBS_IPV6_ADDRESS_SIZEINBYTES];
|
||||
UCHAR ucIpv6Mask[MIBS_MAX_IP_RANGE_LENGTH * MIBS_IPV6_ADDRESS_SIZEINBYTES];
|
||||
};
|
||||
}U_MIBS_IP_ADDRESS;
|
||||
|
||||
|
||||
typedef struct _S_MIBS_HOST_INFO
|
||||
{
|
||||
ULONG64 GoodTransmits;
|
||||
ULONG64 GoodReceives;
|
||||
// this to keep track of the Tx and Rx MailBox Registers.
|
||||
ULONG NumDesUsed;
|
||||
ULONG CurrNumFreeDesc;
|
||||
ULONG PrevNumFreeDesc;
|
||||
// to keep track the no of byte recieved
|
||||
ULONG PrevNumRcevBytes;
|
||||
ULONG CurrNumRcevBytes;
|
||||
|
||||
/* QOS Related */
|
||||
ULONG BEBucketSize;
|
||||
ULONG rtPSBucketSize;
|
||||
ULONG LastTxQueueIndex;
|
||||
BOOLEAN TxOutofDescriptors;
|
||||
BOOLEAN TimerActive;
|
||||
UINT32 u32TotalDSD;
|
||||
UINT32 aTxPktSizeHist[MIBS_MAX_HIST_ENTRIES];
|
||||
UINT32 aRxPktSizeHist[MIBS_MAX_HIST_ENTRIES];
|
||||
}S_MIBS_HOST_INFO;
|
||||
|
||||
typedef struct _S_MIBS_CLASSIFIER_RULE
|
||||
{
|
||||
ULONG ulSFID;
|
||||
UCHAR ucReserved[2];
|
||||
B_UINT16 uiClassifierRuleIndex;
|
||||
BOOLEAN bUsed;
|
||||
USHORT usVCID_Value;
|
||||
// This field detemines the Classifier Priority
|
||||
B_UINT8 u8ClassifierRulePriority;
|
||||
U_MIBS_IP_ADDRESS stSrcIpAddress;
|
||||
/*IP Source Address Length*/
|
||||
UCHAR ucIPSourceAddressLength;
|
||||
|
||||
U_MIBS_IP_ADDRESS stDestIpAddress;
|
||||
/* IP Destination Address Length */
|
||||
UCHAR ucIPDestinationAddressLength;
|
||||
UCHAR ucIPTypeOfServiceLength;//Type of service Length
|
||||
UCHAR ucTosLow;//Tos Low
|
||||
UCHAR ucTosHigh;//Tos High
|
||||
UCHAR ucTosMask;//Tos Mask
|
||||
UCHAR ucProtocolLength;//protocol Length
|
||||
UCHAR ucProtocol[MIBS_MAX_PROTOCOL_LENGTH];//protocol Length
|
||||
USHORT usSrcPortRangeLo[MIBS_MAX_PORT_RANGE];
|
||||
USHORT usSrcPortRangeHi[MIBS_MAX_PORT_RANGE];
|
||||
UCHAR ucSrcPortRangeLength;
|
||||
USHORT usDestPortRangeLo[MIBS_MAX_PORT_RANGE];
|
||||
USHORT usDestPortRangeHi[MIBS_MAX_PORT_RANGE];
|
||||
UCHAR ucDestPortRangeLength;
|
||||
BOOLEAN bProtocolValid;
|
||||
BOOLEAN bTOSValid;
|
||||
BOOLEAN bDestIpValid;
|
||||
BOOLEAN bSrcIpValid;
|
||||
UCHAR ucDirection;
|
||||
BOOLEAN bIpv6Protocol;
|
||||
UINT32 u32PHSRuleID;
|
||||
}S_MIBS_CLASSIFIER_RULE;
|
||||
|
||||
|
||||
typedef struct _S_MIBS_PHS_RULE
|
||||
{
|
||||
ULONG ulSFID;
|
||||
/// brief 8bit PHSI Of The Service Flow
|
||||
B_UINT8 u8PHSI;
|
||||
/// brief PHSF Of The Service Flow
|
||||
B_UINT8 u8PHSFLength;
|
||||
B_UINT8 u8PHSF[MIBS_MAX_PHS_LENGTHS];
|
||||
/// brief PHSM Of The Service Flow
|
||||
B_UINT8 u8PHSMLength;
|
||||
B_UINT8 u8PHSM[MIBS_MAX_PHS_LENGTHS];
|
||||
/// brief 8bit PHSS Of The Service Flow
|
||||
B_UINT8 u8PHSS;
|
||||
/// brief 8bit PHSV Of The Service Flow
|
||||
B_UINT8 u8PHSV;
|
||||
// Reserved bytes are 5, so that it is similar to S_PHS_RULE structure.
|
||||
B_UINT8 reserved[5];
|
||||
|
||||
LONG PHSModifiedBytes;
|
||||
ULONG PHSModifiedNumPackets;
|
||||
ULONG PHSErrorNumPackets;
|
||||
}S_MIBS_PHS_RULE;
|
||||
|
||||
typedef struct _S_MIBS_EXTSERVICEFLOW_PARAMETERS
|
||||
{
|
||||
UINT32 wmanIfSfid;
|
||||
UINT32 wmanIfCmnCpsSfState;
|
||||
UINT32 wmanIfCmnCpsMaxSustainedRate;
|
||||
UINT32 wmanIfCmnCpsMaxTrafficBurst;
|
||||
UINT32 wmanIfCmnCpsMinReservedRate;
|
||||
UINT32 wmanIfCmnCpsToleratedJitter;
|
||||
UINT32 wmanIfCmnCpsMaxLatency;
|
||||
UINT32 wmanIfCmnCpsFixedVsVariableSduInd;
|
||||
UINT32 wmanIfCmnCpsSduSize;
|
||||
UINT32 wmanIfCmnCpsSfSchedulingType;
|
||||
UINT32 wmanIfCmnCpsArqEnable;
|
||||
UINT32 wmanIfCmnCpsArqWindowSize;
|
||||
UINT32 wmanIfCmnCpsArqBlockLifetime;
|
||||
UINT32 wmanIfCmnCpsArqSyncLossTimeout;
|
||||
UINT32 wmanIfCmnCpsArqDeliverInOrder;
|
||||
UINT32 wmanIfCmnCpsArqRxPurgeTimeout;
|
||||
UINT32 wmanIfCmnCpsArqBlockSize;
|
||||
UINT32 wmanIfCmnCpsMinRsvdTolerableRate;
|
||||
UINT32 wmanIfCmnCpsReqTxPolicy;
|
||||
UINT32 wmanIfCmnSfCsSpecification;
|
||||
UINT32 wmanIfCmnCpsTargetSaid;
|
||||
|
||||
}S_MIBS_EXTSERVICEFLOW_PARAMETERS;
|
||||
|
||||
|
||||
typedef struct _S_MIBS_SERVICEFLOW_TABLE
|
||||
{
|
||||
//classification extension Rule
|
||||
ULONG ulSFID;
|
||||
USHORT usVCID_Value;
|
||||
UINT uiThreshold;
|
||||
// This field determines the priority of the SF Queues
|
||||
B_UINT8 u8TrafficPriority;
|
||||
|
||||
BOOLEAN bValid;
|
||||
BOOLEAN bActive;
|
||||
BOOLEAN bActivateRequestSent;
|
||||
//BE or rtPS
|
||||
B_UINT8 u8QueueType;
|
||||
//maximum size of the bucket for the queue
|
||||
UINT uiMaxBucketSize;
|
||||
UINT uiCurrentQueueDepthOnTarget;
|
||||
UINT uiCurrentBytesOnHost;
|
||||
UINT uiCurrentPacketsOnHost;
|
||||
UINT uiDroppedCountBytes;
|
||||
UINT uiDroppedCountPackets;
|
||||
UINT uiSentBytes;
|
||||
UINT uiSentPackets;
|
||||
UINT uiCurrentDrainRate;
|
||||
UINT uiThisPeriodSentBytes;
|
||||
LARGE_INTEGER liDrainCalculated;
|
||||
UINT uiCurrentTokenCount;
|
||||
LARGE_INTEGER liLastUpdateTokenAt;
|
||||
UINT uiMaxAllowedRate;
|
||||
UINT NumOfPacketsSent;
|
||||
UCHAR ucDirection;
|
||||
USHORT usCID;
|
||||
S_MIBS_EXTSERVICEFLOW_PARAMETERS stMibsExtServiceFlowTable;
|
||||
UINT uiCurrentRxRate;
|
||||
UINT uiThisPeriodRxBytes;
|
||||
UINT uiTotalRxBytes;
|
||||
UINT uiTotalTxBytes;
|
||||
}S_MIBS_SERVICEFLOW_TABLE;
|
||||
|
||||
typedef struct _S_MIBS_DROPPED_APP_CNTRL_MESSAGES
|
||||
{
|
||||
ULONG cm_responses;
|
||||
ULONG cm_control_newdsx_multiclassifier_resp;
|
||||
ULONG link_control_resp;
|
||||
ULONG status_rsp;
|
||||
ULONG stats_pointer_resp;
|
||||
ULONG idle_mode_status;
|
||||
ULONG auth_ss_host_msg;
|
||||
ULONG low_priority_message;
|
||||
|
||||
}S_MIBS_DROPPED_APP_CNTRL_MESSAGES;
|
||||
|
||||
typedef struct _S_MIBS_HOST_STATS_MIBS
|
||||
{
|
||||
S_MIBS_HOST_INFO stHostInfo;
|
||||
S_MIBS_CLASSIFIER_RULE astClassifierTable[MIBS_MAX_CLASSIFIERS];
|
||||
S_MIBS_SERVICEFLOW_TABLE astSFtable[MIBS_MAX_SERVICEFLOWS];
|
||||
S_MIBS_PHS_RULE astPhsRulesTable[MIBS_MAX_PHSRULES];
|
||||
S_MIBS_DROPPED_APP_CNTRL_MESSAGES stDroppedAppCntrlMsgs;
|
||||
}S_MIBS_HOST_STATS_MIBS;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
#ifndef _HOST_MIBS_H
|
||||
#define _HOST_MIBS_H
|
||||
|
||||
INT ProcessGetHostMibs(PMINI_ADAPTER Adapter,
|
||||
PVOID ioBuffer,
|
||||
ULONG inputBufferLength);
|
||||
#endif
|
||||
@@ -0,0 +1,400 @@
|
||||
#include "headers.h"
|
||||
|
||||
UCHAR * GetNextIPV6ChainedHeader(UCHAR **ppucPayload,UCHAR *pucNextHeader,BOOLEAN *bParseDone,USHORT *pusPayloadLength)
|
||||
{
|
||||
UCHAR *pucRetHeaderPtr = NULL;
|
||||
UCHAR *pucPayloadPtr = NULL;
|
||||
USHORT usNextHeaderOffset = 0 ;
|
||||
PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
|
||||
|
||||
if((NULL == ppucPayload) || (*pusPayloadLength == 0) || (*bParseDone))
|
||||
{
|
||||
*bParseDone = TRUE;
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
pucRetHeaderPtr = *ppucPayload;
|
||||
pucPayloadPtr = *ppucPayload;
|
||||
|
||||
if(!pucRetHeaderPtr || !pucPayloadPtr)
|
||||
{
|
||||
*bParseDone = TRUE;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//Get the Nextt Header Type
|
||||
*bParseDone = FALSE;
|
||||
|
||||
|
||||
|
||||
switch(*pucNextHeader)
|
||||
{
|
||||
case IPV6HDR_TYPE_HOPBYHOP:
|
||||
{
|
||||
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 HopByHop Header");
|
||||
usNextHeaderOffset+=sizeof(IPV6HopByHopOptionsHeader);
|
||||
}
|
||||
break;
|
||||
|
||||
case IPV6HDR_TYPE_ROUTING:
|
||||
{
|
||||
IPV6RoutingHeader *pstIpv6RoutingHeader;
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Routing Header");
|
||||
pstIpv6RoutingHeader = (IPV6RoutingHeader *)pucPayloadPtr;
|
||||
usNextHeaderOffset += sizeof(IPV6RoutingHeader);
|
||||
usNextHeaderOffset += pstIpv6RoutingHeader->ucNumAddresses * IPV6_ADDRESS_SIZEINBYTES;
|
||||
|
||||
}
|
||||
break;
|
||||
case IPV6HDR_TYPE_FRAGMENTATION:
|
||||
{
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Fragmentation Header");
|
||||
usNextHeaderOffset+= sizeof(IPV6FragmentHeader);
|
||||
|
||||
}
|
||||
break;
|
||||
case IPV6HDR_TYPE_DESTOPTS:
|
||||
{
|
||||
IPV6DestOptionsHeader *pstIpv6DestOptsHdr = (IPV6DestOptionsHeader *)pucPayloadPtr;
|
||||
int nTotalOptions = pstIpv6DestOptsHdr->ucHdrExtLen;
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 DestOpts Header Header");
|
||||
usNextHeaderOffset+= sizeof(IPV6DestOptionsHeader);
|
||||
usNextHeaderOffset+= nTotalOptions * IPV6_DESTOPTS_HDR_OPTIONSIZE ;
|
||||
|
||||
}
|
||||
break;
|
||||
case IPV6HDR_TYPE_AUTHENTICATION:
|
||||
{
|
||||
IPV6AuthenticationHeader *pstIpv6AuthHdr = (IPV6AuthenticationHeader *)pucPayloadPtr;
|
||||
int nHdrLen = pstIpv6AuthHdr->ucLength;
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Authentication Header");
|
||||
usNextHeaderOffset+= nHdrLen * 4;
|
||||
}
|
||||
break;
|
||||
case IPV6HDR_TYPE_ENCRYPTEDSECURITYPAYLOAD:
|
||||
{
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Encrypted Security Payload Header");
|
||||
*bParseDone = TRUE;
|
||||
|
||||
}
|
||||
break;
|
||||
case IPV6_ICMP_HDR_TYPE:
|
||||
{
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, " ICMP Header");
|
||||
*bParseDone = TRUE;
|
||||
}
|
||||
break;
|
||||
case TCP_HEADER_TYPE:
|
||||
{
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, " \nTCP Header");
|
||||
*bParseDone = TRUE;
|
||||
}
|
||||
break;
|
||||
case UDP_HEADER_TYPE:
|
||||
{
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, " \nUDP Header");
|
||||
*bParseDone = TRUE;
|
||||
}
|
||||
break;
|
||||
default :
|
||||
{
|
||||
*bParseDone = TRUE;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
|
||||
if(*bParseDone == FALSE)
|
||||
{
|
||||
if(*pusPayloadLength <= usNextHeaderOffset)
|
||||
{
|
||||
*bParseDone = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
*pucNextHeader = *pucPayloadPtr;
|
||||
pucPayloadPtr+=usNextHeaderOffset;
|
||||
(*pusPayloadLength)-=usNextHeaderOffset;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
*ppucPayload = pucPayloadPtr;
|
||||
return pucRetHeaderPtr;
|
||||
}
|
||||
|
||||
|
||||
UCHAR GetIpv6ProtocolPorts(UCHAR *pucPayload,USHORT *pusSrcPort,USHORT *pusDestPort,USHORT usPayloadLength,UCHAR ucNextHeader)
|
||||
{
|
||||
UCHAR *pIpv6HdrScanContext = pucPayload;
|
||||
BOOLEAN bDone = FALSE;
|
||||
UCHAR ucHeaderType =0;
|
||||
UCHAR *pucNextHeader = NULL;
|
||||
PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
|
||||
|
||||
if( !pucPayload || (usPayloadLength == 0))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
*pusSrcPort = *pusDestPort = 0;
|
||||
ucHeaderType = ucNextHeader;
|
||||
while(!bDone)
|
||||
{
|
||||
pucNextHeader = GetNextIPV6ChainedHeader(&pIpv6HdrScanContext,&ucHeaderType,&bDone,&usPayloadLength);
|
||||
if(bDone)
|
||||
{
|
||||
if((ucHeaderType==TCP_HEADER_TYPE) || (ucHeaderType == UDP_HEADER_TYPE))
|
||||
{
|
||||
*pusSrcPort=*((PUSHORT)(pucNextHeader));
|
||||
*pusDestPort=*((PUSHORT)(pucNextHeader+2));
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, " \nProtocol Ports - Src Port :0x%x Dest Port : 0x%x",ntohs(*pusSrcPort),ntohs(*pusDestPort));
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
return ucHeaderType;
|
||||
}
|
||||
|
||||
|
||||
|
||||
USHORT IpVersion6(PMINI_ADAPTER Adapter, /**< Pointer to the driver control structure */
|
||||
PVOID pcIpHeader, /**<Pointer to the IP Hdr of the packet*/
|
||||
S_CLASSIFIER_RULE *pstClassifierRule )
|
||||
{
|
||||
USHORT ushDestPort = 0;
|
||||
USHORT ushSrcPort = 0;
|
||||
UCHAR ucNextProtocolAboveIP =0;
|
||||
IPV6Header *pstIpv6Header = NULL;
|
||||
BOOLEAN bClassificationSucceed = FALSE;
|
||||
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "IpVersion6 ==========>\n");
|
||||
|
||||
pstIpv6Header = (IPV6Header *)pcIpHeader;
|
||||
|
||||
DumpIpv6Header(pstIpv6Header);
|
||||
|
||||
//Try to get the next higher layer protocol and the Ports Nos if TCP or UDP
|
||||
ucNextProtocolAboveIP = GetIpv6ProtocolPorts((UCHAR *)(pcIpHeader + sizeof(IPV6Header)),
|
||||
&ushSrcPort,
|
||||
&ushDestPort,
|
||||
pstIpv6Header->usPayloadLength,
|
||||
pstIpv6Header->ucNextHeader);
|
||||
|
||||
do
|
||||
{
|
||||
if(0 == pstClassifierRule->ucDirection)
|
||||
{
|
||||
//cannot be processed for classification.
|
||||
// it is a down link connection
|
||||
break;
|
||||
}
|
||||
|
||||
if(!pstClassifierRule->bIpv6Protocol)
|
||||
{
|
||||
//We are looking for Ipv6 Classifiers . Lets ignore this classifier and try the next one.
|
||||
break;
|
||||
}
|
||||
|
||||
bClassificationSucceed=MatchSrcIpv6Address(pstClassifierRule,pstIpv6Header);
|
||||
if(!bClassificationSucceed)
|
||||
break;
|
||||
|
||||
bClassificationSucceed=MatchDestIpv6Address(pstClassifierRule,pstIpv6Header);
|
||||
if(!bClassificationSucceed)
|
||||
break;
|
||||
|
||||
//Match the protocol type.For IPv6 the next protocol at end of Chain of IPv6 prot headers
|
||||
bClassificationSucceed=MatchProtocol(pstClassifierRule,ucNextProtocolAboveIP);
|
||||
if(!bClassificationSucceed)
|
||||
break;
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Protocol Matched");
|
||||
|
||||
if((ucNextProtocolAboveIP == TCP_HEADER_TYPE) || (ucNextProtocolAboveIP == UDP_HEADER_TYPE))
|
||||
{
|
||||
//Match Src Port
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Source Port:%x\n",ntohs(ushSrcPort));
|
||||
bClassificationSucceed=MatchSrcPort(pstClassifierRule,ntohs(ushSrcPort));
|
||||
if(!bClassificationSucceed)
|
||||
break;
|
||||
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Src Port Matched");
|
||||
|
||||
//Match Dest Port
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Destination Port:%x\n",ntohs(ushDestPort));
|
||||
bClassificationSucceed=MatchDestPort(pstClassifierRule,ntohs(ushDestPort));
|
||||
if(!bClassificationSucceed)
|
||||
break;
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\nIPv6 Dest Port Matched");
|
||||
}
|
||||
}while(0);
|
||||
|
||||
if(TRUE==bClassificationSucceed)
|
||||
{
|
||||
INT iMatchedSFQueueIndex = 0;
|
||||
iMatchedSFQueueIndex = SearchSfid(Adapter,pstClassifierRule->ulSFID);
|
||||
if(iMatchedSFQueueIndex >= NO_OF_QUEUES)
|
||||
{
|
||||
bClassificationSucceed = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(FALSE == Adapter->PackInfo[iMatchedSFQueueIndex].bActive)
|
||||
{
|
||||
bClassificationSucceed = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return bClassificationSucceed;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN MatchSrcIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule,IPV6Header *pstIpv6Header)
|
||||
{
|
||||
UINT uiLoopIndex=0;
|
||||
UINT uiIpv6AddIndex=0;
|
||||
UINT uiIpv6AddrNoLongWords = 4;
|
||||
ULONG aulSrcIP[4];
|
||||
PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
|
||||
/*
|
||||
//This is the no. of Src Addresses ie Range of IP Addresses contained
|
||||
//in the classifier rule for which we need to match
|
||||
*/
|
||||
UINT uiCountIPSrcAddresses = (UINT)pstClassifierRule->ucIPSourceAddressLength;
|
||||
|
||||
|
||||
if(0 == uiCountIPSrcAddresses)
|
||||
return TRUE;
|
||||
|
||||
|
||||
//First Convert the Ip Address in the packet to Host Endian order
|
||||
for(uiIpv6AddIndex=0;uiIpv6AddIndex<uiIpv6AddrNoLongWords;uiIpv6AddIndex++)
|
||||
{
|
||||
aulSrcIP[uiIpv6AddIndex]=ntohl(pstIpv6Header->ulSrcIpAddress[uiIpv6AddIndex]);
|
||||
}
|
||||
|
||||
for(uiLoopIndex=0;uiLoopIndex<uiCountIPSrcAddresses;uiLoopIndex+=uiIpv6AddrNoLongWords)
|
||||
{
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Src Ipv6 Address In Recieved Packet : \n ");
|
||||
DumpIpv6Address(aulSrcIP);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Src Ipv6 Mask In Classifier Rule: \n");
|
||||
DumpIpv6Address(&pstClassifierRule->stSrcIpAddress.ulIpv6Mask[uiLoopIndex]);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Src Ipv6 Address In Classifier Rule : \n");
|
||||
DumpIpv6Address(&pstClassifierRule->stSrcIpAddress.ulIpv6Addr[uiLoopIndex]);
|
||||
|
||||
for(uiIpv6AddIndex=0;uiIpv6AddIndex<uiIpv6AddrNoLongWords;uiIpv6AddIndex++)
|
||||
{
|
||||
if((pstClassifierRule->stSrcIpAddress.ulIpv6Mask[uiLoopIndex+uiIpv6AddIndex] & aulSrcIP[uiIpv6AddIndex])
|
||||
!= pstClassifierRule->stSrcIpAddress.ulIpv6Addr[uiLoopIndex+uiIpv6AddIndex])
|
||||
{
|
||||
//Match failed for current Ipv6 Address.Try next Ipv6 Address
|
||||
break;
|
||||
}
|
||||
|
||||
if(uiIpv6AddIndex == uiIpv6AddrNoLongWords-1)
|
||||
{
|
||||
//Match Found
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Ipv6 Src Ip Address Matched\n");
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOLEAN MatchDestIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule,IPV6Header *pstIpv6Header)
|
||||
{
|
||||
UINT uiLoopIndex=0;
|
||||
UINT uiIpv6AddIndex=0;
|
||||
UINT uiIpv6AddrNoLongWords = 4;
|
||||
ULONG aulDestIP[4];
|
||||
PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
|
||||
/*
|
||||
//This is the no. of Destination Addresses ie Range of IP Addresses contained
|
||||
//in the classifier rule for which we need to match
|
||||
*/
|
||||
UINT uiCountIPDestinationAddresses = (UINT)pstClassifierRule->ucIPDestinationAddressLength;
|
||||
|
||||
|
||||
if(0 == uiCountIPDestinationAddresses)
|
||||
return TRUE;
|
||||
|
||||
|
||||
//First Convert the Ip Address in the packet to Host Endian order
|
||||
for(uiIpv6AddIndex=0;uiIpv6AddIndex<uiIpv6AddrNoLongWords;uiIpv6AddIndex++)
|
||||
{
|
||||
aulDestIP[uiIpv6AddIndex]=ntohl(pstIpv6Header->ulDestIpAddress[uiIpv6AddIndex]);
|
||||
}
|
||||
|
||||
for(uiLoopIndex=0;uiLoopIndex<uiCountIPDestinationAddresses;uiLoopIndex+=uiIpv6AddrNoLongWords)
|
||||
{
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Destination Ipv6 Address In Recieved Packet : \n ");
|
||||
DumpIpv6Address(aulDestIP);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Destination Ipv6 Mask In Classifier Rule: \n");
|
||||
DumpIpv6Address(&pstClassifierRule->stDestIpAddress.ulIpv6Mask[uiLoopIndex]);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "\n Destination Ipv6 Address In Classifier Rule : \n");
|
||||
DumpIpv6Address(&pstClassifierRule->stDestIpAddress.ulIpv6Addr[uiLoopIndex]);
|
||||
|
||||
for(uiIpv6AddIndex=0;uiIpv6AddIndex<uiIpv6AddrNoLongWords;uiIpv6AddIndex++)
|
||||
{
|
||||
if((pstClassifierRule->stDestIpAddress.ulIpv6Mask[uiLoopIndex+uiIpv6AddIndex] & aulDestIP[uiIpv6AddIndex])
|
||||
!= pstClassifierRule->stDestIpAddress.ulIpv6Addr[uiLoopIndex+uiIpv6AddIndex])
|
||||
{
|
||||
//Match failed for current Ipv6 Address.Try next Ipv6 Address
|
||||
break;
|
||||
}
|
||||
|
||||
if(uiIpv6AddIndex == uiIpv6AddrNoLongWords-1)
|
||||
{
|
||||
//Match Found
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Ipv6 Destination Ip Address Matched\n");
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
VOID DumpIpv6Address(ULONG *puIpv6Address)
|
||||
{
|
||||
UINT uiIpv6AddrNoLongWords = 4;
|
||||
UINT uiIpv6AddIndex=0;
|
||||
PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
|
||||
for(uiIpv6AddIndex=0;uiIpv6AddIndex<uiIpv6AddrNoLongWords;uiIpv6AddIndex++)
|
||||
{
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, ":%lx",puIpv6Address[uiIpv6AddIndex]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
VOID DumpIpv6Header(IPV6Header *pstIpv6Header)
|
||||
{
|
||||
UCHAR ucVersion;
|
||||
UCHAR ucPrio ;
|
||||
PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "----Ipv6 Header---");
|
||||
ucVersion = pstIpv6Header->ucVersionPrio & 0xf0;
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Version : %x \n",ucVersion);
|
||||
ucPrio = pstIpv6Header->ucVersionPrio & 0x0f;
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Priority : %x \n",ucPrio);
|
||||
//BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Flow Label : %x \n",(pstIpv6Header->ucVersionPrio &0xf0);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Payload Length : %x \n",ntohs(pstIpv6Header->usPayloadLength));
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Next Header : %x \n",pstIpv6Header->ucNextHeader);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Hop Limit : %x \n",pstIpv6Header->ucHopLimit);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Src Address :\n");
|
||||
DumpIpv6Address(pstIpv6Header->ulSrcIpAddress);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "Dest Address :\n");
|
||||
DumpIpv6Address(pstIpv6Header->ulDestIpAddress);
|
||||
BCM_DEBUG_PRINT( Adapter,DBG_TYPE_TX, IPV6_DBG, DBG_LVL_ALL, "----Ipv6 Header End---");
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
#ifndef _IPV6_PROTOCOL_DEFINES_
|
||||
#define _IPV6_PROTOCOL_DEFINES_
|
||||
|
||||
|
||||
#define IPV6HDR_TYPE_HOPBYHOP 0x0
|
||||
#define IPV6HDR_TYPE_ROUTING 0x2B
|
||||
#define IPV6HDR_TYPE_FRAGMENTATION 0x2C
|
||||
#define IPV6HDR_TYPE_DESTOPTS 0x3c
|
||||
#define IPV6HDR_TYPE_AUTHENTICATION 0x33
|
||||
#define IPV6HDR_TYPE_ENCRYPTEDSECURITYPAYLOAD 0x34
|
||||
#define MASK_IPV6_CS_SPEC 0x2
|
||||
|
||||
|
||||
#define TCP_HEADER_TYPE 0x6
|
||||
#define UDP_HEADER_TYPE 0x11
|
||||
#define IPV6_ICMP_HDR_TYPE 0x2
|
||||
#define IPV6_FLOWLABEL_BITOFFSET 9
|
||||
|
||||
#define IPV6_MAX_CHAINEDHDR_BUFFBYTES 0x64
|
||||
/*
|
||||
// Size of Dest Options field of Destinations Options Header
|
||||
// in bytes.
|
||||
*/
|
||||
#define IPV6_DESTOPTS_HDR_OPTIONSIZE 0x8
|
||||
|
||||
//typedef unsigned char UCHAR;
|
||||
//typedef unsigned short USHORT;
|
||||
//typedef unsigned long int ULONG;
|
||||
|
||||
typedef struct IPV6HeaderFormatTag
|
||||
{
|
||||
UCHAR ucVersionPrio;
|
||||
UCHAR aucFlowLabel[3];
|
||||
USHORT usPayloadLength;
|
||||
UCHAR ucNextHeader;
|
||||
UCHAR ucHopLimit;
|
||||
ULONG ulSrcIpAddress[4];
|
||||
ULONG ulDestIpAddress[4];
|
||||
}IPV6Header;
|
||||
|
||||
typedef struct IPV6RoutingHeaderFormatTag
|
||||
{
|
||||
UCHAR ucNextHeader;
|
||||
UCHAR ucRoutingType;
|
||||
UCHAR ucNumAddresses;
|
||||
UCHAR ucNextAddress;
|
||||
ULONG ulReserved;
|
||||
//UCHAR aucAddressList[0];
|
||||
|
||||
}IPV6RoutingHeader;
|
||||
|
||||
typedef struct IPV6FragmentHeaderFormatTag
|
||||
{
|
||||
UCHAR ucNextHeader;
|
||||
UCHAR ucReserved;
|
||||
USHORT usFragmentOffset;
|
||||
ULONG ulIdentification;
|
||||
}IPV6FragmentHeader;
|
||||
|
||||
typedef struct IPV6DestOptionsHeaderFormatTag
|
||||
{
|
||||
UCHAR ucNextHeader;
|
||||
UCHAR ucHdrExtLen;
|
||||
UCHAR ucDestOptions[6];
|
||||
//UCHAR udExtDestOptions[0];
|
||||
}IPV6DestOptionsHeader;
|
||||
|
||||
typedef struct IPV6HopByHopOptionsHeaderFormatTag
|
||||
{
|
||||
UCHAR ucNextHeader;
|
||||
UCHAR ucMisc[3];
|
||||
ULONG ulJumboPayloadLen;
|
||||
}IPV6HopByHopOptionsHeader;
|
||||
|
||||
typedef struct IPV6AuthenticationHeaderFormatTag
|
||||
{
|
||||
UCHAR ucNextHeader;
|
||||
UCHAR ucLength;
|
||||
USHORT usReserved;
|
||||
ULONG ulSecurityParametersIndex;
|
||||
//UCHAR ucAuthenticationData[0];
|
||||
|
||||
}IPV6AuthenticationHeader;
|
||||
|
||||
typedef struct IPV6IcmpHeaderFormatTag
|
||||
{
|
||||
UCHAR ucType;
|
||||
UCHAR ucCode;
|
||||
USHORT usChecksum;
|
||||
//UCHAR ucIcmpMsg[0];
|
||||
|
||||
}IPV6IcmpHeader;
|
||||
|
||||
typedef enum _E_IPADDR_CONTEXT
|
||||
{
|
||||
eSrcIpAddress,
|
||||
eDestIpAddress
|
||||
|
||||
}E_IPADDR_CONTEXT;
|
||||
|
||||
|
||||
|
||||
//Function Prototypes
|
||||
BOOLEAN MatchSrcIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule,IPV6Header *pstIpv6Header);
|
||||
BOOLEAN MatchDestIpv6Address(S_CLASSIFIER_RULE *pstClassifierRule,IPV6Header *pstIpv6Header);
|
||||
|
||||
USHORT IpVersion6(PMINI_ADAPTER Adapter, /**< Pointer to the driver control structure */
|
||||
PVOID pcIpHeader, /**<Pointer to the IP Hdr of the packet*/
|
||||
S_CLASSIFIER_RULE *pstClassifierRule );
|
||||
|
||||
VOID DumpIpv6Address(ULONG *puIpv6Address);
|
||||
VOID DumpIpv6Header(IPV6Header *pstIpv6Header);
|
||||
|
||||
extern BOOLEAN MatchSrcPort(S_CLASSIFIER_RULE *pstClassifierRule,USHORT ushSrcPort);
|
||||
extern BOOLEAN MatchDestPort(S_CLASSIFIER_RULE *pstClassifierRule,USHORT ushSrcPort);
|
||||
extern BOOLEAN MatchProtocol(S_CLASSIFIER_RULE *pstClassifierRule,UCHAR ucProtocol);
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,97 @@
|
||||
#ifndef _INTERFACE_ADAPTER_H
|
||||
#define _INTERFACE_ADAPTER_H
|
||||
|
||||
typedef struct _BULK_ENDP_IN
|
||||
{
|
||||
PCHAR bulk_in_buffer;
|
||||
size_t bulk_in_size;
|
||||
UCHAR bulk_in_endpointAddr;
|
||||
UINT bulk_in_pipe;
|
||||
}BULK_ENDP_IN, *PBULK_ENDP_IN;
|
||||
|
||||
|
||||
typedef struct _BULK_ENDP_OUT
|
||||
{
|
||||
UCHAR bulk_out_buffer;
|
||||
size_t bulk_out_size;
|
||||
UCHAR bulk_out_endpointAddr;
|
||||
UINT bulk_out_pipe;
|
||||
//this is used when int out endpoint is used as bulk out end point
|
||||
UCHAR int_out_interval;
|
||||
}BULK_ENDP_OUT, *PBULK_ENDP_OUT;
|
||||
|
||||
typedef struct _INTR_ENDP_IN
|
||||
{
|
||||
PCHAR int_in_buffer;
|
||||
size_t int_in_size;
|
||||
UCHAR int_in_endpointAddr;
|
||||
UCHAR int_in_interval;
|
||||
UINT int_in_pipe;
|
||||
}INTR_ENDP_IN, *PINTR_ENDP_IN;
|
||||
|
||||
typedef struct _INTR_ENDP_OUT
|
||||
{
|
||||
PCHAR int_out_buffer;
|
||||
size_t int_out_size;
|
||||
UCHAR int_out_endpointAddr;
|
||||
UCHAR int_out_interval;
|
||||
UINT int_out_pipe;
|
||||
}INTR_ENDP_OUT, *PINTR_ENDP_OUT;
|
||||
|
||||
|
||||
typedef struct _USB_TCB
|
||||
{
|
||||
struct urb *urb;
|
||||
PVOID psIntfAdapter;
|
||||
BOOLEAN bUsed;
|
||||
}USB_TCB, *PUSB_TCB;
|
||||
|
||||
|
||||
typedef struct _USB_RCB
|
||||
{
|
||||
struct urb *urb;
|
||||
PVOID psIntfAdapter;
|
||||
BOOLEAN bUsed;
|
||||
}USB_RCB, *PUSB_RCB;
|
||||
|
||||
/*
|
||||
//This is the interface specific Sub-Adapter
|
||||
//Structure.
|
||||
*/
|
||||
typedef struct _S_INTERFACE_ADAPTER
|
||||
{
|
||||
struct usb_device * udev;
|
||||
struct usb_interface * interface;
|
||||
|
||||
/* Bulk endpoint in info */
|
||||
BULK_ENDP_IN sBulkIn;
|
||||
/* Bulk endpoint out info */
|
||||
BULK_ENDP_OUT sBulkOut;
|
||||
/* Interrupt endpoint in info */
|
||||
INTR_ENDP_IN sIntrIn;
|
||||
/* Interrupt endpoint out info */
|
||||
INTR_ENDP_OUT sIntrOut;
|
||||
|
||||
|
||||
|
||||
ULONG ulInterruptData[2];
|
||||
|
||||
struct urb *psInterruptUrb;
|
||||
|
||||
USB_TCB asUsbTcb[MAXIMUM_USB_TCB];
|
||||
USB_RCB asUsbRcb[MAXIMUM_USB_RCB];
|
||||
atomic_t uNumTcbUsed;
|
||||
atomic_t uCurrTcb;
|
||||
atomic_t uNumRcbUsed;
|
||||
atomic_t uCurrRcb;
|
||||
|
||||
PMINI_ADAPTER psAdapter;
|
||||
BOOLEAN bFlashBoot;
|
||||
BOOLEAN bHighSpeedDevice ;
|
||||
|
||||
BOOLEAN bSuspended;
|
||||
BOOLEAN bPreparingForBusSuspend;
|
||||
struct work_struct usbSuspendWork;
|
||||
}S_INTERFACE_ADAPTER,*PS_INTERFACE_ADAPTER;
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,318 @@
|
||||
#include "headers.h"
|
||||
|
||||
/*
|
||||
Function: InterfaceIdleModeWakeup
|
||||
|
||||
Description: This is the hardware specific Function for waking up HW device from Idle mode.
|
||||
A software abort pattern is written to the device to wake it and necessary power state
|
||||
transitions from host are performed here.
|
||||
|
||||
Input parameters: IN PMINI_ADAPTER Adapter - Miniport Adapter Context
|
||||
|
||||
|
||||
Return: BCM_STATUS_SUCCESS - If Wakeup of the HW Interface was successful.
|
||||
Other - If an error occured.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
Function: InterfaceIdleModeRespond
|
||||
|
||||
Description: This is the hardware specific Function for responding to Idle mode request from target.
|
||||
Necessary power state transitions from host for idle mode or other device specific
|
||||
initializations are performed here.
|
||||
|
||||
Input parameters: IN PMINI_ADAPTER Adapter - Miniport Adapter Context
|
||||
|
||||
|
||||
Return: BCM_STATUS_SUCCESS - If Idle mode response related HW configuration was successful.
|
||||
Other - If an error occured.
|
||||
*/
|
||||
|
||||
/*
|
||||
"dmem bfc02f00 100" tells how many time device went in Idle mode.
|
||||
this value will be at address bfc02fa4.just before value d0ea1dle.
|
||||
|
||||
Set time value by writing at bfc02f98 7d0
|
||||
|
||||
checking the Ack timer expire on kannon by running command
|
||||
d qcslog .. if it shows e means host has not send response to f/w with in 200 ms. Response should be
|
||||
send to f/w with in 200 ms after the Idle/Shutdown req issued
|
||||
|
||||
*/
|
||||
|
||||
|
||||
int InterfaceIdleModeRespond(PMINI_ADAPTER Adapter,int* puiBuffer)
|
||||
{
|
||||
int status = STATUS_SUCCESS;
|
||||
unsigned int uiRegRead = 0;
|
||||
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"SubType of Message :0x%X", ntohl(*puiBuffer));
|
||||
|
||||
if(ntohl(*puiBuffer) == GO_TO_IDLE_MODE_PAYLOAD)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL," Got GO_TO_IDLE_MODE_PAYLOAD(210) Msg Subtype");
|
||||
if(ntohl(*(puiBuffer+1)) == 0 )
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"Got IDLE MODE WAKE UP Response From F/W");
|
||||
|
||||
status = wrmalt (Adapter,SW_ABORT_IDLEMODE_LOC, &uiRegRead, sizeof(uiRegRead));
|
||||
if(status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "wrm failed while clearing Idle Mode Reg");
|
||||
return status;
|
||||
}
|
||||
|
||||
if(Adapter->ulPowerSaveMode == DEVICE_POWERSAVE_MODE_AS_MANUAL_CLOCK_GATING)
|
||||
{
|
||||
uiRegRead = 0x00000000 ;
|
||||
status = wrmalt (Adapter,DEBUG_INTERRUPT_GENERATOR_REGISTOR, &uiRegRead, sizeof(uiRegRead));
|
||||
if(status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "wrm failed while clearing Idle Mode Reg");
|
||||
return status;
|
||||
}
|
||||
}
|
||||
//Below Register should not br read in case of Manual and Protocol Idle mode.
|
||||
else if(Adapter->ulPowerSaveMode != DEVICE_POWERSAVE_MODE_AS_PROTOCOL_IDLE_MODE)
|
||||
{
|
||||
//clear on read Register
|
||||
status = rdmalt(Adapter, DEVICE_INT_OUT_EP_REG0, &uiRegRead, sizeof(uiRegRead));
|
||||
if(status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "rdm failed while clearing H/W Abort Reg0");
|
||||
return status;
|
||||
}
|
||||
//clear on read Register
|
||||
status = rdmalt (Adapter, DEVICE_INT_OUT_EP_REG1, &uiRegRead, sizeof(uiRegRead));
|
||||
if(status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "rdm failed while clearing H/W Abort Reg1");
|
||||
return status;
|
||||
}
|
||||
}
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Device Up from Idle Mode");
|
||||
|
||||
// Set Idle Mode Flag to False and Clear IdleMode reg.
|
||||
Adapter->IdleMode = FALSE;
|
||||
Adapter->bTriedToWakeUpFromlowPowerMode = FALSE;
|
||||
|
||||
wake_up(&Adapter->lowpower_mode_wait_queue);
|
||||
#if 0
|
||||
if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"LED Thread is Running. Hence Setting the LED Event as IDLEMODE_EXIT");
|
||||
Adapter->DriverState = IDLEMODE_EXIT;
|
||||
wake_up(&Adapter->LEDInfo.notify_led_event);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if(TRUE == Adapter->IdleMode)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"Device is already in Idle mode....");
|
||||
return status ;
|
||||
}
|
||||
|
||||
uiRegRead = 0;
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Got Req from F/W to go in IDLE mode \n");
|
||||
|
||||
if (Adapter->chip_id== BCS220_2 ||
|
||||
Adapter->chip_id == BCS220_2BC ||
|
||||
Adapter->chip_id== BCS250_BC ||
|
||||
Adapter->chip_id== BCS220_3)
|
||||
{
|
||||
|
||||
status = rdmalt(Adapter, HPM_CONFIG_MSW, &uiRegRead, sizeof(uiRegRead));
|
||||
if(status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "rdm failed while Reading HPM_CONFIG_LDO145 Reg 0\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
uiRegRead |= (1<<17);
|
||||
|
||||
status = wrmalt (Adapter,HPM_CONFIG_MSW, &uiRegRead, sizeof(uiRegRead));
|
||||
if(status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "wrm failed while clearing Idle Mode Reg\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
}
|
||||
SendIdleModeResponse(Adapter);
|
||||
}
|
||||
}
|
||||
else if(ntohl(*puiBuffer) == IDLE_MODE_SF_UPDATE_MSG)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "OverRiding Service Flow Params");
|
||||
OverrideServiceFlowParams(Adapter,puiBuffer);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
VOID InterfaceWriteIdleModeWakePattern(PMINI_ADAPTER Adapter)
|
||||
{
|
||||
/* BeceemWriteMemoryUshort(Adapter, Host2CPU_Mailbox_Low, 0x1d1e);
|
||||
BeceemWriteMemoryUshort(Adapter, Host2CPU_Mailbox_Low, 0x1d1e);
|
||||
BeceemWriteMemoryUshort(Adapter, Host2CPU_Mailbox_Upp, 0xd0ea);
|
||||
BeceemWriteMemoryUshort(Adapter, Host2CPU_Mailbox_Upp, 0xd0ea);*/
|
||||
return;
|
||||
}
|
||||
|
||||
int InterfaceAbortIdlemode(PMINI_ADAPTER Adapter, unsigned int Pattern)
|
||||
{
|
||||
int status = STATUS_SUCCESS;
|
||||
unsigned int value;
|
||||
unsigned int chip_id ;
|
||||
unsigned long timeout = 0 ,itr = 0;
|
||||
|
||||
int lenwritten = 0;
|
||||
unsigned char aucAbortPattern[8]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
|
||||
PS_INTERFACE_ADAPTER psInterfaceAdapter = Adapter->pvInterfaceAdapter;
|
||||
|
||||
//Abort Bus suspend if its already suspended
|
||||
if((TRUE == psInterfaceAdapter->bSuspended) && (TRUE == Adapter->bDoSuspend))
|
||||
{
|
||||
status = usb_autopm_get_interface(psInterfaceAdapter->interface);
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"Bus got wakeup..Aborting Idle mode... status:%d \n",status);
|
||||
|
||||
}
|
||||
|
||||
if((Adapter->ulPowerSaveMode == DEVICE_POWERSAVE_MODE_AS_MANUAL_CLOCK_GATING)
|
||||
||
|
||||
(Adapter->ulPowerSaveMode == DEVICE_POWERSAVE_MODE_AS_PROTOCOL_IDLE_MODE))
|
||||
{
|
||||
//write the SW abort pattern.
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Writing pattern<%d> to SW_ABORT_IDLEMODE_LOC\n", Pattern);
|
||||
status = wrmalt(Adapter,SW_ABORT_IDLEMODE_LOC, &Pattern, sizeof(Pattern));
|
||||
if(status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"WRM to Register SW_ABORT_IDLEMODE_LOC failed..");
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
if(Adapter->ulPowerSaveMode == DEVICE_POWERSAVE_MODE_AS_MANUAL_CLOCK_GATING)
|
||||
{
|
||||
value = 0x80000000;
|
||||
status = wrmalt(Adapter,DEBUG_INTERRUPT_GENERATOR_REGISTOR, &value, sizeof(value));
|
||||
if(status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"WRM to DEBUG_INTERRUPT_GENERATOR_REGISTOR Register failed");
|
||||
return status;
|
||||
}
|
||||
}
|
||||
else if(Adapter->ulPowerSaveMode != DEVICE_POWERSAVE_MODE_AS_PROTOCOL_IDLE_MODE)
|
||||
{
|
||||
/*
|
||||
* Get a Interrupt Out URB and send 8 Bytes Down
|
||||
* To be Done in Thread Context.
|
||||
* Not using Asynchronous Mechanism.
|
||||
*/
|
||||
status = usb_interrupt_msg (psInterfaceAdapter->udev,
|
||||
usb_sndintpipe(psInterfaceAdapter->udev,
|
||||
psInterfaceAdapter->sIntrOut.int_out_endpointAddr),
|
||||
aucAbortPattern,
|
||||
8,
|
||||
&lenwritten,
|
||||
5000);
|
||||
if(status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Sending Abort pattern down fails with status:%d..\n",status);
|
||||
return status;
|
||||
}
|
||||
else
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "NOB Sent down :%d", lenwritten);
|
||||
}
|
||||
|
||||
//mdelay(25);
|
||||
|
||||
timeout= jiffies + msecs_to_jiffies(50) ;
|
||||
while( timeout > jiffies )
|
||||
{
|
||||
itr++ ;
|
||||
rdmalt(Adapter, CHIP_ID_REG, &chip_id, sizeof(UINT));
|
||||
if(0xbece3200==(chip_id&~(0xF0)))
|
||||
{
|
||||
chip_id = chip_id&~(0xF0);
|
||||
}
|
||||
if(chip_id == Adapter->chip_id)
|
||||
break;
|
||||
}
|
||||
if(timeout < jiffies )
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"Not able to read chip-id even after 25 msec");
|
||||
}
|
||||
else
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"Number of completed iteration to read chip-id :%lu", itr);
|
||||
}
|
||||
|
||||
status = wrmalt(Adapter,SW_ABORT_IDLEMODE_LOC, &Pattern, sizeof(status));
|
||||
if(status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"WRM to Register SW_ABORT_IDLEMODE_LOC failed..");
|
||||
return status;
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
int InterfaceIdleModeWakeup(PMINI_ADAPTER Adapter)
|
||||
{
|
||||
ULONG Status = 0;
|
||||
if(Adapter->bTriedToWakeUpFromlowPowerMode)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Wake up already attempted.. ignoring\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"Writing Low Power Mode Abort pattern to the Device\n");
|
||||
Adapter->bTriedToWakeUpFromlowPowerMode = TRUE;
|
||||
InterfaceAbortIdlemode(Adapter, Adapter->usIdleModePattern);
|
||||
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
void InterfaceHandleShutdownModeWakeup(PMINI_ADAPTER Adapter)
|
||||
{
|
||||
unsigned int uiRegVal = 0;
|
||||
INT Status = 0;
|
||||
if(Adapter->ulPowerSaveMode == DEVICE_POWERSAVE_MODE_AS_MANUAL_CLOCK_GATING)
|
||||
{
|
||||
// clear idlemode interrupt.
|
||||
uiRegVal = 0;
|
||||
Status =wrmalt(Adapter,DEBUG_INTERRUPT_GENERATOR_REGISTOR, &uiRegVal, sizeof(uiRegVal));
|
||||
if(Status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"WRM to DEBUG_INTERRUPT_GENERATOR_REGISTOR Failed with err :%d", Status);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
|
||||
//clear Interrupt EP registers.
|
||||
Status = rdmalt(Adapter,DEVICE_INT_OUT_EP_REG0, &uiRegVal, sizeof(uiRegVal));
|
||||
if(Status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"RDM of DEVICE_INT_OUT_EP_REG0 failed with Err :%d", Status);
|
||||
return;
|
||||
}
|
||||
|
||||
Status = rdmalt(Adapter,DEVICE_INT_OUT_EP_REG1, &uiRegVal, sizeof(uiRegVal));
|
||||
if(Status)
|
||||
{
|
||||
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"RDM of DEVICE_INT_OUT_EP_REG1 failed with Err :%d", Status);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user