168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * Agere Systems Inc.
368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * Wireless device driver for Linux (wlags49).
468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * Copyright (c) 1998-2003 Agere Systems Inc.
668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * All rights reserved.
768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *   http://www.agere.com
868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * Initially developed by TriplePoint, Inc.
1068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *   http://www.triplepoint.com
1168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
1268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *------------------------------------------------------------------------------
1368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
1468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *   This file contains processing and initialization specific to PCI/miniPCI
1568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *   devices.
1668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
1768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *------------------------------------------------------------------------------
1868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
1968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * SOFTWARE LICENSE
2068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
2168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * This software is provided subject to the following terms and conditions,
2268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * which you should read carefully before using the software.  Using this
2368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * software indicates your acceptance of these terms and conditions.  If you do
2468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * not agree with these terms and conditions, do not use the software.
2568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
26d36b691077dc59c74efec0d54ed21b86f7a2a21aAl Viro * Copyright © 2003 Agere Systems Inc.
2768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * All rights reserved.
2868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
2968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * Redistribution and use in source or binary forms, with or without
3068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * modifications, are permitted provided that the following conditions are met:
3168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
3268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * . Redistributions of source code must retain the above copyright notice, this
3368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *    list of conditions and the following Disclaimer as comments in the code as
3468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *    well as in the documentation and/or other materials provided with the
3568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *    distribution.
3668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
3768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * . Redistributions in binary form must reproduce the above copyright notice,
3868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *    this list of conditions and the following Disclaimer in the documentation
3968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *    and/or other materials provided with the distribution.
4068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
4168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * . Neither the name of Agere Systems Inc. nor the names of the contributors
4268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *    may be used to endorse or promote products derived from this software
4368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *    without specific prior written permission.
4468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
4568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * Disclaimer
4668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
47d36b691077dc59c74efec0d54ed21b86f7a2a21aAl Viro * THIS SOFTWARE IS PROVIDED AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES,
4868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF
4968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  ANY
5068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN
5168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY
5268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
5368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
5468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
5568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT
5668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
5768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
5868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * DAMAGE.
5968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
6068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
6168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
6268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
6368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * include files
6468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
6568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <wireless/wl_version.h>
6668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
6768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/module.h>
6868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/kernel.h>
6968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/errno.h>
7068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/pci.h>
7168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/init.h>
7268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/sched.h>
7368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/ptrace.h>
7468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/ctype.h>
7568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/string.h>
7668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//#include <linux/timer.h>
7768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/interrupt.h>
7868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/in.h>
7968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/delay.h>
8068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <asm/system.h>
8168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <asm/io.h>
8268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <asm/irq.h>
8368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <asm/bitops.h>
8468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <asm/uaccess.h>
8568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
8668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/ethtool.h>
8768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/netdevice.h>
8868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/etherdevice.h>
8968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/skbuff.h>
9068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/if_arp.h>
9168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <linux/ioport.h>
9268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
9368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <hcf/debug.h>
9468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
9568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <hcf.h>
9668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <dhf.h>
9768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <hcfdef.h>
9868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
9968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <wireless/wl_if.h>
10068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <wireless/wl_internal.h>
10168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <wireless/wl_util.h>
10268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <wireless/wl_main.h>
10368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <wireless/wl_netdev.h>
10468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#include <wireless/wl_pci.h>
10568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
10668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
10768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
10868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * global variables
10968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
11068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#if DBG
11168c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootextern dbg_info_t *DbgInfo;
11268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#endif  // DBG
11368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
11468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/* define the PCI device Table Cardname and id tables */
11568c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootstatic struct pci_device_id wl_pci_tbl[] __devinitdata = {
1165fef30b28295890bb5d16f41ab32886f6f3c99eePeter Huewe	{ PCI_DEVICE(PCI_VENDOR_ID_WL_LKM, PCI_DEVICE_ID_WL_LKM_0), },
1175fef30b28295890bb5d16f41ab32886f6f3c99eePeter Huewe	{ PCI_DEVICE(PCI_VENDOR_ID_WL_LKM, PCI_DEVICE_ID_WL_LKM_1), },
1185fef30b28295890bb5d16f41ab32886f6f3c99eePeter Huewe	{ PCI_DEVICE(PCI_VENDOR_ID_WL_LKM, PCI_DEVICE_ID_WL_LKM_2), },
119100ca122870844d6c001d5d0532b885c707b6ea9Javier Martinez Canillas
12068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	{ }			/* Terminating entry */
12168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot};
12268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
12368c0bdff7ac903421f224e080499c51cd5287f97Henk de GrootMODULE_DEVICE_TABLE(pci, wl_pci_tbl);
12468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
12568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
12668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * function prototypes
12768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
12868c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint __devinit wl_pci_probe( struct pci_dev *pdev,
12968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                const struct pci_device_id *ent );
13068c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootvoid __devexit wl_pci_remove(struct pci_dev *pdev);
13168c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_setup( struct pci_dev *pdev );
13268c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootvoid wl_pci_enable_cardbus_interrupts( struct pci_dev *pdev );
13368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
13468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#ifdef ENABLE_DMA
13568c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc( struct pci_dev *pdev, struct wl_private *lp );
13668c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free( struct pci_dev *pdev, struct wl_private *lp );
13768c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc_tx_packet( struct pci_dev *pdev, struct wl_private *lp,
13868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                DESC_STRCT **desc );
13968c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free_tx_packet( struct pci_dev *pdev, struct wl_private *lp,
14068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                DESC_STRCT **desc );
14168c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc_rx_packet( struct pci_dev *pdev, struct wl_private *lp,
14268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                DESC_STRCT **desc );
14368c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free_rx_packet( struct pci_dev *pdev, struct wl_private *lp,
14468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                DESC_STRCT **desc );
14568c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc_desc_and_buf( struct pci_dev *pdev, struct wl_private *lp,
14668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                   DESC_STRCT **desc, int size );
14768c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free_desc_and_buf( struct pci_dev *pdev, struct wl_private *lp,
14868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                   DESC_STRCT **desc );
14968c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc_desc( struct pci_dev *pdev, struct wl_private *lp,
15068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                           DESC_STRCT **desc );
15168c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free_desc( struct pci_dev *pdev, struct wl_private *lp,
15268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                           DESC_STRCT **desc );
15368c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc_buf( struct pci_dev *pdev, struct wl_private *lp,
15468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                          DESC_STRCT *desc, int size );
15568c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free_buf( struct pci_dev *pdev, struct wl_private *lp,
15668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                          DESC_STRCT *desc );
15768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
15868c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootvoid wl_pci_dma_hcf_reclaim_rx( struct wl_private *lp );
15968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#endif  // ENABLE_DMA
16068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
16168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
16268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot * PCI module function registration
16368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
16468c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootstatic struct pci_driver wl_driver =
16568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
16668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	name:		MODULE_NAME,
16768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    id_table:	wl_pci_tbl,
16868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	probe:		wl_pci_probe,
16968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	remove:		__devexit_p(wl_pci_remove),
17068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    suspend:    NULL,
17168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    resume:     NULL,
17268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot};
17368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
17468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
17568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_adapter_init_module()
17668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
17768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
17868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
17968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
18068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Called by init_module() to perform PCI-specific driver initialization.
18168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
18268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
18368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
18468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      N/A
18568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
18668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
18768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
18868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0
18968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
19068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
19168c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_adapter_init_module( void )
19268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
19368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int result;
19468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
19568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
19668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_adapter_init_module()" );
19768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
19868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_TRACE( DbgInfo, "wl_adapter_init_module() -- PCI\n" );
19968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
20068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    result = pci_register_driver( &wl_driver ); //;?replace with pci_module_init, Rubini pg 490
20168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	//;? why not do something with the result
20268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
20368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
20468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return 0;
20568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_adapter_init_module
20668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
20768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
20868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
20968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_adapter_cleanup_module()
21068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
21168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
21268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
21368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
21468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Called by cleanup_module() to perform PCI-specific driver cleanup.
21568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
21668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
21768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
21868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      N/A
21968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
22068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
22168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
22268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      N/A
22368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
22468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
22568c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootvoid wl_adapter_cleanup_module( void )
22668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
22768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	//;?how comes wl_adapter_cleanup_module is located in a seemingly pci specific module
22868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_adapter_cleanup_module" );
22968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
23068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
23168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	//;?DBG_TRACE below feels like nearly redundant in the light of DBG_ENTER above
23268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_TRACE( DbgInfo, "wl_adapter_cleanup_module() -- PCI\n" );
23368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
23468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    pci_unregister_driver( &wl_driver );
23568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
23668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
23768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return;
23868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_adapter_cleanup_module
23968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
24068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
24168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
24268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_adapter_insert()
24368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
24468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
24568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
24668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
24768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Called by wl_pci_probe() to continue the process of device insertion.
24868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
24968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
25068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
25168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      dev - a pointer to the device's net_device structure
25268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
25368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
25468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
25568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      TRUE or FALSE
25668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
25768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
25868c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_adapter_insert( struct net_device *dev )
25968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
26068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int result = FALSE;
26168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
26268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
26368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_adapter_insert" );
26468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
26568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
26668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_TRACE( DbgInfo, "wl_adapter_insert() -- PCI\n" );
26768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
26868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( dev == NULL ) {
26968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_ERROR( DbgInfo, "net_device pointer is NULL!!!\n" );
27068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    } else if( dev->priv == NULL ) {
27168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_ERROR( DbgInfo, "wl_private pointer is NULL!!!\n" );
27268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    } else if( wl_insert( dev ) ) { /* Perform remaining device initialization */
27368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot		result = TRUE;
27468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	} else {
27568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_TRACE( DbgInfo, "wl_insert() FAILED\n" );
27668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
27768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
27868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return result;
27968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_adapter_insert
28068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
28168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
28268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
28368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_adapter_open()
28468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
28568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
28668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
28768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
28868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Open the device.
28968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
29068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
29168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
29268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      dev - a pointer to the device's net_device structure
29368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
29468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
29568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
29668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      an HCF status code
29768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
29868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
29968c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_adapter_open( struct net_device *dev )
30068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
30168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int         result = 0;
30268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int         hcf_status = HCF_SUCCESS;
30368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
30468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
30568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_adapter_open" );
30668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
30768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
30868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_TRACE( DbgInfo, "wl_adapter_open() -- PCI\n" );
30968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
31068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    hcf_status = wl_open( dev );
31168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
31268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( hcf_status != HCF_SUCCESS ) {
31368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        result = -ENODEV;
31468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
31568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
31668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
31768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return result;
31868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_adapter_open
31968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
32068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
32168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
32268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_adapter_close()
32368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
32468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
32568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
32668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
32768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Close the device
32868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
32968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
33068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
33168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      dev - a pointer to the device's net_device structure
33268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
33368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
33468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
33568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0
33668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
33768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
33868c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_adapter_close( struct net_device *dev )
33968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
34068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_adapter_close" );
34168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
34268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
34368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_TRACE( DbgInfo, "wl_adapter_close() -- PCI\n" );
34468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_TRACE( DbgInfo, "%s: Shutting down adapter.\n", dev->name );
34568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
34668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    wl_close( dev );
34768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
34868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
34968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return 0;
35068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_adapter_close
35168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
35268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
35368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
35468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_adapter_is_open()
35568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
35668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
35768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
35868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
35968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Check whether this device is open. Returns
36068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
36168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
36268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
36368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      dev - a pointer to the device's net_device structure
36468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
36568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
36668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
36768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      nonzero if device is open.
36868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
36968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
37068c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_adapter_is_open( struct net_device *dev )
37168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
37268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* This function is used in PCMCIA to check the status of the 'open' field
37368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot       in the dev_link_t structure associated with a network device. There
37468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot       doesn't seem to be an analog to this for PCI, and checking the status
37568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot       contained in the net_device structure doesn't have the same effect.
37668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot       For now, return TRUE, but find out if this is necessary for PCI. */
37768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
37868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return TRUE;
37968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_adapter_is_open
38068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
38168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
38268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
38368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_probe()
38468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
38568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
38668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
38768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
38868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Registered in the pci_driver structure, this function is called when the
38968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PCI subsystem finds a new PCI device which matches the infomation contained
39068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  in the pci_device_id table.
39168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
39268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
39368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
39468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev    - a pointer to the device's pci_dev structure
39568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      ent     - this device's entry in the pci_device_id table
39668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
39768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
39868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
39968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
40068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
40168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
40268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
40368c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint __devinit wl_pci_probe( struct pci_dev *pdev,
40468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                const struct pci_device_id *ent )
40568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
40668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int result;
40768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
40868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
40968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_pci_probe" );
41068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
41168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	DBG_PRINT( "%s\n", VERSION_INFO );
41268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
41368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    result = wl_pci_setup( pdev );
41468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
41568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
41668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
41768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return result;
41868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_probe
41968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
42068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
42168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
42268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_remove()
42368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
42468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
42568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
42668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
42768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Registered in the pci_driver structure, this function is called when the
42868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PCI subsystem detects that a PCI device which matches the infomation
42968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  contained in the pci_device_id table has been removed.
43068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
43168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
43268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
43368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev - a pointer to the device's pci_dev structure
43468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
43568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
43668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
43768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      N/A
43868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
43968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
44068c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootvoid __devexit wl_pci_remove(struct pci_dev *pdev)
44168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
44268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    struct net_device       *dev = NULL;
44368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
44468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
44568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_pci_remove" );
44668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
44768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
44868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Make sure the pci_dev pointer passed in is valid */
44968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( pdev == NULL ) {
45068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_ERROR( DbgInfo, "PCI subsys passed in an invalid pci_dev pointer\n" );
45168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        return;
45268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
45368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
454345594d6ef696b8ad4b96cffe462c6cde2f27292Joe Perches    dev = pci_get_drvdata( pdev );
45568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( dev == NULL ) {
45668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_ERROR( DbgInfo, "Could not retrieve net_device structure\n" );
45768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        return;
45868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
45968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
46068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Perform device cleanup */
46168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    wl_remove( dev );
46268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    free_irq( dev->irq, dev );
46368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
46468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#ifdef ENABLE_DMA
4652f72aee1896bafa0fbf0ef2cdc3babe399057a11Kulikov Vasiliy    wl_pci_dma_free( pdev, dev->priv );
46668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#endif
46768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
46868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    wl_device_dealloc( dev );
46968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
47068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
47168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return;
47268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_remove
47368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
47468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
47568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
47668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_setup()
47768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
47868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
47968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
48068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
48168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Called by wl_pci_probe() to begin a device's initialization process.
48268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
48368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
48468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
48568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev - a pointer to the device's pci_dev structure
48668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
48768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
48868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
48968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
49068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
49168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
49268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
49368c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_setup( struct pci_dev *pdev )
49468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
49568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int                 result = 0;
49668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    struct net_device   *dev = NULL;
49768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    struct wl_private   *lp = NULL;
49868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
49968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
50068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_pci_setup" );
50168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
50268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
50368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Make sure the pci_dev pointer passed in is valid */
50468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( pdev == NULL ) {
50568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_ERROR( DbgInfo, "PCI subsys passed in an invalid pci_dev pointer\n" );
50668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        return -ENODEV;
50768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
50868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
50968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    result = pci_enable_device( pdev );
51068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( result != 0 ) {
51168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_ERROR( DbgInfo, "pci_enable_device() failed\n" );
51268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_LEAVE( DbgInfo );
51368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        return result;
51468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
51568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
51668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* We found our device! Let's register it with the system */
51768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_TRACE( DbgInfo, "Found our device, now registering\n" );
51868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    dev = wl_device_alloc( );
51968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( dev == NULL ) {
52068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_ERROR( DbgInfo, "Could not register device!!!\n" );
52168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_LEAVE( DbgInfo );
52268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        return -ENOMEM;
52368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
52468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
52568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Make sure that space was allocated for our private adapter struct */
52668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( dev->priv == NULL ) {
52768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_ERROR( DbgInfo, "Private adapter struct was not allocated!!!\n" );
52868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_LEAVE( DbgInfo );
52968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        return -ENOMEM;
53068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
53168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
53268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#ifdef ENABLE_DMA
53368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Allocate DMA Descriptors */
5342f72aee1896bafa0fbf0ef2cdc3babe399057a11Kulikov Vasiliy    if( wl_pci_dma_alloc( pdev, dev->priv ) < 0 ) {
53568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_ERROR( DbgInfo, "Could not allocate DMA descriptor memory!!!\n" );
53668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_LEAVE( DbgInfo );
53768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        return -ENOMEM;
53868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
53968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#endif
54068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
54168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Register our private adapter structure with PCI */
54268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    pci_set_drvdata( pdev, dev );
54368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
54468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Fill out bus specific information in the net_device struct */
54568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    dev->irq = pdev->irq;
54668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    SET_MODULE_OWNER( dev );
54768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
54868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_TRACE( DbgInfo, "Device Base Address: %#03lx\n", pdev->resource[0].start );
54968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	dev->base_addr = pdev->resource[0].start;
55068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
55168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Initialize our device here */
55268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( !wl_adapter_insert( dev )) {
55368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_ERROR( DbgInfo, "wl_adapter_insert() FAILED!!!\n" );
55468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        wl_device_dealloc( dev );
55568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_LEAVE( DbgInfo );
55668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        return -EINVAL;
55768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
55868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
55968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Register our ISR */
56068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_TRACE( DbgInfo, "Registering ISR...\n" );
56168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
56268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    result = request_irq(dev->irq, wl_isr, SA_SHIRQ, dev->name, dev);
56368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( result ) {
56468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_WARNING( DbgInfo, "Could not register ISR!!!\n" );
56568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_LEAVE( DbgInfo );
56668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        return result;
56768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	}
56868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
56968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Make sure interrupts are enabled properly for CardBus */
5702f72aee1896bafa0fbf0ef2cdc3babe399057a11Kulikov Vasiliy    lp = dev->priv;
57168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
57268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( lp->hcfCtx.IFB_BusType == CFG_NIC_BUS_TYPE_CARDBUS ||
57368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	    lp->hcfCtx.IFB_BusType == CFG_NIC_BUS_TYPE_PCI 		) {
57468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_TRACE( DbgInfo, "This is a PCI/CardBus card, enable interrupts\n" );
57568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        wl_pci_enable_cardbus_interrupts( pdev );
57668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
57768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
57868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Enable bus mastering */
57968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    pci_set_master( pdev );
58068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
58168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
58268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return 0;
58368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_setup
58468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
58568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
58668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
58768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_enable_cardbus_interrupts()
58868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
58968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
59068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
59168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
59268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Called by wl_pci_setup() to enable interrupts on a CardBus device. This
59368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  is done by writing bit 15 to the function event mask register. This
59468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  CardBus-specific register is located in BAR2 (counting from BAR0), in memory
59568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  space at byte offset 1f4 (7f4 for WARP).
59668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
59768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
59868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
59968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev - a pointer to the device's pci_dev structure
60068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
60168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
60268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
60368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      N/A
60468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
60568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
60668c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootvoid wl_pci_enable_cardbus_interrupts( struct pci_dev *pdev )
60768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
60868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    u32                 bar2_reg;
60968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    u32                 mem_addr_bus;
61068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    u32                 func_evt_mask_reg;
61168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    void                *mem_addr_kern = NULL;
61268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
61368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
61468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_pci_enable_cardbus_interrupts" );
61568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
61668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
61768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Initialize to known bad values */
61868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    bar2_reg = 0xdeadbeef;
61968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    mem_addr_bus = 0xdeadbeef;
62068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
62168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Read the BAR2 register; this register contains the base address of the
62268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot       memory region where the function event mask register lives */
62368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    pci_read_config_dword( pdev, PCI_BASE_ADDRESS_2, &bar2_reg );
62468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    mem_addr_bus = bar2_reg & PCI_BASE_ADDRESS_MEM_MASK;
62568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
62668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Once the base address is obtained, remap the memory region to kernel
62768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot       space so we can retrieve the register */
62868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    mem_addr_kern = ioremap( mem_addr_bus, 0x200 );
62968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
63068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#ifdef HERMES25
63168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#define REG_OFFSET  0x07F4
63268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#else
63368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#define REG_OFFSET  0x01F4
63468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#endif // HERMES25
63568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
63668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#define BIT15       0x8000
63768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
63868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Retrieve the functional event mask register, enable interrupts by
63968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot       setting Bit 15, and write back the value */
64068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    func_evt_mask_reg = *(u32 *)( mem_addr_kern + REG_OFFSET );
64168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    func_evt_mask_reg |= BIT15;
64268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    *(u32 *)( mem_addr_kern + REG_OFFSET ) = func_evt_mask_reg;
64368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
64468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Once complete, unmap the region and exit */
64568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    iounmap( mem_addr_kern );
64668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
64768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
64868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return;
64968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_enable_cardbus_interrupts
65068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
65168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
65268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#ifdef ENABLE_DMA
65368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
65468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_alloc()
65568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
65668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
65768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
65868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
65968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Allocates all resources needed for PCI/CardBus DMA operation
66068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
66168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
66268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
66368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev - a pointer to the device's pci_dev structure
66468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp  - the device's private adapter structure
66568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
66668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
66768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
66868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
66968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
67068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
67168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
67268c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc( struct pci_dev *pdev, struct wl_private *lp )
67368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
67468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int i;
67568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int status = 0;
67668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
67768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
67868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_pci_dma_alloc" );
67968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
68068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
68168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     lp->dma.tx_rsc_ind = lp->dma.rx_rsc_ind = 0;
68268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//
68368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     /* Alloc for the Tx chain and its reclaim descriptor */
68468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     for( i = 0; i < NUM_TX_DESC; i++ ) {
68568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = wl_pci_dma_alloc_tx_packet( pdev, lp, &lp->dma.tx_packet[i] );
68668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         if( status == 0 ) {
68768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             DBG_PRINT( "lp->dma.tx_packet[%d] :                 0x%p\n", i, lp->dma.tx_packet[i] );
68868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             DBG_PRINT( "lp->dma.tx_packet[%d]->next_desc_addr : 0x%p\n", i, lp->dma.tx_packet[i]->next_desc_addr );
68968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             lp->dma.tx_rsc_ind++;
69068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         } else {
69168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             DBG_ERROR( DbgInfo, "Could not alloc DMA Tx Packet\n" );
69268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             break;
69368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         }
69468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
69568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
69668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = wl_pci_dma_alloc_desc( pdev, lp, &lp->dma.tx_reclaim_desc );
69768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         DBG_PRINT( "lp->dma.tx_reclaim_desc: 0x%p\n", lp->dma.tx_reclaim_desc );
69868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
69968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     /* Alloc for the Rx chain and its reclaim descriptor */
70068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
70168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         for( i = 0; i < NUM_RX_DESC; i++ ) {
70268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             status = wl_pci_dma_alloc_rx_packet( pdev, lp, &lp->dma.rx_packet[i] );
70368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             if( status == 0 ) {
70468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//                 DBG_PRINT( "lp->dma.rx_packet[%d]                 : 0x%p\n", i, lp->dma.rx_packet[i] );
70568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//                 DBG_PRINT( "lp->dma.rx_packet[%d]->next_desc_addr : 0x%p\n", i, lp->dma.rx_packet[i]->next_desc_addr );
70668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//                 lp->dma.rx_rsc_ind++;
70768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             } else {
70868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//                 DBG_ERROR( DbgInfo, "Could not alloc DMA Rx Packet\n" );
70968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//                 break;
71068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             }
71168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         }
71268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
71368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
71468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = wl_pci_dma_alloc_desc( pdev, lp, &lp->dma.rx_reclaim_desc );
71568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         DBG_PRINT( "lp->dma.rx_reclaim_desc: 0x%p\n", lp->dma.rx_reclaim_desc );
71668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
71768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     /* Store status, as host should not call HCF functions if this fails */
71868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     lp->dma.status = status;  //;?all useages of dma.status have been commented out
71968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     DBG_LEAVE( DbgInfo );
72068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return status;
72168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_alloc
72268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
72368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
72468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
72568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_free()
72668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
72768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
72868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
72968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
73068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Deallocated all resources needed for PCI/CardBus DMA operation
73168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
73268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
73368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
73468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev - a pointer to the device's pci_dev structure
73568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp  - the device's private adapter structure
73668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
73768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
73868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
73968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
74068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
74168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
74268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
74368c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free( struct pci_dev *pdev, struct wl_private *lp )
74468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
74568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int i;
74668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int status = 0;
74768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
74868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
74968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_pci_dma_free" );
75068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
75168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
75268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Reclaim all Rx packets that were handed over to the HCF */
75368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Do I need to do this? Before this free is called, I've already disabled
75468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot       the port which will call wl_pci_dma_hcf_reclaim */
75568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //if( lp->dma.status == 0 )
75668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //{
75768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //    wl_pci_dma_hcf_reclaim( lp );
75868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //}
75968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
76068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Free everything needed for DMA Rx */
76168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    for( i = 0; i < NUM_RX_DESC; i++ ) {
76268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        if( lp->dma.rx_packet[i] ) {
76368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            status = wl_pci_dma_free_rx_packet( pdev, lp, &lp->dma.rx_packet[i] );
76468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            if( status != 0 ) {
76568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                DBG_WARNING( DbgInfo, "Problem freeing Rx packet\n" );
76668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            }
76768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
76868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
76968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    lp->dma.rx_rsc_ind = 0;
77068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
77168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( lp->dma.rx_reclaim_desc ) {
77268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = wl_pci_dma_free_desc( pdev, lp, &lp->dma.rx_reclaim_desc );
77368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        if( status != 0 ) {
77468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            DBG_WARNING( DbgInfo, "Problem freeing Rx reclaim descriptor\n" );
77568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
77668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
77768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
77868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Free everything needed for DMA Tx */
77968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    for( i = 0; i < NUM_TX_DESC; i++ ) {
78068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        if( lp->dma.tx_packet[i] ) {
78168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            status = wl_pci_dma_free_tx_packet( pdev, lp, &lp->dma.tx_packet[i] );
78268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            if( status != 0 ) {
78368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                DBG_WARNING( DbgInfo, "Problem freeing Tx packet\n" );
78468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            }
78568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
78668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
78768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    lp->dma.tx_rsc_ind = 0;
78868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
78968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( lp->dma.tx_reclaim_desc ) {
79068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = wl_pci_dma_free_desc( pdev, lp, &lp->dma.tx_reclaim_desc );
79168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        if( status != 0 ) {
79268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            DBG_WARNING( DbgInfo, "Problem freeing Tx reclaim descriptor\n" );
79368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
79468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
79568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
79668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
79768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return status;
79868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_free
79968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
80068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
80168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
80268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
80368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_alloc_tx_packet()
80468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
80568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
80668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
80768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
80868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Allocates a single Tx packet, consisting of several descriptors and
80968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      buffers. Data to transmit is first copied into the 'payload' buffer
81068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      before being transmitted.
81168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
81268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
81368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
81468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev    - a pointer to the device's pci_dev structure
81568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp      - the device's private adapter structure
81668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      desc    - a pointer which will reference the descriptor to be alloc'd.
81768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
81868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
81968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
82068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
82168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
82268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
82368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
82468c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc_tx_packet( struct pci_dev *pdev, struct wl_private *lp,
82568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                DESC_STRCT **desc )
82668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
82768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     int status = 0;
82868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     /*------------------------------------------------------------------------*/
82968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//
83068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( desc == NULL ) {
83168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = -EFAULT;
83268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
83368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
83468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = wl_pci_dma_alloc_desc_and_buf( pdev, lp, desc,
83568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//                                                 HCF_DMA_TX_BUF1_SIZE );
83668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//
83768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         if( status == 0 ) {
83868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             status = wl_pci_dma_alloc_desc_and_buf( pdev, lp,
83968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//                                                     &( (*desc)->next_desc_addr ),
84068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//                                                     HCF_MAX_PACKET_SIZE );
84168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         }
84268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
84368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
84468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         (*desc)->next_desc_phys_addr = (*desc)->next_desc_addr->desc_phys_addr;
84568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
84668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     return status;
84768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_alloc_tx_packet
84868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
84968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
85068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
85168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_free_tx_packet()
85268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
85368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
85468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
85568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
85668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Frees a single Tx packet, described in the corresponding alloc function.
85768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
85868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
85968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
86068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev    - a pointer to the device's pci_dev structure
86168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp      - the device's private adapter structure
86268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      desc    - a pointer which will reference the descriptor to be alloc'd.
86368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
86468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
86568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
86668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
86768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
86868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
86968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
87068c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free_tx_packet( struct pci_dev *pdev, struct wl_private *lp,
87168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                DESC_STRCT **desc )
87268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
87368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int status = 0;
87468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
87568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
87668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( *desc == NULL ) {
87768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_PRINT( "Null descriptor\n" );
87868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = -EFAULT;
87968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
88068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	//;?the "limited" NDIS strategy, assuming a frame consists ALWAYS out of 2
88168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot	//descriptors, make this robust
88268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( status == 0 && (*desc)->next_desc_addr ) {
88368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = wl_pci_dma_free_desc_and_buf( pdev, lp, &(*desc)->next_desc_addr );
88468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
88568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( status == 0 ) {
88668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = wl_pci_dma_free_desc_and_buf( pdev, lp, desc );
88768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
88868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return status;
88968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_free_tx_packet
89068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
89168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
89268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
89368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_alloc_rx_packet()
89468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
89568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
89668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
89768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
89868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Allocates a single Rx packet, consisting of two descriptors and one
89968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      contiguous buffer. THe buffer starts with the hermes-specific header.
90068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      One descriptor points at the start, the other at offset 0x3a of the
90168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      buffer.
90268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
90368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
90468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
90568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev    - a pointer to the device's pci_dev structure
90668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp      - the device's private adapter structure
90768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      desc    - a pointer which will reference the descriptor to be alloc'd.
90868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
90968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
91068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
91168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
91268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
91368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
91468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
91568c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc_rx_packet( struct pci_dev *pdev, struct wl_private *lp,
91668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                DESC_STRCT **desc )
91768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
91868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int         status = 0;
91968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DESC_STRCT  *p;
92068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
92168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
92268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( desc == NULL ) {
92368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = -EFAULT;
92468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
92568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot// 	//;?the "limited" NDIS strategy, assuming a frame consists ALWAYS out of 2
92668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot// 	//descriptors, make this robust
92768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
92868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = wl_pci_dma_alloc_desc( pdev, lp, desc );
92968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot// 	}
93068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
93168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = wl_pci_dma_alloc_buf( pdev, lp, *desc, HCF_MAX_PACKET_SIZE );
93268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
93368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
93468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = wl_pci_dma_alloc_desc( pdev, lp, &p );
93568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
93668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
93768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         /* Size of 1st descriptor becomes 0x3a bytes */
93868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         SET_BUF_SIZE( *desc, HCF_DMA_RX_BUF1_SIZE );
93968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//
94068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         /* Make 2nd descriptor point at offset 0x3a of the buffer */
94168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         SET_BUF_SIZE( p, ( HCF_MAX_PACKET_SIZE - HCF_DMA_RX_BUF1_SIZE ));
94268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         p->buf_addr       = (*desc)->buf_addr + HCF_DMA_RX_BUF1_SIZE;
94368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         p->buf_phys_addr  = (*desc)->buf_phys_addr + HCF_DMA_RX_BUF1_SIZE;
94468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         p->next_desc_addr = NULL;
94568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//
94668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         /* Chain 2nd descriptor to 1st descriptor */
94768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         (*desc)->next_desc_addr      = p;
94868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         (*desc)->next_desc_phys_addr = p->desc_phys_addr;
94968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
95068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
95168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return status;
95268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_alloc_rx_packet
95368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
95468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
95568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
95668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_free_rx_packet()
95768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
95868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
95968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
96068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
96168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Frees a single Rx packet, described in the corresponding alloc function.
96268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
96368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
96468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
96568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev    - a pointer to the device's pci_dev structure
96668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp      - the device's private adapter structure
96768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      desc    - a pointer which will reference the descriptor to be alloc'd.
96868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
96968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
97068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
97168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
97268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
97368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
97468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
97568c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free_rx_packet( struct pci_dev *pdev, struct wl_private *lp,
97668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                DESC_STRCT **desc )
97768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
97868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int status = 0;
97968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DESC_STRCT *p;
98068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
98168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
98268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( *desc == NULL ) {
98368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = -EFAULT;
98468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
98568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( status == 0 ) {
98668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        p = (*desc)->next_desc_addr;
98768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
98868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        /* Free the 2nd descriptor */
98968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        if( p != NULL ) {
99068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            p->buf_addr      = NULL;
99168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            p->buf_phys_addr = 0;
99268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
99368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            status = wl_pci_dma_free_desc( pdev, lp, &p );
99468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
99568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
99668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
99768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /* Free the buffer and 1st descriptor */
99868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( status == 0 ) {
99968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        SET_BUF_SIZE( *desc, HCF_MAX_PACKET_SIZE );
100068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = wl_pci_dma_free_desc_and_buf( pdev, lp, desc );
100168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
100268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return status;
100368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_free_rx_packet
100468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
100568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
100668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
100768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_alloc_desc_and_buf()
100868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
100968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
101068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
101168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
101268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Allocates a DMA descriptor and buffer, and associates them with one
101368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      another.
101468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
101568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
101668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
101768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev  - a pointer to the device's pci_dev structure
101868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp    - the device's private adapter structure
101968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      desc  - a pointer which will reference the descriptor to be alloc'd
102068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
102168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
102268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
102368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
102468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
102568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
102668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
102768c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc_desc_and_buf( struct pci_dev *pdev, struct wl_private *lp,
102868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                   DESC_STRCT **desc, int size )
102968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
103068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int status = 0;
103168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
103268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
103368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( desc == NULL ) {
103468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = -EFAULT;
103568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
103668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
103768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = wl_pci_dma_alloc_desc( pdev, lp, desc );
103868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//
103968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         if( status == 0 ) {
104068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             status = wl_pci_dma_alloc_buf( pdev, lp, *desc, size );
104168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         }
104268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
104368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return status;
104468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_alloc_desc_and_buf
104568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
104668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
104768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
104868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_free_desc_and_buf()
104968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
105068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
105168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
105268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
105368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Frees a DMA descriptor and associated buffer.
105468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
105568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
105668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
105768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev  - a pointer to the device's pci_dev structure
105868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp    - the device's private adapter structure
105968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      desc  - a pointer which will reference the descriptor to be alloc'd
106068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
106168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
106268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
106368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
106468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
106568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
106668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
106768c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free_desc_and_buf( struct pci_dev *pdev, struct wl_private *lp,
106868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                                   DESC_STRCT **desc )
106968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
107068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int status = 0;
107168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
107268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
107368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( desc == NULL ) {
107468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = -EFAULT;
107568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
107668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( status == 0 && *desc == NULL ) {
107768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = -EFAULT;
107868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
107968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( status == 0 ) {
108068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = wl_pci_dma_free_buf( pdev, lp, *desc );
108168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
108268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        if( status == 0 ) {
108368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            status = wl_pci_dma_free_desc( pdev, lp, desc );
108468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
108568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
108668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return status;
108768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_free_desc_and_buf
108868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
108968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
109068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
109168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_alloc_desc()
109268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
109368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
109468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
109568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
109668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Allocates one DMA descriptor in cache coherent memory.
109768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
109868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
109968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
110068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev - a pointer to the device's pci_dev structure
110168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp  - the device's private adapter structure
110268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
110368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
110468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
110568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
110668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
110768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
110868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
110968c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc_desc( struct pci_dev *pdev, struct wl_private *lp,
111068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                           DESC_STRCT **desc )
111168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
111268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     int         status = 0;
111368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     dma_addr_t  pa;
111468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     /*------------------------------------------------------------------------*/
111568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//
111668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     DBG_FUNC( "wl_pci_dma_alloc_desc" );
111768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     DBG_ENTER( DbgInfo );
111868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//
111968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( desc == NULL ) {
112068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = -EFAULT;
112168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
112268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
112368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         *desc = pci_alloc_consistent( pdev, sizeof( DESC_STRCT ), &pa );
112468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
112568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( *desc == NULL ) {
112668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         DBG_ERROR( DbgInfo, "pci_alloc_consistent() failed\n" );
112768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = -ENOMEM;
112868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     } else {
112968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         memset( *desc, 0, sizeof( DESC_STRCT ));
113068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         (*desc)->desc_phys_addr = cpu_to_le32( pa );
113168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
113268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     DBG_LEAVE( DbgInfo );
113368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     return status;
113468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_alloc_desc
113568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
113668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
113768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
113868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_free_desc()
113968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
114068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
114168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
114268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
114368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Frees one DMA descriptor in cache coherent memory.
114468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
114568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
114668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
114768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev - a pointer to the device's pci_dev structure
114868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp  - the device's private adapter structure
114968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
115068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
115168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
115268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
115368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
115468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
115568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
115668c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free_desc( struct pci_dev *pdev, struct wl_private *lp,
115768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                           DESC_STRCT **desc )
115868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
115968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int         status = 0;
116068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
116168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
116268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( *desc == NULL ) {
116368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = -EFAULT;
116468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
116568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( status == 0 ) {
116668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        pci_free_consistent( pdev, sizeof( DESC_STRCT ), *desc,
116768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                             (*desc)->desc_phys_addr );
116868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
116968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    *desc = NULL;
117068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return status;
117168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_free_desc
117268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
117368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
117468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
117568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_alloc_buf()
117668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
117768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
117868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
117968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
118068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Allocates one DMA buffer in cache coherent memory, and associates a DMA
118168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      descriptor with this buffer.
118268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
118368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
118468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
118568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev - a pointer to the device's pci_dev structure
118668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp  - the device's private adapter structure
118768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
118868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
118968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
119068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
119168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
119268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
119368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
119468c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_alloc_buf( struct pci_dev *pdev, struct wl_private *lp,
119568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                          DESC_STRCT *desc, int size )
119668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
119768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int         status = 0;
119868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    dma_addr_t  pa;
119968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
120068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
120168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     DBG_FUNC( "wl_pci_dma_alloc_buf" );
120268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     DBG_ENTER( DbgInfo );
120368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//
120468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( desc == NULL ) {
120568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = -EFAULT;
120668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
120768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 && desc->buf_addr != NULL ) {
120868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = -EFAULT;
120968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
121068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( status == 0 ) {
121168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         desc->buf_addr = pci_alloc_consistent( pdev, size, &pa );
121268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
121368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     if( desc->buf_addr == NULL ) {
121468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         DBG_ERROR( DbgInfo, "pci_alloc_consistent() failed\n" );
121568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         status = -ENOMEM;
121668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     } else {
121768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         desc->buf_phys_addr = cpu_to_le32( pa );
121868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         SET_BUF_SIZE( desc, size );
121968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     }
122068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//     DBG_LEAVE( DbgInfo );
122168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return status;
122268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_alloc_buf
122368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
122468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
122568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
122668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_free_buf()
122768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
122868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
122968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
123068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
123168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Allocates one DMA buffer in cache coherent memory, and associates a DMA
123268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      descriptor with this buffer.
123368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
123468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
123568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
123668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      pdev - a pointer to the device's pci_dev structure
123768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp  - the device's private adapter structure
123868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
123968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
124068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
124168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
124268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
124368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
124468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
124568c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootint wl_pci_dma_free_buf( struct pci_dev *pdev, struct wl_private *lp,
124668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                         DESC_STRCT *desc )
124768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
124868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int         status = 0;
124968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
125068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
125168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( desc == NULL ) {
125268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = -EFAULT;
125368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
125468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( status == 0 && desc->buf_addr == NULL ) {
125568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        status = -EFAULT;
125668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
125768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( status == 0 ) {
125868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        pci_free_consistent( pdev, GET_BUF_SIZE( desc ), desc->buf_addr,
125968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                             desc->buf_phys_addr );
126068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
126168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        desc->buf_addr = 0;
126268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        desc->buf_phys_addr = 0;
126368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        SET_BUF_SIZE( desc, 0 );
126468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
126568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return status;
126668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_free_buf
126768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
126868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
126968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
127068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_hcf_supply()
127168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
127268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
127368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
127468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
127568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Supply HCF with DMA-related resources. These consist of:
127668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *          - buffers and descriptors for receive purposes
127768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *          - one 'reclaim' descriptor for the transmit path, used to fulfill a
127868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *            certain H25 DMA engine requirement
127968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *          - one 'reclaim' descriptor for the receive path, used to fulfill a
128068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *            certain H25 DMA engine requirement
128168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
128268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      This function is called at start-of-day or at re-initialization.
128368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
128468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
128568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
128668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp  - the device's private adapter structure
128768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
128868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
128968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
129068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
129168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
129268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
129368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
129468c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootvoid wl_pci_dma_hcf_supply( struct wl_private *lp )
129568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
129668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int i;
129768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
129868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
129968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_pci_dma_hcf_supply" );
130068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
130168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
130268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //if( lp->dma.status == 0 );
130368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //{
130468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        /* Hand over the Rx/Tx reclaim descriptors to the HCF */
130568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        if( lp->dma.tx_reclaim_desc ) {
130668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            DBG_PRINT( "lp->dma.tx_reclaim_desc: 0x%p\n", lp->dma.tx_reclaim_desc );
130768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            hcf_dma_tx_put( &lp->hcfCtx, lp->dma.tx_reclaim_desc, 0 );
130868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            lp->dma.tx_reclaim_desc = NULL;
130968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            DBG_PRINT( "lp->dma.tx_reclaim_desc: 0x%p\n", lp->dma.tx_reclaim_desc );
131068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
131168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        if( lp->dma.rx_reclaim_desc ) {
131268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            DBG_PRINT( "lp->dma.rx_reclaim_desc: 0x%p\n", lp->dma.rx_reclaim_desc );
131368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            hcf_dma_rx_put( &lp->hcfCtx, lp->dma.rx_reclaim_desc );
131468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            lp->dma.rx_reclaim_desc = NULL;
131568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            DBG_PRINT( "lp->dma.rx_reclaim_desc: 0x%p\n", lp->dma.rx_reclaim_desc );
131668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
131768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        /* Hand over the Rx descriptor chain to the HCF */
131868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        for( i = 0; i < NUM_RX_DESC; i++ ) {
131968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            DBG_PRINT( "lp->dma.rx_packet[%d]:    0x%p\n", i, lp->dma.rx_packet[i] );
132068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            hcf_dma_rx_put( &lp->hcfCtx, lp->dma.rx_packet[i] );
132168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            lp->dma.rx_packet[i] = NULL;
132268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            DBG_PRINT( "lp->dma.rx_packet[%d]:    0x%p\n", i, lp->dma.rx_packet[i] );
132368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
132468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //}
132568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
132668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
132768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return;
132868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_hcf_supply
132968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
133068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
133168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
133268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_hcf_reclaim()
133368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
133468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
133568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
133668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
133768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Return DMA-related resources from the HCF. These consist of:
133868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *          - buffers and descriptors for receive purposes
133968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *          - buffers and descriptors for transmit purposes
134068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *          - one 'reclaim' descriptor for the transmit path, used to fulfill a
134168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *            certain H25 DMA engine requirement
134268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *          - one 'reclaim' descriptor for the receive path, used to fulfill a
134368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *            certain H25 DMA engine requirement
134468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
134568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      This function is called at end-of-day or at re-initialization.
134668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
134768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
134868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
134968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp  - the device's private adapter structure
135068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
135168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
135268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
135368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
135468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
135568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
135668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
135768c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootvoid wl_pci_dma_hcf_reclaim( struct wl_private *lp )
135868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
135968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int i;
136068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
136168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
136268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_pci_dma_hcf_reclaim" );
136368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
136468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
136568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    wl_pci_dma_hcf_reclaim_rx( lp );
136668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    for( i = 0; i < NUM_RX_DESC; i++ ) {
136768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_PRINT( "rx_packet[%d] 0x%p\n", i, lp->dma.rx_packet[i] );
136868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         if( lp->dma.rx_packet[i] == NULL ) {
136968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             DBG_PRINT( "wl_pci_dma_hcf_reclaim: rx_packet[%d] NULL\n", i );
137068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         }
137168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
137268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
137368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    wl_pci_dma_hcf_reclaim_tx( lp );
137468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    for( i = 0; i < NUM_TX_DESC; i++ ) {
137568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        DBG_PRINT( "tx_packet[%d] 0x%p\n", i, lp->dma.tx_packet[i] );
137668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         if( lp->dma.tx_packet[i] == NULL ) {
137768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//             DBG_PRINT( "wl_pci_dma_hcf_reclaim: tx_packet[%d] NULL\n", i );
137868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot//         }
137968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot     }
138068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
138168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
138268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return;
138368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_hcf_reclaim
138468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
138568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
138668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
138768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_hcf_reclaim_rx()
138868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
138968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
139068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
139168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
139268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Reclaim Rx packets that have already been processed by the HCF.
139368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
139468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
139568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
139668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp  - the device's private adapter structure
139768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
139868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
139968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
140068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
140168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
140268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
140368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
140468c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootvoid wl_pci_dma_hcf_reclaim_rx( struct wl_private *lp )
140568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
140668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int         i;
140768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DESC_STRCT *p;
140868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
140968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
141068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_pci_dma_hcf_reclaim_rx" );
141168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
141268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
141368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //if( lp->dma.status == 0 )
141468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //{
141568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        while ( ( p = hcf_dma_rx_get( &lp->hcfCtx ) ) != NULL ) {
141668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            if( p && p->buf_addr == NULL ) {
141768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                /* A reclaim descriptor is being given back by the HCF. Reclaim
141868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                   descriptors have a NULL buf_addr */
141968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                lp->dma.rx_reclaim_desc = p;
142068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            	DBG_PRINT( "reclaim_descriptor: 0x%p\n", p );
142168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                continue;
142268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            }
142368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            for( i = 0; i < NUM_RX_DESC; i++ ) {
142468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                if( lp->dma.rx_packet[i] == NULL ) {
142568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                    break;
142668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                }
142768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            }
142868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            /* An Rx buffer descriptor is being given back by the HCF */
142968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            lp->dma.rx_packet[i] = p;
143068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            lp->dma.rx_rsc_ind++;
143168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        	DBG_PRINT( "rx_packet[%d] 0x%p\n", i, lp->dma.rx_packet[i] );
143268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
143368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //}
143468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
143568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_hcf_reclaim_rx
143668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
143768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
143868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
143968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_get_tx_packet()
144068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
144168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
144268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
144368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
144468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Obtains a Tx descriptor from the chain to use for Tx.
144568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
144668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
144768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
144868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp - a pointer to the device's wl_private structure.
144968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
145068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
145168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
145268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      A pointer to the retrieved descriptor
145368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
145468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
145568c0bdff7ac903421f224e080499c51cd5287f97Henk de GrootDESC_STRCT * wl_pci_dma_get_tx_packet( struct wl_private *lp )
145668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
145768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int i;
145868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DESC_STRCT *desc = NULL;
145968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
146068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
146168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    for( i = 0; i < NUM_TX_DESC; i++ ) {
146268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        if( lp->dma.tx_packet[i] ) {
146368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            break;
146468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
146568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
146668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
146768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( i != NUM_TX_DESC ) {
146868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        desc = lp->dma.tx_packet[i];
146968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
147068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        lp->dma.tx_packet[i] = NULL;
147168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        lp->dma.tx_rsc_ind--;
147268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
147368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        memset( desc->buf_addr, 0, HCF_DMA_TX_BUF1_SIZE );
147468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
147568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
147668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return desc;
147768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_get_tx_packet
147868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
147968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
148068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
148168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_put_tx_packet()
148268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
148368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
148468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
148568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
148668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Returns a Tx descriptor to the chain.
148768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
148868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
148968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
149068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp   - a pointer to the device's wl_private structure.
149168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      desc - a pointer to the descriptor to return.
149268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
149368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
149468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
149568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      N/A
149668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
149768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
149868c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootvoid wl_pci_dma_put_tx_packet( struct wl_private *lp, DESC_STRCT *desc )
149968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
150068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int i;
150168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
150268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
150368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    for( i = 0; i < NUM_TX_DESC; i++ ) {
150468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        if( lp->dma.tx_packet[i] == NULL ) {
150568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            break;
150668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
150768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
150868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
150968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( i != NUM_TX_DESC ) {
151068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        lp->dma.tx_packet[i] = desc;
151168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        lp->dma.tx_rsc_ind++;
151268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
151368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_put_tx_packet
151468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
151568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
151668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*******************************************************************************
151768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *	wl_pci_dma_hcf_reclaim_tx()
151868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *******************************************************************************
151968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
152068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  DESCRIPTION:
152168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
152268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      Reclaim Tx packets that have either been processed by the HCF due to a
152368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      port disable or a Tx completion.
152468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
152568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  PARAMETERS:
152668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
152768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      lp  - the device's private adapter structure
152868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
152968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *  RETURNS:
153068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
153168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      0 on success
153268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *      errno value otherwise
153368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot *
153468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot ******************************************************************************/
153568c0bdff7ac903421f224e080499c51cd5287f97Henk de Grootvoid wl_pci_dma_hcf_reclaim_tx( struct wl_private *lp )
153668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot{
153768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    int         i;
153868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DESC_STRCT *p;
153968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    /*------------------------------------------------------------------------*/
154068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
154168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_FUNC( "wl_pci_dma_hcf_reclaim_tx" );
154268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_ENTER( DbgInfo );
154368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
154468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //if( lp->dma.status == 0 )
154568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //{
154668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        while ( ( p = hcf_dma_tx_get( &lp->hcfCtx ) ) != NULL ) {
154768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
154868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            if( p != NULL && p->buf_addr == NULL ) {
154968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                /* A Reclaim descriptor is being given back by the HCF. Reclaim
155068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                   descriptors have a NULL buf_addr */
155168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                lp->dma.tx_reclaim_desc = p;
155268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            	DBG_PRINT( "reclaim_descriptor: 0x%p\n", p );
155368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                continue;
155468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            }
155568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            for( i = 0; i < NUM_TX_DESC; i++ ) {
155668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                if( lp->dma.tx_packet[i] == NULL ) {
155768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                    break;
155868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot                }
155968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            }
156068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            /* An Rx buffer descriptor is being given back by the HCF */
156168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            lp->dma.tx_packet[i] = p;
156268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot            lp->dma.tx_rsc_ind++;
156368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        	DBG_PRINT( "tx_packet[%d] 0x%p\n", i, lp->dma.tx_packet[i] );
156468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        }
156568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    //}
156668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot
156768c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    if( lp->netif_queue_on == FALSE ) {
156868c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        netif_wake_queue( lp->dev );
156968c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        WL_WDS_NETIF_WAKE_QUEUE( lp );
157068c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot        lp->netif_queue_on = TRUE;
157168c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    }
157268c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    DBG_LEAVE( DbgInfo );
157368c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot    return;
157468c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot} // wl_pci_dma_hcf_reclaim_tx
157568c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot/*============================================================================*/
157668c0bdff7ac903421f224e080499c51cd5287f97Henk de Groot#endif  // ENABLE_DMA
1577