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