2010-09-08 21:46:36 +00:00
|
|
|
#include "headers.h"
|
|
|
|
|
2010-10-29 14:44:45 +00:00
|
|
|
#define DRV_DESCRIPTION "Beceem Communications Inc. WiMAX driver"
|
|
|
|
#define DRV_VERSION "5.2.7.3P1"
|
|
|
|
#define DRV_COPYRIGHT "Copyright 2010. Beceem Communications Inc"
|
|
|
|
|
2010-09-08 21:46:36 +00:00
|
|
|
|
|
|
|
struct net_device *gblpnetdev;
|
|
|
|
/***************************************************************************************/
|
|
|
|
/* proto-type of lower function */
|
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
2010-10-29 15:22:10 +00:00
|
|
|
PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(dev);
|
|
|
|
struct net_device_stats* netstats = &dev->stats;
|
|
|
|
|
|
|
|
netstats->rx_packets = atomic_read(&Adapter->RxRollOverCount)*64*1024
|
|
|
|
+ Adapter->PrevNumRecvDescs;
|
|
|
|
netstats->rx_bytes = atomic_read(&Adapter->GoodRxByteCount)
|
|
|
|
+ atomic_read(&Adapter->BadRxByteCount);
|
2010-09-08 21:46:36 +00:00
|
|
|
|
2010-10-29 15:22:10 +00:00
|
|
|
netstats->rx_dropped = atomic_read(&Adapter->RxPacketDroppedCount);
|
|
|
|
netstats->rx_errors = atomic_read(&Adapter->RxPacketDroppedCount);
|
|
|
|
netstats->tx_bytes = atomic_read(&Adapter->GoodTxByteCount);
|
|
|
|
netstats->tx_packets = atomic_read(&Adapter->TxTotalPacketCount);
|
|
|
|
netstats->tx_dropped = atomic_read(&Adapter->TxDroppedPacketCount);
|
2010-09-08 21:46:36 +00:00
|
|
|
|
2010-10-29 15:22:10 +00:00
|
|
|
return netstats;
|
2010-09-08 21:46:36 +00:00
|
|
|
}
|
|
|
|
/**
|
|
|
|
@ingroup init_functions
|
|
|
|
Register other driver entry points with the kernel
|
|
|
|
*/
|
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
|
2010-09-30 08:24:12 +00:00
|
|
|
static struct net_device_ops bcmNetDevOps = {
|
2010-09-08 21:46:36 +00:00
|
|
|
.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)
|
2010-09-30 08:24:11 +00:00
|
|
|
void **temp = NULL; /* actually we're *allocating* the device in alloc_etherdev */
|
2010-09-08 21:46:36 +00:00
|
|
|
#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);
|
2010-09-30 08:24:11 +00:00
|
|
|
*temp = (void *)Adapter;
|
2010-09-08 21:46:36 +00:00
|
|
|
#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
|
|
|
|
|
|
|
|
Adapter->dev->mtu = MTU_SIZE; /* 1400 Bytes */
|
|
|
|
/* Read the MAC Address from EEPROM */
|
|
|
|
ReadMacAddressFromNVM(Adapter);
|
|
|
|
|
|
|
|
result = register_netdev(Adapter->dev);
|
2010-10-29 15:18:27 +00:00
|
|
|
if (!result) {
|
|
|
|
free_netdev(Adapter->dev);
|
|
|
|
Adapter->dev = NULL;
|
2010-09-08 21:46:36 +00:00
|
|
|
}
|
|
|
|
|
2010-10-29 15:18:27 +00:00
|
|
|
return result;
|
2010-09-08 21:46:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void bcm_unregister_networkdev(PMINI_ADAPTER Adapter)
|
|
|
|
{
|
|
|
|
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Unregistering the Net Dev...\n");
|
2010-10-29 15:18:27 +00:00
|
|
|
if(Adapter->dev) {
|
2010-09-08 21:46:36 +00:00
|
|
|
unregister_netdev(Adapter->dev);
|
2010-10-29 15:18:27 +00:00
|
|
|
Adapter->dev = NULL;
|
|
|
|
}
|
2010-09-08 21:46:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int bcm_init(void)
|
|
|
|
{
|
2010-10-29 14:44:45 +00:00
|
|
|
printk(KERN_INFO "%s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
|
|
|
|
printk(KERN_INFO "%s\n", DRV_COPYRIGHT);
|
|
|
|
|
|
|
|
return InterfaceInitialize();
|
2010-09-08 21:46:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void bcm_exit(void)
|
|
|
|
{
|
|
|
|
InterfaceExit();
|
|
|
|
}
|
|
|
|
|
|
|
|
module_init(bcm_init);
|
|
|
|
module_exit(bcm_exit);
|
|
|
|
|
2010-10-29 14:44:45 +00:00
|
|
|
MODULE_DESCRIPTION(DRV_DESCRIPTION);
|
|
|
|
MODULE_VERSION(DRV_VERSION);
|
|
|
|
MODULE_LICENSE ("GPL");
|
2010-09-08 21:46:36 +00:00
|
|
|
|