1 /*******************************************************************************
3 * Wireless device driver for Linux (wlags49).
5 * Copyright (c) 1998-2003 Agere Systems Inc.
9 * Initially developed by TriplePoint, Inc.
10 * http://www.triplepoint.com
12 *------------------------------------------------------------------------------
14 * This file contains handler functions registered with the net_device
17 *------------------------------------------------------------------------------
21 * This software is provided subject to the following terms and conditions,
22 * which you should read carefully before using the software. Using this
23 * software indicates your acceptance of these terms and conditions. If you do
24 * not agree with these terms and conditions, do not use the software.
26 * Copyright © 2003 Agere Systems Inc.
27 * All rights reserved.
29 * Redistribution and use in source or binary forms, with or without
30 * modifications, are permitted provided that the following conditions are met:
32 * . Redistributions of source code must retain the above copyright notice, this
33 * list of conditions and the following Disclaimer as comments in the code as
34 * well as in the documentation and/or other materials provided with the
37 * . Redistributions in binary form must reproduce the above copyright notice,
38 * this list of conditions and the following Disclaimer in the documentation
39 * and/or other materials provided with the distribution.
41 * . Neither the name of Agere Systems Inc. nor the names of the contributors
42 * may be used to endorse or promote products derived from this software
43 * without specific prior written permission.
47 * THIS SOFTWARE IS PROVIDED
\93AS IS
\94 AND ANY EXPRESS OR IMPLIED WARRANTIES,
48 * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF
49 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY
50 * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN
51 * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY
52 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
53 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
54 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
55 * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT
56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
57 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
60 ******************************************************************************/
62 /*******************************************************************************
64 ******************************************************************************/
65 #include <wl_version.h>
67 #include <linux/module.h>
68 #include <linux/slab.h>
69 #include <linux/types.h>
70 #include <linux/kernel.h>
71 // #include <linux/sched.h>
72 // #include <linux/ptrace.h>
73 // #include <linux/slab.h>
74 // #include <linux/ctype.h>
75 // #include <linux/string.h>
76 //#include <linux/timer.h>
77 // #include <linux/interrupt.h>
78 // #include <linux/in.h>
79 // #include <linux/delay.h>
80 // #include <linux/skbuff.h>
81 // #include <asm/io.h>
82 // #include <asm/system.h>
83 // #include <asm/bitops.h>
85 #include <linux/netdevice.h>
86 #include <linux/ethtool.h>
87 #include <linux/etherdevice.h>
88 // #include <linux/skbuff.h>
89 // #include <linux/if_arp.h>
90 // #include <linux/ioport.h>
96 // #include <hcfdef.h>
99 #include <wl_internal.h>
103 #include <wl_netdev.h>
107 #include <wl_profile.h>
108 #endif /* USE_PROFILE */
112 #endif /* BUS_PCMCIA */
119 /*******************************************************************************
121 ******************************************************************************/
123 extern dbg_info_t *DbgInfo;
128 #define MTU_MAX (HCF_MAX_MSG - ETH_HLEN - 8)
130 #define MTU_MAX (HCF_MAX_MSG - ETH_HLEN)
133 //static int mtu = MTU_MAX;
134 //MODULE_PARM(mtu, "i");
135 //MODULE_PARM_DESC(mtu, "MTU");
137 /*******************************************************************************
139 ******************************************************************************/
140 #define BLOCK_INPUT(buf, len) \
141 desc->buf_addr = buf; \
142 desc->BUF_SIZE = len; \
143 status = hcf_rcv_msg(&(lp->hcfCtx), desc, 0)
145 #define BLOCK_INPUT_DMA(buf, len) memcpy( buf, desc_next->buf_addr, pktlen )
147 /*******************************************************************************
148 * function prototypes
149 ******************************************************************************/
151 /*******************************************************************************
153 *******************************************************************************
157 * We never need to do anything when a "Wireless" device is "initialized"
158 * by the net software, because we only register already-found cards.
162 * dev - a pointer to the device's net_device structure
167 * errno value otherwise
169 ******************************************************************************/
170 int wl_init( struct net_device *dev )
172 // unsigned long flags;
173 // struct wl_private *lp = wl_priv(dev);
174 /*------------------------------------------------------------------------*/
176 DBG_FUNC( "wl_init" );
177 DBG_ENTER( DbgInfo );
179 DBG_PARAM( DbgInfo, "dev", "%s (0x%p)", dev->name, dev );
181 /* Nothing to do, but grab the spinlock anyway just in case we ever need
183 // wl_lock( lp, &flags );
184 // wl_unlock( lp, &flags );
186 DBG_LEAVE( DbgInfo );
189 /*============================================================================*/
191 /*******************************************************************************
193 *******************************************************************************
197 * Implement the SIOCSIFMAP interface.
201 * dev - a pointer to the device's net_device structure
202 * map - a pointer to the device's ifmap structure
209 ******************************************************************************/
210 int wl_config( struct net_device *dev, struct ifmap *map )
212 DBG_FUNC( "wl_config" );
213 DBG_ENTER( DbgInfo );
215 DBG_PARAM( DbgInfo, "dev", "%s (0x%p)", dev->name, dev );
216 DBG_PARAM( DbgInfo, "map", "0x%p", map );
218 /* The only thing we care about here is a port change. Since this not needed,
219 ignore the request. */
220 DBG_TRACE( DbgInfo, "%s: %s called.\n", dev->name, __FUNC__ );
222 DBG_LEAVE( DbgInfo );
225 /*============================================================================*/
227 /*******************************************************************************
229 *******************************************************************************
233 * Return the current device statistics.
237 * dev - a pointer to the device's net_device structure
241 * a pointer to a net_device_stats structure containing the network
244 ******************************************************************************/
245 struct net_device_stats *wl_stats( struct net_device *dev )
251 struct net_device_stats *pStats;
252 struct wl_private *lp = wl_priv(dev);
253 /*------------------------------------------------------------------------*/
255 //DBG_FUNC( "wl_stats" );
256 //DBG_ENTER( DbgInfo );
257 //DBG_PARAM( DbgInfo, "dev", "%s (0x%p)", dev->name, dev );
261 wl_lock( lp, &flags );
264 if( lp->useRTS == 1 ) {
265 wl_unlock( lp, &flags );
267 //DBG_LEAVE( DbgInfo );
272 /* Return the statistics for the appropriate device */
275 for( count = 0; count < NUM_WDS_PORTS; count++ ) {
276 if( dev == lp->wds_port[count].dev ) {
277 pStats = &( lp->wds_port[count].stats );
283 /* If pStats is still NULL, then the device is not a WDS port */
284 if( pStats == NULL ) {
285 pStats = &( lp->stats );
288 wl_unlock( lp, &flags );
290 //DBG_LEAVE( DbgInfo );
294 /*============================================================================*/
296 /*******************************************************************************
298 *******************************************************************************
306 * dev - a pointer to the device's net_device structure
313 ******************************************************************************/
314 int wl_open(struct net_device *dev)
316 int status = HCF_SUCCESS;
317 struct wl_private *lp = wl_priv(dev);
319 /*------------------------------------------------------------------------*/
321 DBG_FUNC( "wl_open" );
322 DBG_ENTER( DbgInfo );
324 wl_lock( lp, &flags );
327 if( lp->useRTS == 1 ) {
328 DBG_TRACE( DbgInfo, "Skipping device open, in RTS mode\n" );
329 wl_unlock( lp, &flags );
330 DBG_LEAVE( DbgInfo );
339 if( lp->portState == WVLAN_PORT_STATE_DISABLED ) {
340 DBG_TRACE( DbgInfo, "Enabling Port 0\n" );
341 status = wl_enable( lp );
343 if( status != HCF_SUCCESS ) {
344 DBG_TRACE( DbgInfo, "Enable port 0 failed: 0x%x\n", status );
348 // Holding the lock too long, make a gap to allow other processes
349 wl_unlock(lp, &flags);
350 wl_lock( lp, &flags );
352 if ( strlen( lp->fw_image_filename ) ) {
353 DBG_TRACE( DbgInfo, ";???? Kludgy way to force a download\n" );
354 status = wl_go( lp );
356 status = wl_apply( lp );
359 // Holding the lock too long, make a gap to allow other processes
360 wl_unlock(lp, &flags);
361 wl_lock( lp, &flags );
363 if( status != HCF_SUCCESS ) {
364 // Unsuccessful, try reset of the card to recover
365 status = wl_reset( dev );
368 // Holding the lock too long, make a gap to allow other processes
369 wl_unlock(lp, &flags);
370 wl_lock( lp, &flags );
372 if( status == HCF_SUCCESS ) {
373 netif_carrier_on( dev );
374 WL_WDS_NETIF_CARRIER_ON( lp );
376 lp->is_handling_int = WL_HANDLING_INT; // Start handling interrupts
379 netif_start_queue( dev );
380 WL_WDS_NETIF_START_QUEUE( lp );
382 wl_hcf_error( dev, status ); /* Report the error */
383 netif_device_detach( dev ); /* Stop the device and queue */
386 wl_unlock( lp, &flags );
388 DBG_LEAVE( DbgInfo );
391 /*============================================================================*/
393 /*******************************************************************************
395 *******************************************************************************
403 * dev - a pointer to the device's net_device structure
410 ******************************************************************************/
411 int wl_close( struct net_device *dev )
413 struct wl_private *lp = wl_priv(dev);
415 /*------------------------------------------------------------------------*/
417 DBG_FUNC("wl_close");
419 DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev);
421 /* Mark the adapter as busy */
422 netif_stop_queue( dev );
423 WL_WDS_NETIF_STOP_QUEUE( lp );
425 netif_carrier_off( dev );
426 WL_WDS_NETIF_CARRIER_OFF( lp );
428 /* Shutdown the adapter:
429 Disable adapter interrupts
435 wl_lock( lp, &flags );
437 wl_act_int_off( lp );
438 lp->is_handling_int = WL_NOT_HANDLING_INT; // Stop handling interrupts
441 if( lp->useRTS == 1 ) {
442 DBG_TRACE( DbgInfo, "Skipping device close, in RTS mode\n" );
443 wl_unlock( lp, &flags );
444 DBG_LEAVE( DbgInfo );
449 /* Disable the ports */
452 wl_unlock( lp, &flags );
454 DBG_LEAVE( DbgInfo );
457 /*============================================================================*/
459 static void wl_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
461 strncpy(info->driver, DRIVER_NAME, sizeof(info->driver) - 1);
462 strncpy(info->version, DRV_VERSION_STR, sizeof(info->version) - 1);
463 // strncpy(info.fw_version, priv->fw_name,
464 // sizeof(info.fw_version) - 1);
466 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20))
467 if (dev->dev.parent) {
468 dev_set_name(dev->dev.parent, "%s", info->bus_info);
469 //strncpy(info->bus_info, dev->dev.parent->bus_id,
470 // sizeof(info->bus_info) - 1);
472 if (dev->class_dev.parent) {
473 sizeof(info->bus_info) - 1);
476 snprintf(info->bus_info, sizeof(info->bus_info) - 1,
478 // "PCMCIA 0x%lx", priv->hw.iobase);
482 static struct ethtool_ops wl_ethtool_ops = {
483 .get_drvinfo = wl_get_drvinfo,
484 .get_link = ethtool_op_get_link,
488 /*******************************************************************************
490 *******************************************************************************
494 * The IOCTL handler for the device.
498 * dev - a pointer to the device's net_device struct.
499 * rq - a pointer to the IOCTL request buffer.
500 * cmd - the IOCTL command code.
505 * errno value otherwise
507 ******************************************************************************/
508 int wl_ioctl( struct net_device *dev, struct ifreq *rq, int cmd )
510 struct wl_private *lp = wl_priv(dev);
513 /*------------------------------------------------------------------------*/
515 DBG_FUNC( "wl_ioctl" );
517 DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev);
518 DBG_PARAM(DbgInfo, "rq", "0x%p", rq);
519 DBG_PARAM(DbgInfo, "cmd", "0x%04x", cmd);
521 wl_lock( lp, &flags );
523 wl_act_int_off( lp );
526 if( lp->useRTS == 1 ) {
527 /* Handle any RTS IOCTL here */
528 if( cmd == WL_IOCTL_RTS ) {
529 DBG_TRACE( DbgInfo, "IOCTL: WL_IOCTL_RTS\n" );
530 ret = wvlan_rts( (struct rtsreq *)rq, dev->base_addr );
532 DBG_TRACE( DbgInfo, "IOCTL not supported in RTS mode: 0x%X\n", cmd );
536 goto out_act_int_on_unlock;
540 /* Only handle UIL IOCTL requests when the UIL has the system blocked. */
541 if( !(( lp->flags & WVLAN2_UIL_BUSY ) && ( cmd != WVLAN2_IOCTL_UIL ))) {
543 struct uilreq *urq = (struct uilreq *)rq;
547 // ================== Private IOCTLs (up to 16) ==================
549 case WVLAN2_IOCTL_UIL:
550 DBG_TRACE( DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL\n" );
551 ret = wvlan_uil( urq, lp );
556 DBG_TRACE(DbgInfo, "IOCTL CODE NOT SUPPORTED: 0x%X\n", cmd );
561 DBG_WARNING( DbgInfo, "DEVICE IS BUSY, CANNOT PROCESS REQUEST\n" );
566 out_act_int_on_unlock:
570 wl_unlock( lp, &flags );
572 DBG_LEAVE( DbgInfo );
575 /*============================================================================*/
577 #ifdef CONFIG_NET_POLL_CONTROLLER
578 void wl_poll(struct net_device *dev)
580 struct wl_private *lp = wl_priv(dev);
584 wl_lock( lp, &flags );
585 wl_isr(dev->irq, dev, ®s);
586 wl_unlock( lp, &flags );
590 /*******************************************************************************
592 *******************************************************************************
596 * The handler called when, for some reason, a Tx request is not completed.
600 * dev - a pointer to the device's net_device struct.
606 ******************************************************************************/
607 void wl_tx_timeout( struct net_device *dev )
613 struct wl_private *lp = wl_priv(dev);
614 struct net_device_stats *pStats = NULL;
615 /*------------------------------------------------------------------------*/
617 DBG_FUNC( "wl_tx_timeout" );
618 DBG_ENTER( DbgInfo );
620 DBG_WARNING( DbgInfo, "%s: Transmit timeout.\n", dev->name );
622 wl_lock( lp, &flags );
625 if( lp->useRTS == 1 ) {
626 DBG_TRACE( DbgInfo, "Skipping tx_timeout handler, in RTS mode\n" );
627 wl_unlock( lp, &flags );
629 DBG_LEAVE( DbgInfo );
634 /* Figure out which device (the "root" device or WDS port) this timeout
638 for( count = 0; count < NUM_WDS_PORTS; count++ ) {
639 if( dev == lp->wds_port[count].dev ) {
640 pStats = &( lp->wds_port[count].stats );
642 /* Break the loop so that we can use the counter to access WDS
643 information in the private structure */
650 /* If pStats is still NULL, then the device is not a WDS port */
651 if( pStats == NULL ) {
652 pStats = &( lp->stats );
655 /* Accumulate the timeout error */
658 wl_unlock( lp, &flags );
660 DBG_LEAVE( DbgInfo );
663 /*============================================================================*/
665 /*******************************************************************************
667 *******************************************************************************
671 * The routine which performs data transmits.
675 * lp - a pointer to the device's wl_private struct.
682 ******************************************************************************/
683 int wl_send( struct wl_private *lp )
688 WVLAN_LFRAME *txF = NULL;
689 struct list_head *element;
691 /*------------------------------------------------------------------------*/
693 DBG_FUNC( "wl_send" );
696 DBG_ERROR( DbgInfo, "Private adapter struct is NULL\n" );
699 if( lp->dev == NULL ) {
700 DBG_ERROR( DbgInfo, "net_device struct in wl_private is NULL\n" );
704 /* Check for the availability of FIDs; if none are available, don't take any
705 frames off the txQ */
706 if( lp->hcfCtx.IFB_RscInd == 0 ) {
710 /* Reclaim the TxQ Elements and place them back on the free queue */
711 if( !list_empty( &( lp->txQ[0] ))) {
712 element = lp->txQ[0].next;
714 txF = (WVLAN_LFRAME * )list_entry( element, WVLAN_LFRAME, node );
716 lp->txF.skb = txF->frame.skb;
717 lp->txF.port = txF->frame.port;
719 txF->frame.skb = NULL;
722 list_del( &( txF->node ));
723 list_add( element, &( lp->txFree ));
727 if( lp->txQ_count < TX_Q_LOW_WATER_MARK ) {
728 if( lp->netif_queue_on == FALSE ) {
729 DBG_TX( DbgInfo, "Kickstarting Q: %d\n", lp->txQ_count );
730 netif_wake_queue( lp->dev );
731 WL_WDS_NETIF_WAKE_QUEUE( lp );
732 lp->netif_queue_on = TRUE;
738 if( lp->txF.skb == NULL ) {
742 /* If the device has resources (FIDs) available, then Tx the packet */
743 /* Format the TxRequest and send it to the adapter */
744 len = lp->txF.skb->len < ETH_ZLEN ? ETH_ZLEN : lp->txF.skb->len;
746 desc = &( lp->desc_tx );
747 desc->buf_addr = lp->txF.skb->data;
749 desc->next_desc_addr = NULL;
751 status = hcf_send_msg( &( lp->hcfCtx ), desc, lp->txF.port );
753 if( status == HCF_SUCCESS ) {
754 lp->dev->trans_start = jiffies;
756 DBG_TX( DbgInfo, "Transmit...\n" );
758 if( lp->txF.port == HCF_PORT_0 ) {
759 lp->stats.tx_packets++;
760 lp->stats.tx_bytes += lp->txF.skb->len;
766 lp->wds_port[(( lp->txF.port >> 8 ) - 1)].stats.tx_packets++;
767 lp->wds_port[(( lp->txF.port >> 8 ) - 1)].stats.tx_bytes += lp->txF.skb->len;
772 /* Free the skb and perform queue cleanup, as the buffer was
773 transmitted successfully */
774 dev_kfree_skb( lp->txF.skb );
782 /*============================================================================*/
784 /*******************************************************************************
786 *******************************************************************************
790 * The Tx handler function for the network layer.
794 * skb - a pointer to the sk_buff structure containing the data to transfer.
795 * dev - a pointer to the device's net_device structure.
802 ******************************************************************************/
803 int wl_tx( struct sk_buff *skb, struct net_device *dev, int port )
806 struct wl_private *lp = wl_priv(dev);
807 WVLAN_LFRAME *txF = NULL;
808 struct list_head *element;
809 /*------------------------------------------------------------------------*/
813 /* Grab the spinlock */
814 wl_lock( lp, &flags );
816 if( lp->flags & WVLAN2_UIL_BUSY ) {
817 DBG_WARNING( DbgInfo, "UIL has device blocked\n" );
818 /* Start dropping packets here??? */
819 wl_unlock( lp, &flags );
824 if( lp->useRTS == 1 ) {
825 DBG_PRINT( "RTS: we're getting a Tx...\n" );
826 wl_unlock( lp, &flags );
832 /* Get an element from the queue */
833 element = lp->txFree.next;
834 txF = (WVLAN_LFRAME *)list_entry( element, WVLAN_LFRAME, node );
836 DBG_ERROR( DbgInfo, "Problem with list_entry\n" );
837 wl_unlock( lp, &flags );
840 /* Fill out the frame */
841 txF->frame.skb = skb;
842 txF->frame.port = port;
843 /* Move the frame to the txQ */
844 /* NOTE: Here's where we would do priority queueing */
845 list_del( &( txF->node ));
846 list_add( &( txF->node ), &( lp->txQ[0] ));
849 if( lp->txQ_count >= DEFAULT_NUM_TX_FRAMES ) {
850 DBG_TX( DbgInfo, "Q Full: %d\n", lp->txQ_count );
851 if( lp->netif_queue_on == TRUE ) {
852 netif_stop_queue( lp->dev );
853 WL_WDS_NETIF_STOP_QUEUE( lp );
854 lp->netif_queue_on = FALSE;
858 wl_act_int_off( lp ); /* Disable Interrupts */
860 /* Send the data to the hardware using the appropriate method */
863 wl_send_dma( lp, skb, port );
870 /* Re-enable Interrupts, release the spinlock and return */
872 wl_unlock( lp, &flags );
875 /*============================================================================*/
877 /*******************************************************************************
879 *******************************************************************************
883 * The routine which performs data reception.
887 * dev - a pointer to the device's net_device structure.
894 ******************************************************************************/
895 int wl_rx(struct net_device *dev)
899 struct wl_private *lp = wl_priv(dev);
904 /*------------------------------------------------------------------------*/
907 DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev);
909 if(!( lp->flags & WVLAN2_UIL_BUSY )) {
912 if( lp->useRTS == 1 ) {
913 DBG_PRINT( "RTS: We're getting an Rx...\n" );
918 /* Read the HFS_STAT register from the lookahead buffer */
919 hfs_stat = (hcf_16)(( lp->lookAheadBuf[HFS_STAT] ) |
920 ( lp->lookAheadBuf[HFS_STAT + 1] << 8 ));
922 /* Make sure the frame isn't bad */
923 if(( hfs_stat & HFS_STAT_ERR ) != HCF_SUCCESS ) {
924 DBG_WARNING( DbgInfo, "HFS_STAT_ERROR (0x%x) in Rx Packet\n",
925 lp->lookAheadBuf[HFS_STAT] );
929 /* Determine what port this packet is for */
930 port = ( hfs_stat >> 8 ) & 0x0007;
931 DBG_RX( DbgInfo, "Rx frame for port %d\n", port );
933 pktlen = lp->hcfCtx.IFB_RxLen;
935 skb = ALLOC_SKB(pktlen);
937 /* Set the netdev based on the port */
946 skb->dev = lp->wds_port[port-1].dev;
956 desc = &( lp->desc_rx );
958 desc->next_desc_addr = NULL;
961 #define BLOCK_INPUT(buf, len) \
962 desc->buf_addr = buf; \
963 desc->BUF_SIZE = len; \
964 status = hcf_rcv_msg(&(lp->hcfCtx), desc, 0)
967 GET_PACKET( skb->dev, skb, pktlen );
969 if( status == HCF_SUCCESS ) {
973 lp->stats.rx_packets++;
974 lp->stats.rx_bytes += pktlen;
979 lp->wds_port[port-1].stats.rx_packets++;
980 lp->wds_port[port-1].stats.rx_bytes += pktlen;
984 dev->last_rx = jiffies;
988 if( lp->spydata.spy_number > 0 ) {
989 char *srcaddr = skb->mac.raw + MAC_ADDR_SIZE;
991 wl_spy_gather( dev, srcaddr );
993 #endif /* WIRELESS_SPY */
994 #endif /* WIRELESS_EXT */
996 DBG_ERROR( DbgInfo, "Rx request to card FAILED\n" );
999 lp->stats.rx_dropped++;
1004 lp->wds_port[port-1].stats.rx_dropped++;
1006 #endif /* USE_WDS */
1008 dev_kfree_skb( skb );
1011 DBG_ERROR( DbgInfo, "Could not alloc skb\n" );
1014 lp->stats.rx_dropped++;
1019 lp->wds_port[port-1].stats.rx_dropped++;
1021 #endif /* USE_WDS */
1028 /*============================================================================*/
1030 /*******************************************************************************
1032 *******************************************************************************
1036 * Function to handle multicast packets
1040 * dev - a pointer to the device's net_device structure.
1046 ******************************************************************************/
1047 #ifdef NEW_MULTICAST
1049 void wl_multicast( struct net_device *dev )
1051 #if 1 //;? (HCF_TYPE) & HCF_TYPE_STA //;?should we return an error status in AP mode
1052 //;?seems reasonable that even an AP-only driver could afford this small additional footprint
1055 struct dev_mc_list *mclist;
1056 struct wl_private *lp = wl_priv(dev);
1057 unsigned long flags;
1058 /*------------------------------------------------------------------------*/
1060 DBG_FUNC( "wl_multicast" );
1061 DBG_ENTER( DbgInfo );
1062 DBG_PARAM( DbgInfo, "dev", "%s (0x%p)", dev->name, dev );
1064 if( !wl_adapter_is_open( dev )) {
1065 DBG_LEAVE( DbgInfo );
1070 if( DBG_FLAGS( DbgInfo ) & DBG_PARAM_ON ) {
1071 DBG_PRINT(" flags: %s%s%s\n",
1072 ( dev->flags & IFF_PROMISC ) ? "Promiscous " : "",
1073 ( dev->flags & IFF_MULTICAST ) ? "Multicast " : "",
1074 ( dev->flags & IFF_ALLMULTI ) ? "All-Multicast" : "" );
1076 DBG_PRINT( " mc_count: %d\n", netdev_mc_count(dev));
1078 netdev_for_each_mc_addr(mclist, dev)
1079 DBG_PRINT( " %s (%d)\n", DbgHwAddr(mclist->dmi_addr),
1080 mclist->dmi_addrlen );
1084 if(!( lp->flags & WVLAN2_UIL_BUSY )) {
1087 if( lp->useRTS == 1 ) {
1088 DBG_TRACE( DbgInfo, "Skipping multicast, in RTS mode\n" );
1090 DBG_LEAVE( DbgInfo );
1093 #endif /* USE_RTS */
1095 wl_lock( lp, &flags );
1096 wl_act_int_off( lp );
1098 if ( CNV_INT_TO_LITTLE( lp->hcfCtx.IFB_FWIdentity.comp_id ) == COMP_ID_FW_STA ) {
1099 if( dev->flags & IFF_PROMISC ) {
1100 /* Enable promiscuous mode */
1101 lp->ltvRecord.len = 2;
1102 lp->ltvRecord.typ = CFG_PROMISCUOUS_MODE;
1103 lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 1 );
1104 DBG_PRINT( "Enabling Promiscuous mode (IFF_PROMISC)\n" );
1105 hcf_put_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord ));
1107 else if ((netdev_mc_count(dev) > HCF_MAX_MULTICAST) ||
1108 ( dev->flags & IFF_ALLMULTI )) {
1109 /* Shutting off this filter will enable all multicast frames to
1110 be sent up from the device; however, this is a static RID, so
1111 a call to wl_apply() is needed */
1112 lp->ltvRecord.len = 2;
1113 lp->ltvRecord.typ = CFG_CNF_RX_ALL_GROUP_ADDR;
1114 lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0 );
1115 DBG_PRINT( "Enabling all multicast mode (IFF_ALLMULTI)\n" );
1116 hcf_put_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord ));
1119 else if (!netdev_mc_empty(dev)) {
1120 /* Set the multicast addresses */
1121 lp->ltvRecord.len = ( netdev_mc_count(dev) * 3 ) + 1;
1122 lp->ltvRecord.typ = CFG_GROUP_ADDR;
1125 netdev_for_each_mc_addr(mclist, dev)
1126 memcpy(&(lp->ltvRecord.u.u8[x++ * ETH_ALEN]),
1127 mclist->dmi_addr, ETH_ALEN);
1128 DBG_PRINT( "Setting multicast list\n" );
1129 hcf_put_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord ));
1131 /* Disable promiscuous mode */
1132 lp->ltvRecord.len = 2;
1133 lp->ltvRecord.typ = CFG_PROMISCUOUS_MODE;
1134 lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 0 );
1135 DBG_PRINT( "Disabling Promiscuous mode\n" );
1136 hcf_put_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord ));
1138 /* Disable multicast mode */
1139 lp->ltvRecord.len = 2;
1140 lp->ltvRecord.typ = CFG_GROUP_ADDR;
1141 DBG_PRINT( "Disabling Multicast mode\n" );
1142 hcf_put_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord ));
1144 /* Turning on this filter will prevent all multicast frames from
1145 being sent up from the device; however, this is a static RID,
1146 so a call to wl_apply() is needed */
1147 lp->ltvRecord.len = 2;
1148 lp->ltvRecord.typ = CFG_CNF_RX_ALL_GROUP_ADDR;
1149 lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE( 1 );
1150 DBG_PRINT( "Disabling all multicast mode (IFF_ALLMULTI)\n" );
1151 hcf_put_info( &( lp->hcfCtx ), (LTVP)&( lp->ltvRecord ));
1155 wl_act_int_on( lp );
1156 wl_unlock( lp, &flags );
1158 DBG_LEAVE( DbgInfo );
1159 #endif /* HCF_STA */
1161 /*============================================================================*/
1163 #else /* NEW_MULTICAST */
1165 void wl_multicast( struct net_device *dev, int num_addrs, void *addrs )
1167 DBG_FUNC( "wl_multicast");
1170 DBG_PARAM( DbgInfo, "dev", "%s (0x%p)", dev->name, dev );
1171 DBG_PARAM( DbgInfo, "num_addrs", "%d", num_addrs );
1172 DBG_PARAM( DbgInfo, "addrs", "0x%p", addrs );
1174 #error Obsolete set multicast interface!
1176 DBG_LEAVE( DbgInfo );
1178 /*============================================================================*/
1180 #endif /* NEW_MULTICAST */
1182 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30))
1183 static const struct net_device_ops wl_netdev_ops =
1185 .ndo_start_xmit = &wl_tx_port0,
1187 .ndo_set_config = &wl_config,
1188 .ndo_get_stats = &wl_stats,
1189 .ndo_set_multicast_list = &wl_multicast,
1191 .ndo_init = &wl_insert,
1192 .ndo_open = &wl_adapter_open,
1193 .ndo_stop = &wl_adapter_close,
1194 .ndo_do_ioctl = &wl_ioctl,
1196 .ndo_tx_timeout = &wl_tx_timeout,
1198 #ifdef CONFIG_NET_POLL_CONTROLLER
1199 .ndo_poll_controller = wl_poll,
1202 #endif // (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30))
1204 /*******************************************************************************
1206 *******************************************************************************
1210 * Create instances of net_device and wl_private for the new adapter
1211 * and register the device's entry points in the net_device structure.
1219 * a pointer to an allocated and initialized net_device struct for this
1222 ******************************************************************************/
1223 struct net_device * wl_device_alloc( void )
1225 struct net_device *dev = NULL;
1226 struct wl_private *lp = NULL;
1227 /*------------------------------------------------------------------------*/
1229 DBG_FUNC( "wl_device_alloc" );
1230 DBG_ENTER( DbgInfo );
1232 /* Alloc a net_device struct */
1233 dev = alloc_etherdev(sizeof(struct wl_private));
1237 /* Initialize the 'next' pointer in the struct. Currently only used for PCI,
1238 but do it here just in case it's used for other buses in the future */
1243 if( dev->mtu > MTU_MAX )
1245 DBG_WARNING( DbgInfo, "%s: MTU set too high, limiting to %d.\n",
1246 dev->name, MTU_MAX );
1250 /* Setup the function table in the device structure. */
1252 dev->wireless_handlers = (struct iw_handler_def *)&wl_iw_handler_def;
1253 lp->wireless_data.spy_data = &lp->spy_data;
1254 dev->wireless_data = &lp->wireless_data;
1256 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30))
1257 dev->netdev_ops = &wl_netdev_ops;
1259 dev->hard_start_xmit = &wl_tx_port0;
1261 dev->set_config = &wl_config;
1262 dev->get_stats = &wl_stats;
1263 dev->set_multicast_list = &wl_multicast;
1265 dev->init = &wl_insert;
1266 dev->open = &wl_adapter_open;
1267 dev->stop = &wl_adapter_close;
1268 dev->do_ioctl = &wl_ioctl;
1270 dev->tx_timeout = &wl_tx_timeout;
1272 #ifdef CONFIG_NET_POLL_CONTROLLER
1273 dev->poll_controller = wl_poll;
1276 #endif // (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30))
1278 dev->watchdog_timeo = TX_TIMEOUT;
1280 dev->ethtool_ops = &wl_ethtool_ops;
1282 netif_stop_queue( dev );
1284 /* Allocate virutal devices for WDS support if needed */
1285 WL_WDS_DEVICE_ALLOC( lp );
1287 DBG_LEAVE( DbgInfo );
1289 } // wl_device_alloc
1290 /*============================================================================*/
1292 /*******************************************************************************
1293 * wl_device_dealloc()
1294 *******************************************************************************
1298 * Free instances of net_device and wl_private strcutres for an adapter
1299 * and perform basic cleanup.
1303 * dev - a pointer to the device's net_device structure.
1309 ******************************************************************************/
1310 void wl_device_dealloc( struct net_device *dev )
1312 // struct wl_private *lp = wl_priv(dev);
1313 /*------------------------------------------------------------------------*/
1315 DBG_FUNC( "wl_device_dealloc" );
1316 DBG_ENTER( DbgInfo );
1318 /* Dealloc the WDS ports */
1319 WL_WDS_DEVICE_DEALLOC( lp );
1323 DBG_LEAVE( DbgInfo );
1325 } // wl_device_dealloc
1326 /*============================================================================*/
1328 /*******************************************************************************
1330 *******************************************************************************
1334 * The handler routine for Tx over HCF_PORT_0.
1338 * skb - a pointer to the sk_buff to transmit.
1339 * dev - a pointer to a net_device structure representing HCF_PORT_0.
1345 ******************************************************************************/
1346 int wl_tx_port0( struct sk_buff *skb, struct net_device *dev )
1348 DBG_TX( DbgInfo, "Tx on Port 0\n" );
1350 return wl_tx( skb, dev, HCF_PORT_0 );
1352 return wl_tx_dma( skb, dev, HCF_PORT_0 );
1355 /*============================================================================*/
1359 /*******************************************************************************
1361 *******************************************************************************
1365 * The handler routine for Tx over HCF_PORT_1.
1369 * skb - a pointer to the sk_buff to transmit.
1370 * dev - a pointer to a net_device structure representing HCF_PORT_1.
1376 ******************************************************************************/
1377 int wl_tx_port1( struct sk_buff *skb, struct net_device *dev )
1379 DBG_TX( DbgInfo, "Tx on Port 1\n" );
1380 return wl_tx( skb, dev, HCF_PORT_1 );
1382 /*============================================================================*/
1384 /*******************************************************************************
1386 *******************************************************************************
1390 * The handler routine for Tx over HCF_PORT_2.
1394 * skb - a pointer to the sk_buff to transmit.
1395 * dev - a pointer to a net_device structure representing HCF_PORT_2.
1401 ******************************************************************************/
1402 int wl_tx_port2( struct sk_buff *skb, struct net_device *dev )
1404 DBG_TX( DbgInfo, "Tx on Port 2\n" );
1405 return wl_tx( skb, dev, HCF_PORT_2 );
1407 /*============================================================================*/
1409 /*******************************************************************************
1411 *******************************************************************************
1415 * The handler routine for Tx over HCF_PORT_3.
1419 * skb - a pointer to the sk_buff to transmit.
1420 * dev - a pointer to a net_device structure representing HCF_PORT_3.
1426 ******************************************************************************/
1427 int wl_tx_port3( struct sk_buff *skb, struct net_device *dev )
1429 DBG_TX( DbgInfo, "Tx on Port 3\n" );
1430 return wl_tx( skb, dev, HCF_PORT_3 );
1432 /*============================================================================*/
1434 /*******************************************************************************
1436 *******************************************************************************
1440 * The handler routine for Tx over HCF_PORT_4.
1444 * skb - a pointer to the sk_buff to transmit.
1445 * dev - a pointer to a net_device structure representing HCF_PORT_4.
1451 ******************************************************************************/
1452 int wl_tx_port4( struct sk_buff *skb, struct net_device *dev )
1454 DBG_TX( DbgInfo, "Tx on Port 4\n" );
1455 return wl_tx( skb, dev, HCF_PORT_4 );
1457 /*============================================================================*/
1459 /*******************************************************************************
1461 *******************************************************************************
1465 * The handler routine for Tx over HCF_PORT_5.
1469 * skb - a pointer to the sk_buff to transmit.
1470 * dev - a pointer to a net_device structure representing HCF_PORT_5.
1476 ******************************************************************************/
1477 int wl_tx_port5( struct sk_buff *skb, struct net_device *dev )
1479 DBG_TX( DbgInfo, "Tx on Port 5\n" );
1480 return wl_tx( skb, dev, HCF_PORT_5 );
1482 /*============================================================================*/
1484 /*******************************************************************************
1486 *******************************************************************************
1490 * The handler routine for Tx over HCF_PORT_6.
1494 * skb - a pointer to the sk_buff to transmit.
1495 * dev - a pointer to a net_device structure representing HCF_PORT_6.
1501 ******************************************************************************/
1502 int wl_tx_port6( struct sk_buff *skb, struct net_device *dev )
1504 DBG_TX( DbgInfo, "Tx on Port 6\n" );
1505 return wl_tx( skb, dev, HCF_PORT_6 );
1507 /*============================================================================*/
1509 /*******************************************************************************
1510 * wl_wds_device_alloc()
1511 *******************************************************************************
1515 * Create instances of net_device to represent the WDS ports, and register
1516 * the device's entry points in the net_device structure.
1520 * lp - a pointer to the device's private adapter structure
1524 * N/A, but will place pointers to the allocated and initialized net_device
1525 * structs in the private adapter structure.
1527 ******************************************************************************/
1528 void wl_wds_device_alloc( struct wl_private *lp )
1531 /*------------------------------------------------------------------------*/
1533 DBG_FUNC( "wl_wds_device_alloc" );
1534 DBG_ENTER( DbgInfo );
1536 /* WDS support requires additional net_device structs to be allocated,
1537 so that user space apps can use these virtual devices to specify the
1538 port on which to Tx/Rx */
1539 for( count = 0; count < NUM_WDS_PORTS; count++ ) {
1540 struct net_device *dev_wds = NULL;
1542 dev_wds = kmalloc( sizeof( struct net_device ), GFP_KERNEL );
1543 memset( dev_wds, 0, sizeof( struct net_device ));
1545 ether_setup( dev_wds );
1547 lp->wds_port[count].dev = dev_wds;
1549 /* Re-use wl_init for all the devices, as it currently does nothing, but
1550 is required. Re-use the stats/tx_timeout handler for all as well; the
1551 WDS port which is requesting these operations can be determined by
1552 the net_device pointer. Set the private member of all devices to point
1553 to the same net_device struct; that way, all information gets
1554 funnelled through the one "real" net_device. Name the WDS ports
1556 lp->wds_port[count].dev->init = &wl_init;
1557 lp->wds_port[count].dev->get_stats = &wl_stats;
1558 lp->wds_port[count].dev->tx_timeout = &wl_tx_timeout;
1559 lp->wds_port[count].dev->watchdog_timeo = TX_TIMEOUT;
1560 lp->wds_port[count].dev->priv = lp;
1562 sprintf( lp->wds_port[count].dev->name, "wds%d", count );
1565 /* Register the Tx handlers */
1566 lp->wds_port[0].dev->hard_start_xmit = &wl_tx_port1;
1567 lp->wds_port[1].dev->hard_start_xmit = &wl_tx_port2;
1568 lp->wds_port[2].dev->hard_start_xmit = &wl_tx_port3;
1569 lp->wds_port[3].dev->hard_start_xmit = &wl_tx_port4;
1570 lp->wds_port[4].dev->hard_start_xmit = &wl_tx_port5;
1571 lp->wds_port[5].dev->hard_start_xmit = &wl_tx_port6;
1573 WL_WDS_NETIF_STOP_QUEUE( lp );
1575 DBG_LEAVE( DbgInfo );
1577 } // wl_wds_device_alloc
1578 /*============================================================================*/
1580 /*******************************************************************************
1581 * wl_wds_device_dealloc()
1582 *******************************************************************************
1586 * Free instances of net_device structures used to support WDS.
1590 * lp - a pointer to the device's private adapter structure
1596 ******************************************************************************/
1597 void wl_wds_device_dealloc( struct wl_private *lp )
1600 /*------------------------------------------------------------------------*/
1602 DBG_FUNC( "wl_wds_device_dealloc" );
1603 DBG_ENTER( DbgInfo );
1605 for( count = 0; count < NUM_WDS_PORTS; count++ ) {
1606 struct net_device *dev_wds = NULL;
1608 dev_wds = lp->wds_port[count].dev;
1610 if( dev_wds != NULL ) {
1611 if( dev_wds->flags & IFF_UP ) {
1612 dev_close( dev_wds );
1613 dev_wds->flags &= ~( IFF_UP | IFF_RUNNING );
1617 lp->wds_port[count].dev = NULL;
1621 DBG_LEAVE( DbgInfo );
1623 } // wl_wds_device_dealloc
1624 /*============================================================================*/
1626 /*******************************************************************************
1627 * wl_wds_netif_start_queue()
1628 *******************************************************************************
1632 * Used to start the netif queues of all the "virtual" network devices
1633 * which repesent the WDS ports.
1637 * lp - a pointer to the device's private adapter structure
1643 ******************************************************************************/
1644 void wl_wds_netif_start_queue( struct wl_private *lp )
1647 /*------------------------------------------------------------------------*/
1650 for( count = 0; count < NUM_WDS_PORTS; count++ ) {
1651 if( lp->wds_port[count].is_registered &&
1652 lp->wds_port[count].netif_queue_on == FALSE ) {
1653 netif_start_queue( lp->wds_port[count].dev );
1654 lp->wds_port[count].netif_queue_on = TRUE;
1660 } // wl_wds_netif_start_queue
1661 /*============================================================================*/
1663 /*******************************************************************************
1664 * wl_wds_netif_stop_queue()
1665 *******************************************************************************
1669 * Used to stop the netif queues of all the "virtual" network devices
1670 * which repesent the WDS ports.
1674 * lp - a pointer to the device's private adapter structure
1680 ******************************************************************************/
1681 void wl_wds_netif_stop_queue( struct wl_private *lp )
1684 /*------------------------------------------------------------------------*/
1687 for( count = 0; count < NUM_WDS_PORTS; count++ ) {
1688 if( lp->wds_port[count].is_registered &&
1689 lp->wds_port[count].netif_queue_on == TRUE ) {
1690 netif_stop_queue( lp->wds_port[count].dev );
1691 lp->wds_port[count].netif_queue_on = FALSE;
1697 } // wl_wds_netif_stop_queue
1698 /*============================================================================*/
1700 /*******************************************************************************
1701 * wl_wds_netif_wake_queue()
1702 *******************************************************************************
1706 * Used to wake the netif queues of all the "virtual" network devices
1707 * which repesent the WDS ports.
1711 * lp - a pointer to the device's private adapter structure
1717 ******************************************************************************/
1718 void wl_wds_netif_wake_queue( struct wl_private *lp )
1721 /*------------------------------------------------------------------------*/
1724 for( count = 0; count < NUM_WDS_PORTS; count++ ) {
1725 if( lp->wds_port[count].is_registered &&
1726 lp->wds_port[count].netif_queue_on == FALSE ) {
1727 netif_wake_queue( lp->wds_port[count].dev );
1728 lp->wds_port[count].netif_queue_on = TRUE;
1734 } // wl_wds_netif_wake_queue
1735 /*============================================================================*/
1737 /*******************************************************************************
1738 * wl_wds_netif_carrier_on()
1739 *******************************************************************************
1743 * Used to signal the network layer that carrier is present on all of the
1744 * "virtual" network devices which repesent the WDS ports.
1748 * lp - a pointer to the device's private adapter structure
1754 ******************************************************************************/
1755 void wl_wds_netif_carrier_on( struct wl_private *lp )
1758 /*------------------------------------------------------------------------*/
1761 for( count = 0; count < NUM_WDS_PORTS; count++ ) {
1762 if( lp->wds_port[count].is_registered ) {
1763 netif_carrier_on( lp->wds_port[count].dev );
1769 } // wl_wds_netif_carrier_on
1770 /*============================================================================*/
1772 /*******************************************************************************
1773 * wl_wds_netif_carrier_off()
1774 *******************************************************************************
1778 * Used to signal the network layer that carrier is NOT present on all of
1779 * the "virtual" network devices which repesent the WDS ports.
1783 * lp - a pointer to the device's private adapter structure
1789 ******************************************************************************/
1790 void wl_wds_netif_carrier_off( struct wl_private *lp )
1793 /*------------------------------------------------------------------------*/
1796 for( count = 0; count < NUM_WDS_PORTS; count++ ) {
1797 if( lp->wds_port[count].is_registered ) {
1798 netif_carrier_off( lp->wds_port[count].dev );
1804 } // wl_wds_netif_carrier_off
1805 /*============================================================================*/
1807 #endif /* USE_WDS */
1810 /*******************************************************************************
1812 *******************************************************************************
1816 * The routine which performs data transmits when using busmaster DMA.
1820 * lp - a pointer to the device's wl_private struct.
1821 * skb - a pointer to the network layer's data buffer.
1822 * port - the Hermes port on which to transmit.
1829 ******************************************************************************/
1830 int wl_send_dma( struct wl_private *lp, struct sk_buff *skb, int port )
1833 DESC_STRCT *desc = NULL;
1834 DESC_STRCT *desc_next = NULL;
1835 /*------------------------------------------------------------------------*/
1837 DBG_FUNC( "wl_send_dma" );
1841 DBG_ERROR( DbgInfo, "Private adapter struct is NULL\n" );
1845 if( lp->dev == NULL )
1847 DBG_ERROR( DbgInfo, "net_device struct in wl_private is NULL\n" );
1851 /* AGAIN, ALL THE QUEUEING DONE HERE IN I/O MODE IS NOT PERFORMED */
1855 DBG_WARNING (DbgInfo, "Nothing to send.\n");
1861 /* Get a free descriptor */
1862 desc = wl_pci_dma_get_tx_packet( lp );
1866 if( lp->netif_queue_on == TRUE ) {
1867 netif_stop_queue( lp->dev );
1868 WL_WDS_NETIF_STOP_QUEUE( lp );
1869 lp->netif_queue_on = FALSE;
1871 dev_kfree_skb( skb );
1876 SET_BUF_CNT( desc, /*HCF_DMA_FD_CNT*/HFS_ADDR_DEST );
1877 SET_BUF_SIZE( desc, HCF_DMA_TX_BUF1_SIZE );
1879 desc_next = desc->next_desc_addr;
1881 if( desc_next->buf_addr == NULL )
1883 DBG_ERROR( DbgInfo, "DMA descriptor buf_addr is NULL\n" );
1887 /* Copy the payload into the DMA packet */
1888 memcpy( desc_next->buf_addr, skb->data, len );
1890 SET_BUF_CNT( desc_next, len );
1891 SET_BUF_SIZE( desc_next, HCF_MAX_PACKET_SIZE );
1893 hcf_dma_tx_put( &( lp->hcfCtx ), desc, 0 );
1895 /* Free the skb and perform queue cleanup, as the buffer was
1896 transmitted successfully */
1897 dev_kfree_skb( skb );
1901 /*============================================================================*/
1903 /*******************************************************************************
1905 *******************************************************************************
1909 * The routine which performs data reception when using busmaster DMA.
1913 * dev - a pointer to the device's net_device structure.
1920 ******************************************************************************/
1921 int wl_rx_dma( struct net_device *dev )
1926 struct sk_buff *skb;
1927 struct wl_private *lp = NULL;
1928 DESC_STRCT *desc, *desc_next;
1929 //CFG_MB_INFO_RANGE2_STRCT x;
1930 /*------------------------------------------------------------------------*/
1933 DBG_PARAM(DbgInfo, "dev", "%s (0x%p)", dev->name, dev);
1935 if((( lp = (struct wl_private *)dev->priv ) != NULL ) &&
1936 !( lp->flags & WVLAN2_UIL_BUSY )) {
1939 if( lp->useRTS == 1 ) {
1940 DBG_PRINT( "RTS: We're getting an Rx...\n" );
1943 #endif /* USE_RTS */
1945 //if( lp->dma.status == 0 )
1947 desc = hcf_dma_rx_get( &( lp->hcfCtx ));
1951 /* Check and see if we rcvd. a WMP frame */
1953 if((( *(hcf_8 *)&desc->buf_addr[HFS_STAT] ) &
1954 ( HFS_STAT_MSG_TYPE | HFS_STAT_ERR )) == HFS_STAT_WMP_MSG )
1956 DBG_TRACE( DbgInfo, "Got a WMP frame\n" );
1958 x.len = sizeof( CFG_MB_INFO_RANGE2_STRCT ) / sizeof( hcf_16 );
1959 x.typ = CFG_MB_INFO;
1960 x.base_typ = CFG_WMP;
1962 x.frag_buf[0].frag_len = GET_BUF_CNT( descp ) / sizeof( hcf_16 );
1963 x.frag_buf[0].frag_addr = (hcf_8 *) descp->buf_addr ;
1964 x.frag_buf[1].frag_len = ( GET_BUF_CNT( descp->next_desc_addr ) + 1 ) / sizeof( hcf_16 );
1965 x.frag_buf[1].frag_addr = (hcf_8 *) descp->next_desc_addr->buf_addr ;
1967 hcf_put_info( &( lp->hcfCtx ), (LTVP)&x );
1971 desc_next = desc->next_desc_addr;
1973 /* Make sure the buffer isn't empty */
1974 if( GET_BUF_CNT( desc ) == 0 ) {
1975 DBG_WARNING( DbgInfo, "Buffer is empty!\n" );
1977 /* Give the descriptor back to the HCF */
1978 hcf_dma_rx_put( &( lp->hcfCtx ), desc );
1982 /* Read the HFS_STAT register from the lookahead buffer */
1983 hfs_stat = (hcf_16)( desc->buf_addr[HFS_STAT/2] );
1985 /* Make sure the frame isn't bad */
1986 if(( hfs_stat & HFS_STAT_ERR ) != HCF_SUCCESS )
1988 DBG_WARNING( DbgInfo, "HFS_STAT_ERROR (0x%x) in Rx Packet\n",
1989 desc->buf_addr[HFS_STAT/2] );
1991 /* Give the descriptor back to the HCF */
1992 hcf_dma_rx_put( &( lp->hcfCtx ), desc );
1996 /* Determine what port this packet is for */
1997 port = ( hfs_stat >> 8 ) & 0x0007;
1998 DBG_RX( DbgInfo, "Rx frame for port %d\n", port );
2000 pktlen = GET_BUF_CNT(desc_next);
2002 skb = ALLOC_SKB(pktlen);
2012 skb->dev = lp->wds_port[port-1].dev;
2014 #endif /* USE_WDS */
2022 GET_PACKET_DMA( skb->dev, skb, pktlen );
2024 /* Give the descriptor back to the HCF */
2025 hcf_dma_rx_put( &( lp->hcfCtx ), desc );
2030 lp->stats.rx_packets++;
2031 lp->stats.rx_bytes += pktlen;
2036 lp->wds_port[port-1].stats.rx_packets++;
2037 lp->wds_port[port-1].stats.rx_bytes += pktlen;
2039 #endif /* USE_WDS */
2041 dev->last_rx = jiffies;
2044 DBG_ERROR( DbgInfo, "Could not alloc skb\n" );
2048 lp->stats.rx_dropped++;
2053 lp->wds_port[port-1].stats.rx_dropped++;
2055 #endif /* USE_WDS */
2064 /*============================================================================*/
2065 #endif // ENABLE_DMA