3 #define DRV_DESCRIPTION "Beceem Communications Inc. WiMAX driver"
4 #define DRV_VERSION "5.2.7.3P1"
5 #define DRV_COPYRIGHT "Copyright 2010. Beceem Communications Inc"
7 static INT bcm_notify_event(struct notifier_block *nb, ULONG event, PVOID dev)
9 struct net_device *ndev = (struct net_device*)dev;
10 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
11 //PMINI_ADAPTER Adapter = (PMINI_ADAPTER)ndev->priv;
12 if(strncmp(ndev->name,gblpnetdev->name,5)==0)
16 case NETDEV_CHANGEADDR:
17 case NETDEV_GOING_DOWN:
27 /* Increment the Reference Count for "veth0" */
28 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Register RefCount: %x\n",
29 netdev_refcnt_read(ndev));
33 case NETDEV_UNREGISTER:
34 /* Decrement the Reference Count for "veth0" */
35 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Unregister RefCnt: %x\n",
36 netdev_refcnt_read(ndev));
44 /* Notifier block to receive netdevice events */
45 static struct notifier_block bcm_notifier_block =
47 .notifier_call = bcm_notify_event,
50 struct net_device *gblpnetdev;
51 /***************************************************************************************/
52 /* proto-type of lower function */
53 #ifdef BCM_SHM_INTERFACE
54 const char *bcmVirtDeviceName="bcmeth";
57 static INT bcm_open(struct net_device *dev)
59 PMINI_ADAPTER Adapter = NULL ; //(PMINI_ADAPTER)dev->priv;
60 Adapter = GET_BCM_ADAPTER(dev);
61 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "======>");
62 if(Adapter->fw_download_done==FALSE)
65 if(Adapter->LinkUpStatus == 1){
66 if(netif_queue_stopped(Adapter->dev)){
67 netif_carrier_on(Adapter->dev);
68 netif_start_queue(Adapter->dev);
72 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "<======");
76 static INT bcm_close(struct net_device *dev)
78 PMINI_ADAPTER Adapter = NULL ;//gpadapter ;
79 Adapter = GET_BCM_ADAPTER(dev);
80 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "=====>");
82 if(!netif_queue_stopped(dev)) {
83 netif_carrier_off(dev);
84 netif_stop_queue(dev);
86 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL,"<=====");
90 static struct net_device_stats *bcm_get_stats(struct net_device *dev)
92 PLINUX_DEP_DATA pLinuxData=NULL;
93 PMINI_ADAPTER Adapter = NULL ;// gpadapter ;
94 Adapter = GET_BCM_ADAPTER(dev);
95 pLinuxData = (PLINUX_DEP_DATA)(Adapter->pvOsDepData);
97 //BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Dev = %p, pLinuxData = %p", dev, pLinuxData);
98 pLinuxData->netstats.rx_packets=atomic_read(&Adapter->RxRollOverCount)*64*1024+Adapter->PrevNumRecvDescs;
99 pLinuxData->netstats.rx_bytes=atomic_read(&Adapter->GoodRxByteCount)+atomic_read(&Adapter->BadRxByteCount);
100 pLinuxData->netstats.rx_dropped=atomic_read(&Adapter->RxPacketDroppedCount);
101 pLinuxData->netstats.rx_errors=atomic_read(&Adapter->RxPacketDroppedCount);
102 pLinuxData->netstats.rx_length_errors=0;
103 pLinuxData->netstats.rx_frame_errors=0;
104 pLinuxData->netstats.rx_crc_errors=0;
105 pLinuxData->netstats.tx_bytes=atomic_read(&Adapter->GoodTxByteCount);
106 pLinuxData->netstats.tx_packets=atomic_read(&Adapter->TxTotalPacketCount);
107 pLinuxData->netstats.tx_dropped=atomic_read(&Adapter->TxDroppedPacketCount);
109 return &(pLinuxData->netstats);
112 @ingroup init_functions
113 Register other driver entry points with the kernel
115 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
116 static struct net_device_ops bcmNetDevOps = {
117 .ndo_open = bcm_open,
118 .ndo_stop = bcm_close,
119 .ndo_get_stats = bcm_get_stats,
120 .ndo_start_xmit = bcm_transmit,
121 .ndo_change_mtu = eth_change_mtu,
122 .ndo_set_mac_address = eth_mac_addr,
123 .ndo_validate_addr = eth_validate_addr,
127 int register_networkdev(PMINI_ADAPTER Adapter)
130 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
131 void **temp = NULL; /* actually we're *allocating* the device in alloc_etherdev */
133 Adapter->dev = alloc_etherdev(sizeof(PMINI_ADAPTER));
136 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "ERR: No Dev");
139 gblpnetdev = Adapter->dev;
140 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
141 Adapter->dev->priv = Adapter;
143 temp = netdev_priv(Adapter->dev);
144 *temp = (void *)Adapter;
146 //BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "init adapterptr: %x %x\n", (UINT)Adapter, temp);
148 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
149 Adapter->dev->netdev_ops = &bcmNetDevOps;
151 Adapter->dev->open = bcm_open;
152 Adapter->dev->stop = bcm_close;
153 Adapter->dev->get_stats = bcm_get_stats;
154 Adapter->dev->hard_start_xmit = bcm_transmit;
155 Adapter->dev->hard_header_len = ETH_HLEN + LEADER_SIZE;
158 #ifndef BCM_SHM_INTERFACE
159 Adapter->dev->mtu = MTU_SIZE; /* 1400 Bytes */
160 /* Read the MAC Address from EEPROM */
161 ReadMacAddressFromNVM(Adapter);
164 /* Register the notifier block for getting netdevice events */
165 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Registering netdevice notifier\n");
166 result = register_netdevice_notifier(&bcm_notifier_block);
169 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "BCM Notifier Block did not get registered");
170 Adapter->bNetdeviceNotifierRegistered = FALSE;
175 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "BCM Notifier got Registered");
176 Adapter->bNetdeviceNotifierRegistered = TRUE;
181 Adapter->dev->mtu = CPE_MTU_SIZE;
184 //for CPE - harcode the virtual mac address
185 Adapter->dev->dev_addr[0] = MII_WIMAX_MACADDRESS[0];
186 Adapter->dev->dev_addr[1] = MII_WIMAX_MACADDRESS[1];
187 Adapter->dev->dev_addr[2] = MII_WIMAX_MACADDRESS[2];
188 Adapter->dev->dev_addr[3] = MII_WIMAX_MACADDRESS[3];
189 Adapter->dev->dev_addr[4] = MII_WIMAX_MACADDRESS[4];
190 Adapter->dev->dev_addr[5] = MII_WIMAX_MACADDRESS[5];
192 ReadMacAddressFromNVM(Adapter);
194 strcpy(Adapter->dev->name, bcmVirtDeviceName); //Copy the device name
198 result = register_netdev(Adapter->dev);
201 Adapter->bNetworkInterfaceRegistered = TRUE ;
202 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Beceem Network device name is %s!", Adapter->dev->name);
206 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Network device can not be registered!");
207 Adapter->bNetworkInterfaceRegistered = FALSE ;
212 Adapter->stDebugState.debug_level = DBG_LVL_CURR;
213 Adapter->stDebugState.type =(UINT)0xffffffff;
214 Adapter->stDebugState.subtype[DBG_TYPE_OTHERS] = 0xffffffff;
215 Adapter->stDebugState.subtype[DBG_TYPE_RX] = 0xffffffff;
216 Adapter->stDebugState.subtype[DBG_TYPE_TX] = 0xffffffff;
217 Adapter->stDebugState.subtype[DBG_TYPE_INITEXIT] = 0xffffffff;
219 printk("-------ps_adapter->stDebugState.type=%x\n",Adapter->stDebugState.type);
220 printk("-------ps_adapter->stDebugState.subtype[DBG_TYPE_OTHERS]=%x\n",Adapter->stDebugState.subtype[DBG_TYPE_OTHERS]);
221 printk("-------ps_adapter->stDebugState.subtype[DBG_TYPE_RX]=%x\n",Adapter->stDebugState.subtype[DBG_TYPE_RX]);
222 printk("-------ps_adapter->stDebugState.subtype[DBG_TYPE_TX]=%x\n",Adapter->stDebugState.subtype[DBG_TYPE_TX]);
228 void bcm_unregister_networkdev(PMINI_ADAPTER Adapter)
230 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Unregistering the Net Dev...\n");
231 if(Adapter->dev && !IS_ERR(Adapter->dev) && Adapter->bNetworkInterfaceRegistered)
232 unregister_netdev(Adapter->dev);
233 /* Unregister the notifier block */
234 if(Adapter->bNetdeviceNotifierRegistered == TRUE)
236 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Unregistering netdevice notifier\n");
237 unregister_netdevice_notifier(&bcm_notifier_block);
241 static int bcm_init(void)
243 printk(KERN_INFO "%s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
244 printk(KERN_INFO "%s\n", DRV_COPYRIGHT);
246 return InterfaceInitialize();
250 static void bcm_exit(void)
255 module_init(bcm_init);
256 module_exit(bcm_exit);
258 MODULE_DESCRIPTION(DRV_DESCRIPTION);
259 MODULE_VERSION(DRV_VERSION);
260 MODULE_LICENSE ("GPL");