3 static INT
bcm_notify_event(struct notifier_block
*nb
, ULONG event
, PVOID dev
)
5 struct net_device
*ndev
= (struct net_device
*)dev
;
6 PMINI_ADAPTER Adapter
= GET_BCM_ADAPTER(gblpnetdev
);
7 //PMINI_ADAPTER Adapter = (PMINI_ADAPTER)ndev->priv;
8 if(strncmp(ndev
->name
,gblpnetdev
->name
,5)==0)
12 case NETDEV_CHANGEADDR
:
13 case NETDEV_GOING_DOWN
:
23 /* Increment the Reference Count for "veth0" */
24 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "Register RefCount: %x\n",
25 atomic_read(&ndev
->refcnt
));
26 atomic_inc(&ndev
->refcnt
);
29 case NETDEV_UNREGISTER
:
30 /* Decrement the Reference Count for "veth0" */
31 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "Unregister RefCnt: %x\n",
32 atomic_read(&ndev
->refcnt
));
33 atomic_dec(&ndev
->refcnt
);
34 if((int)atomic_read(&ndev
->refcnt
) < 0)
35 atomic_set(&ndev
->refcnt
, 0);
42 /* Notifier block to receive netdevice events */
43 static struct notifier_block bcm_notifier_block
=
45 .notifier_call
= bcm_notify_event
,
48 struct net_device
*gblpnetdev
;
49 /***************************************************************************************/
50 /* proto-type of lower function */
51 #ifdef BCM_SHM_INTERFACE
52 const char *bcmVirtDeviceName
="bcmeth";
55 static INT
bcm_open(struct net_device
*dev
)
57 PMINI_ADAPTER Adapter
= NULL
; //(PMINI_ADAPTER)dev->priv;
58 Adapter
= GET_BCM_ADAPTER(dev
);
59 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "======>");
60 if(Adapter
->fw_download_done
==FALSE
)
63 if(Adapter
->LinkUpStatus
== 1){
64 if(netif_queue_stopped(Adapter
->dev
)){
65 netif_carrier_on(Adapter
->dev
);
66 netif_start_queue(Adapter
->dev
);
70 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "<======");
74 static INT
bcm_close(struct net_device
*dev
)
76 PMINI_ADAPTER Adapter
= NULL
;//gpadapter ;
77 Adapter
= GET_BCM_ADAPTER(dev
);
78 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "=====>");
80 if(!netif_queue_stopped(dev
)) {
81 netif_carrier_off(dev
);
82 netif_stop_queue(dev
);
84 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,"<=====");
88 static struct net_device_stats
*bcm_get_stats(struct net_device
*dev
)
90 PLINUX_DEP_DATA pLinuxData
=NULL
;
91 PMINI_ADAPTER Adapter
= NULL
;// gpadapter ;
92 Adapter
= GET_BCM_ADAPTER(dev
);
93 pLinuxData
= (PLINUX_DEP_DATA
)(Adapter
->pvOsDepData
);
95 //BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Dev = %p, pLinuxData = %p", dev, pLinuxData);
96 pLinuxData
->netstats
.rx_packets
=atomic_read(&Adapter
->RxRollOverCount
)*64*1024+Adapter
->PrevNumRecvDescs
;
97 pLinuxData
->netstats
.rx_bytes
=atomic_read(&Adapter
->GoodRxByteCount
)+atomic_read(&Adapter
->BadRxByteCount
);
98 pLinuxData
->netstats
.rx_dropped
=atomic_read(&Adapter
->RxPacketDroppedCount
);
99 pLinuxData
->netstats
.rx_errors
=atomic_read(&Adapter
->RxPacketDroppedCount
);
100 pLinuxData
->netstats
.rx_length_errors
=0;
101 pLinuxData
->netstats
.rx_frame_errors
=0;
102 pLinuxData
->netstats
.rx_crc_errors
=0;
103 pLinuxData
->netstats
.tx_bytes
=atomic_read(&Adapter
->GoodTxByteCount
);
104 pLinuxData
->netstats
.tx_packets
=atomic_read(&Adapter
->TxTotalPacketCount
);
105 pLinuxData
->netstats
.tx_dropped
=atomic_read(&Adapter
->TxDroppedPacketCount
);
107 return &(pLinuxData
->netstats
);
110 @ingroup init_functions
111 Register other driver entry points with the kernel
113 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
114 struct net_device_ops bcmNetDevOps
= {
115 .ndo_open
= bcm_open
,
116 .ndo_stop
= bcm_close
,
117 .ndo_get_stats
= bcm_get_stats
,
118 .ndo_start_xmit
= bcm_transmit
,
119 .ndo_change_mtu
= eth_change_mtu
,
120 .ndo_set_mac_address
= eth_mac_addr
,
121 .ndo_validate_addr
= eth_validate_addr
,
125 int register_networkdev(PMINI_ADAPTER Adapter
)
128 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
129 void **temp
= NULL
; /* actually we're *allocating* the device in alloc_etherdev */
131 Adapter
->dev
= alloc_etherdev(sizeof(PMINI_ADAPTER
));
134 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "ERR: No Dev");
137 gblpnetdev
= Adapter
->dev
;
138 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
139 Adapter
->dev
->priv
= Adapter
;
141 temp
= netdev_priv(Adapter
->dev
);
142 *temp
= (void *)Adapter
;
144 //BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "init adapterptr: %x %x\n", (UINT)Adapter, temp);
146 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
147 Adapter
->dev
->netdev_ops
= &bcmNetDevOps
;
149 Adapter
->dev
->open
= bcm_open
;
150 Adapter
->dev
->stop
= bcm_close
;
151 Adapter
->dev
->get_stats
= bcm_get_stats
;
152 Adapter
->dev
->hard_start_xmit
= bcm_transmit
;
153 Adapter
->dev
->hard_header_len
= ETH_HLEN
+ LEADER_SIZE
;
156 #ifndef BCM_SHM_INTERFACE
157 Adapter
->dev
->mtu
= MTU_SIZE
; /* 1400 Bytes */
158 /* Read the MAC Address from EEPROM */
159 ReadMacAddressFromNVM(Adapter
);
162 /* Register the notifier block for getting netdevice events */
163 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "Registering netdevice notifier\n");
164 result
= register_netdevice_notifier(&bcm_notifier_block
);
167 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "BCM Notifier Block did not get registered");
168 Adapter
->bNetdeviceNotifierRegistered
= FALSE
;
173 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "BCM Notifier got Registered");
174 Adapter
->bNetdeviceNotifierRegistered
= TRUE
;
179 Adapter
->dev
->mtu
= CPE_MTU_SIZE
;
182 //for CPE - harcode the virtual mac address
183 Adapter
->dev
->dev_addr
[0] = MII_WIMAX_MACADDRESS
[0];
184 Adapter
->dev
->dev_addr
[1] = MII_WIMAX_MACADDRESS
[1];
185 Adapter
->dev
->dev_addr
[2] = MII_WIMAX_MACADDRESS
[2];
186 Adapter
->dev
->dev_addr
[3] = MII_WIMAX_MACADDRESS
[3];
187 Adapter
->dev
->dev_addr
[4] = MII_WIMAX_MACADDRESS
[4];
188 Adapter
->dev
->dev_addr
[5] = MII_WIMAX_MACADDRESS
[5];
190 ReadMacAddressFromNVM(Adapter
);
192 strcpy(Adapter
->dev
->name
, bcmVirtDeviceName
); //Copy the device name
196 result
= register_netdev(Adapter
->dev
);
199 Adapter
->bNetworkInterfaceRegistered
= TRUE
;
200 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "Beceem Network device name is %s!", Adapter
->dev
->name
);
204 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "Network device can not be registered!");
205 Adapter
->bNetworkInterfaceRegistered
= FALSE
;
210 Adapter
->stDebugState
.debug_level
= DBG_LVL_CURR
;
211 Adapter
->stDebugState
.type
=(UINT
)0xffffffff;
212 Adapter
->stDebugState
.subtype
[DBG_TYPE_OTHERS
] = 0xffffffff;
213 Adapter
->stDebugState
.subtype
[DBG_TYPE_RX
] = 0xffffffff;
214 Adapter
->stDebugState
.subtype
[DBG_TYPE_TX
] = 0xffffffff;
215 Adapter
->stDebugState
.subtype
[DBG_TYPE_INITEXIT
] = 0xffffffff;
217 printk("-------ps_adapter->stDebugState.type=%x\n",Adapter
->stDebugState
.type
);
218 printk("-------ps_adapter->stDebugState.subtype[DBG_TYPE_OTHERS]=%x\n",Adapter
->stDebugState
.subtype
[DBG_TYPE_OTHERS
]);
219 printk("-------ps_adapter->stDebugState.subtype[DBG_TYPE_RX]=%x\n",Adapter
->stDebugState
.subtype
[DBG_TYPE_RX
]);
220 printk("-------ps_adapter->stDebugState.subtype[DBG_TYPE_TX]=%x\n",Adapter
->stDebugState
.subtype
[DBG_TYPE_TX
]);
226 void bcm_unregister_networkdev(PMINI_ADAPTER Adapter
)
228 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "Unregistering the Net Dev...\n");
229 if(Adapter
->dev
&& !IS_ERR(Adapter
->dev
) && Adapter
->bNetworkInterfaceRegistered
)
230 unregister_netdev(Adapter
->dev
);
231 /* Unregister the notifier block */
232 if(Adapter
->bNetdeviceNotifierRegistered
== TRUE
)
234 BCM_DEBUG_PRINT(Adapter
,DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
, "Unregistering netdevice notifier\n");
235 unregister_netdevice_notifier(&bcm_notifier_block
);
239 static int bcm_init(void)
242 result
= InterfaceInitialize();
245 printk("Initialisation failed for usbbcm");
249 printk("Initialised usbbcm");
255 static void bcm_exit(void)
257 printk("%s %s Calling InterfaceExit\n",__FILE__
, __FUNCTION__
);
259 printk("%s %s InterfaceExit returned\n",__FILE__
, __FUNCTION__
);
262 module_init(bcm_init
);
263 module_exit(bcm_exit
);
264 MODULE_LICENSE ("GPL");