aboutsummaryrefslogtreecommitdiffstats
path: root/package/madwifi/patches
Commit message (Collapse)AuthorAgeFilesLines
...
* madwifi: fix several noderef and ibss merge issues that led to memory leaks ↵Felix Fietkau2009-09-0921-117/+165
| | | | | | and high system load SVN-Revision: 17545
* madwifi: fix another unconverted netdev_ops issueFelix Fietkau2009-08-281-4/+8
| | | | SVN-Revision: 17431
* madwifi: add patch for building all modules (except for the HAL) into a ↵Felix Fietkau2009-08-191-0/+778
| | | | | | single module. saves space and gets rid of unnecessary exports removes support for onoe and amrr - I don't think anybody needs these anymore SVN-Revision: 17314
* add powersave fixes based on patches by Steven Luo (#4376)Felix Fietkau2009-08-192-0/+35
| | | | SVN-Revision: 17312
* madwifi: refresh patchesFelix Fietkau2009-08-195-9/+9
| | | | SVN-Revision: 17311
* madwifi: fix frame dropped counterFelix Fietkau2009-08-111-0/+25
| | | | SVN-Revision: 17224
* madwifi: fix compiler warningFelix Fietkau2009-08-111-1/+1
| | | | SVN-Revision: 17221
* fix software rx filter for ibss mode (based on a patch by harald schiöberg)Felix Fietkau2009-08-111-0/+20
| | | | SVN-Revision: 17220
* madwifi: fix compile error on kernels without net_device api compatibilityFelix Fietkau2009-08-115-11/+19
| | | | SVN-Revision: 17219
* madwifi: fix a race condition in the ap2ap wds setupFelix Fietkau2009-08-011-11/+33
| | | | SVN-Revision: 17086
* madwifi: disable debug by default in the source tree instead of only relying ↵Felix Fietkau2009-08-011-3/+5
| | | | | | on the override (useful for external builds) SVN-Revision: 17085
* madwifi: remove the get_arch.mk build failure when the 'detected' arch ↵Felix Fietkau2009-08-011-1/+6
| | | | | | doesn't match the build system's value SVN-Revision: 17084
* madwifi: fix crash on 2.6.30Felix Fietkau2009-07-182-2/+16
| | | | SVN-Revision: 16889
* madwifi: fix a race condition in the ibss mergeFelix Fietkau2009-07-161-0/+10
| | | | SVN-Revision: 16870
* madwifi: clean up / fix ibss node handlingFelix Fietkau2009-07-161-0/+80
| | | | SVN-Revision: 16861
* madwifi: trivial antenna diversity fixFelix Fietkau2009-07-141-1/+1
| | | | SVN-Revision: 16846
* madwifi: clean up wme handling, use same packet classification as mac80211Felix Fietkau2009-07-121-0/+136
| | | | SVN-Revision: 16790
* madwifi: fix another instance of excessive stack usage in wlanconfigFelix Fietkau2009-07-121-0/+9
| | | | SVN-Revision: 16788
* upgrade to the new version of wprobe - includes reconfigurable layer 2 ↵Felix Fietkau2009-07-061-22/+63
| | | | | | statistics, remote access, more configuration options and many bugfixes SVN-Revision: 16719
* madwifi: fix wlanconfig athX destroy on 2.6.30 (incomplete netdev_ops ↵Felix Fietkau2009-06-011-3/+34
| | | | | | transition) SVN-Revision: 16289
* madwifi: handle frame classification properly if eth->h_proto contains the ↵Felix Fietkau2009-05-311-1/+1
| | | | | | protocol number directly (without offset) SVN-Revision: 16237
* madwifi: fix excessive stack usage in the wlanconfig toolFelix Fietkau2009-05-311-0/+11
| | | | SVN-Revision: 16235
* madwifi: if a txpower value below the poweroffset is requested, set the ↵Felix Fietkau2009-05-311-0/+16
| | | | | | internal txpower to 0db SVN-Revision: 16234
* madwifi: add better hw detection, use a power offset for setting/getting tx ↵Felix Fietkau2009-05-3128-283/+406
| | | | | | power for cards that have a twisted eeprom SVN-Revision: 16224
* madwifi: add sanity checks for monitor mode injectionFelix Fietkau2009-05-301-0/+26
| | | | SVN-Revision: 16218
* madwifi: fix an array overrun in the rate control attach checkFelix Fietkau2009-05-301-1/+1
| | | | SVN-Revision: 16217
* madwifi: fix a rare ad-hoc mode crashFelix Fietkau2009-05-211-0/+11
| | | | SVN-Revision: 15964
* madwifi: cosmetic fixes for maxrate/minrateFelix Fietkau2009-05-214-6/+6
| | | | SVN-Revision: 15961
* Fix device name allocation This patch fixes a bug in madwifi where names for ↵Jo-Philipp Wich2009-05-201-0/+30
| | | | | | wifi devices are not allocated during device setup. It fixes some instability on devices which share IRQ. Signed-off-by: Vasilis Tsiligiannis <b_tsiligiannis@silverton.gr> SVN-Revision: 15950
* Make madwifi compile with kernel 2.6.30.Hauke Mehrtens2009-05-143-3/+151
| | | | SVN-Revision: 15850
* make madwifi compile with kernel 2.6.29.Hauke Mehrtens2009-05-112-0/+1971
| | | | SVN-Revision: 15773
* madwifi: ignore the eeprom fast framing supported flag, as it is an ↵Felix Fietkau2009-05-101-0/+11
| | | | | | arbitrary restriction and not based on hardware capability SVN-Revision: 15763
* madwifi: do not add the ff headroom len to dev->hard_header_len to avoid ↵Felix Fietkau2009-05-101-0/+12
| | | | | | unnecessary reallocations. the driver will reallocate skbs itself if necessary SVN-Revision: 15762
* madwifi: remove some leftover duplicate definitionsFelix Fietkau2009-05-102-3/+36
| | | | SVN-Revision: 15758
* madwifi: clean up tx status mrr handling and fix mrr parsing for 5416Felix Fietkau2009-05-101-0/+507
| | | | SVN-Revision: 15757
* madwifi: clean up handling of various timings such as slot time, ack ↵Felix Fietkau2009-05-081-0/+730
| | | | | | timeout, eifs time, etc. SVN-Revision: 15713
* madwifi: fix uninitialized variableFelix Fietkau2009-05-082-4/+5
| | | | SVN-Revision: 15711
* madwifi: remove unused functionsFelix Fietkau2009-05-081-0/+29
| | | | SVN-Revision: 15710
* madwifi: fix selection of phy errors in the rx filterFelix Fietkau2009-05-081-0/+28
| | | | SVN-Revision: 15707
* madwifi: improve autochannel decision with lots of cards on one boardFelix Fietkau2009-05-071-1/+1
| | | | SVN-Revision: 15704
* madwifi: improve autochannel, nuke some dead code, fix scanlist building ↵Felix Fietkau2009-05-0715-74/+197
| | | | | | from channel mode SVN-Revision: 15702
* madwifi: fix setting outdoor modeFelix Fietkau2009-05-071-8/+9
| | | | SVN-Revision: 15694
* madwifi: fix run-time changing of iwpriv settings (thx, brainslayer)Felix Fietkau2009-05-071-0/+31
| | | | SVN-Revision: 15664
* madwifi: improve mode selection, do not scan channels which do not fit the ↵Felix Fietkau2009-05-075-45/+59
| | | | | | desired mode SVN-Revision: 15663
* make madwifi buildable without CONFIG_CRYPTOFelix Fietkau2009-05-071-2/+75
| | | | SVN-Revision: 15662
* madwifi: improve antenna diversity handlingFelix Fietkau2009-05-072-31/+87
| | | | SVN-Revision: 15658
* madwifi: minor cleanup for the channel handling patchFelix Fietkau2009-05-061-32/+26
| | | | SVN-Revision: 15637
* madwifi: make country code and outdoor flag changeable without reloading the ↵Felix Fietkau2009-05-061-0/+1354
| | | | | | driver SVN-Revision: 15633
* madwifi: remove braindead code that overwrote the user's antenna diversity ↵Felix Fietkau2009-04-071-0/+30
| | | | | | setting (thx, brainslayer) SVN-Revision: 15141
* madwifi: fix crash under loadFelix Fietkau2009-04-041-0/+20
| | | | SVN-Revision: 15099
i">0; } /**Function************************************************************* Synopsis [Make sure reprsentative nodes do not have representatives.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Aig_ManCheckReprs( Aig_Man_t * p ) { int fPrintConst = 0; Aig_Obj_t * pObj; int i, fProb = 0; int Class0 = 0, ClassCi = 0; Aig_ManForEachObj( p, pObj, i ) { if ( Aig_ObjRepr(p, pObj) == NULL ) continue; if ( !Aig_ObjIsNode(pObj) ) printf( "Obj %d is not an AND but it has a repr %d.\n", i, Aig_ObjId(Aig_ObjRepr(p, pObj)) ), fProb = 1; else if ( Aig_ObjRepr(p, Aig_ObjRepr(p, pObj)) ) printf( "Obj %d has repr %d with a repr %d.\n", i, Aig_ObjId(Aig_ObjRepr(p, pObj)), Aig_ObjId(Aig_ObjRepr(p, Aig_ObjRepr(p, pObj))) ), fProb = 1; } if ( !fProb ) printf( "Representive verification successful.\n" ); else printf( "Representive verification FAILED.\n" ); if ( !fPrintConst ) return; // count how many representatives are const0 or a CI Aig_ManForEachObj( p, pObj, i ) { if ( Aig_ObjRepr(p, pObj) == Aig_ManConst1(p) ) Class0++; if ( Aig_ObjRepr(p, pObj) && Aig_ObjIsCi(Aig_ObjRepr(p, pObj)) ) ClassCi++; } printf( "Const0 nodes = %d. ConstCI nodes = %d.\n", Class0, ClassCi ); } /**Function************************************************************* Synopsis [Verify correctness of choices.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Dch_CheckChoices( Aig_Man_t * p, int fSkipRedSupps ) { Aig_Obj_t * pObj; int i, fProb = 0; Aig_ManCleanMarkA( p ); Aig_ManForEachNode( p, pObj, i ) { if ( p->pEquivs[i] != NULL ) { if ( pObj->fMarkA == 1 ) printf( "node %d participates in more than one choice class\n", i ), fProb = 1; pObj->fMarkA = 1; // check redundancy if ( fSkipRedSupps && Dch_ObjCheckSuppRed( p, pObj, p->pEquivs[i]) ) printf( "node %d and repr %d have diff supports\n", pObj->Id, p->pEquivs[i]->Id ); // consider the next one pObj = p->pEquivs[i]; if ( p->pEquivs[Aig_ObjId(pObj)] == NULL ) { if ( pObj->fMarkA == 1 ) printf( "repr %d has final node %d participates in more than one choice class\n", i, pObj->Id ), fProb = 1; pObj->fMarkA = 1; } // consider the non-head ones if ( pObj->nRefs > 0 ) printf( "node %d belonging to choice has fanout %d\n", pObj->Id, pObj->nRefs ); } if ( p->pReprs && p->pReprs[i] != NULL ) { if ( pObj->nRefs > 0 ) printf( "node %d has representative %d and fanout count %d\n", pObj->Id, p->pReprs[i]->Id, pObj->nRefs ), fProb = 1; } } Aig_ManCleanMarkA( p ); if ( !fProb ) printf( "Verification of choice AIG succeeded.\n" ); else printf( "Verification of choice AIG FAILED.\n" ); } /**Function************************************************************* Synopsis [Checks for combinational loops in the AIG.] Description [Returns 1 if combinational loop is detected.] SideEffects [] SeeAlso [] ***********************************************************************/ int Aig_ManCheckAcyclic_rec( Aig_Man_t * p, Aig_Obj_t * pNode, int fVerbose ) { Aig_Obj_t * pFanin; int fAcyclic; if ( Aig_ObjIsCi(pNode) || Aig_ObjIsConst1(pNode) ) return 1; assert( Aig_ObjIsNode(pNode) ); // make sure the node is not visited assert( !Aig_ObjIsTravIdPrevious(p, pNode) ); // check if the node is part of the combinational loop if ( Aig_ObjIsTravIdCurrent(p, pNode) ) { if ( fVerbose ) Abc_Print( 1, "Network \"%s\" contains combinational loop!\n", p->pSpec? p->pSpec : NULL ); if ( fVerbose ) Abc_Print( 1, "Node \"%d\" is encountered twice on the following path to the COs:\n", Aig_ObjId(pNode) ); return 0; } // mark this node as a node on the current path Aig_ObjSetTravIdCurrent( p, pNode ); // visit the transitive fanin pFanin = Aig_ObjFanin0(pNode); // check if the fanin is visited if ( !Aig_ObjIsTravIdPrevious(p, pFanin) ) { // traverse the fanin's cone searching for the loop if ( !(fAcyclic = Aig_ManCheckAcyclic_rec(p, pFanin, fVerbose)) ) { // return as soon as the loop is detected if ( fVerbose ) Abc_Print( 1, " %d ->", Aig_ObjId(pFanin) ); return 0; } } // visit the transitive fanin pFanin = Aig_ObjFanin1(pNode); // check if the fanin is visited if ( !Aig_ObjIsTravIdPrevious(p, pFanin) ) { // traverse the fanin's cone searching for the loop if ( !(fAcyclic = Aig_ManCheckAcyclic_rec(p, pFanin, fVerbose)) ) { // return as soon as the loop is detected if ( fVerbose ) Abc_Print( 1, " %d ->", Aig_ObjId(pFanin) ); return 0; } } // visit choices if ( Aig_ObjRepr(p, pNode) == NULL && Aig_ObjEquiv(p, pNode) != NULL ) { for ( pFanin = Aig_ObjEquiv(p, pNode); pFanin; pFanin = Aig_ObjEquiv(p, pFanin) ) { // check if the fanin is visited if ( Aig_ObjIsTravIdPrevious(p, pFanin) ) continue; // traverse the fanin's cone searching for the loop if ( (fAcyclic = Aig_ManCheckAcyclic_rec(p, pFanin, fVerbose)) ) continue; // return as soon as the loop is detected if ( fVerbose ) Abc_Print( 1, " %d", Aig_ObjId(pFanin) ); if ( fVerbose ) Abc_Print( 1, " (choice of %d) -> ", Aig_ObjId(pNode) ); return 0; } } // mark this node as a visited node Aig_ObjSetTravIdPrevious( p, pNode ); return 1; } int Aig_ManCheckAcyclic( Aig_Man_t * p, int fVerbose ) { Aig_Obj_t * pNode; int fAcyclic; int i; // set the traversal ID for this DFS ordering Aig_ManIncrementTravId( p ); Aig_ManIncrementTravId( p ); // pNode->TravId == pNet->nTravIds means "pNode is on the path" // pNode->TravId == pNet->nTravIds - 1 means "pNode is visited but is not on the path" // pNode->TravId < pNet->nTravIds - 1 means "pNode is not visited" // traverse the network to detect cycles fAcyclic = 1; Aig_ManForEachCo( p, pNode, i ) { pNode = Aig_ObjFanin0(pNode); if ( Aig_ObjIsTravIdPrevious(p, pNode) ) continue; // traverse the output logic cone if ( (fAcyclic = Aig_ManCheckAcyclic_rec(p, pNode, fVerbose)) ) continue; // stop as soon as the first loop is detected if ( fVerbose ) Abc_Print( 1, " CO %d\n", i ); break; } return fAcyclic; } /**Function************************************************************* Synopsis [Returns 1 if the choice node of pRepr is in the TFI of pObj.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Dch_ObjCheckTfi_rec( Aig_Man_t * p, Aig_Obj_t * pObj ) { // check the trivial cases if ( pObj == NULL ) return 0; if ( Aig_ObjIsCi(pObj) ) return 0; if ( pObj->fMarkA ) return 1; // skip the visited node if ( Aig_ObjIsTravIdCurrent( p, pObj ) ) return 0; Aig_ObjSetTravIdCurrent( p, pObj ); // check the children if ( Dch_ObjCheckTfi_rec( p, Aig_ObjFanin0(pObj) ) ) return 1; if ( Dch_ObjCheckTfi_rec( p, Aig_ObjFanin1(pObj) ) ) return 1; // check equivalent nodes return Dch_ObjCheckTfi_rec( p, Aig_ObjEquiv(p, pObj) ); } int Dch_ObjCheckTfi( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pRepr ) { Aig_Obj_t * pTemp; int RetValue; assert( !Aig_IsComplement(pObj) ); assert( !Aig_IsComplement(pRepr) ); // mark nodes of the choice node for ( pTemp = pRepr; pTemp; pTemp = Aig_ObjEquiv(p, pTemp) ) pTemp->fMarkA = 1; // traverse the new node Aig_ManIncrementTravId( p ); RetValue = Dch_ObjCheckTfi_rec( p, pObj ); // unmark nodes of the choice node for ( pTemp = pRepr; pTemp; pTemp = Aig_ObjEquiv(p, pTemp) ) pTemp->fMarkA = 0; return RetValue; } /**Function************************************************************* Synopsis [Returns representatives of fanin in approapriate polarity.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline Aig_Obj_t * Aig_ObjGetRepr( Aig_Man_t * p, Aig_Obj_t * pObj ) { Aig_Obj_t * pRepr; if ( (pRepr = Aig_ObjRepr(p, Aig_Regular(pObj))) ) return Aig_NotCond( pRepr, Aig_Regular(pObj)->fPhase ^ pRepr->fPhase ^ Aig_IsComplement(pObj) ); return pObj; } static inline Aig_Obj_t * Aig_ObjChild0CopyRepr( Aig_Man_t * p, Aig_Obj_t * pObj ) { return Aig_ObjGetRepr( p, Aig_ObjChild0Copy(pObj) ); } static inline Aig_Obj_t * Aig_ObjChild1CopyRepr( Aig_Man_t * p, Aig_Obj_t * pObj ) { return Aig_ObjGetRepr( p, Aig_ObjChild1Copy(pObj) ); } /**Function************************************************************* Synopsis [Derives the AIG with choices from representatives.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Dch_DeriveChoiceAigNode( Aig_Man_t * pAigNew, Aig_Man_t * pAigOld, Aig_Obj_t * pObj, int fSkipRedSupps ) { Aig_Obj_t * pRepr, * pObjNew, * pReprNew; assert( !Aig_IsComplement(pObj) ); // get the representative pRepr = Aig_ObjRepr( pAigOld, pObj ); if ( pRepr != NULL && (Aig_ObjIsConst1(pRepr) || Aig_ObjIsCi(pRepr)) ) { assert( pRepr->pData != NULL ); pObj->pData = Aig_NotCond( (Aig_Obj_t *)pRepr->pData, pObj->fPhase ^ pRepr->fPhase ); return; } // get the new node pObjNew = Aig_And( pAigNew, Aig_ObjChild0CopyRepr(pAigNew, pObj), Aig_ObjChild1CopyRepr(pAigNew, pObj) ); // pObjNew = Aig_ObjGetRepr( pAigNew, pObjNew ); while ( 1 ) { Aig_Obj_t * pObjNew2 = pObjNew; pObjNew = Aig_ObjGetRepr( pAigNew, pObjNew2 ); if ( pObjNew == pObjNew2 ) break; } // assert( Aig_ObjRepr( pAigNew, pObjNew ) == NULL ); // assign the copy assert( pObj->pData == NULL ); pObj->pData = pObjNew; // skip those without reprs if ( pRepr == NULL ) return; assert( pRepr->Id < pObj->Id ); assert( Aig_ObjIsNode(pRepr) ); // get the corresponding new nodes pObjNew = Aig_Regular((Aig_Obj_t *)pObj->pData); pReprNew = Aig_Regular((Aig_Obj_t *)pRepr->pData); // skip earlier nodes if ( pReprNew->Id >= pObjNew->Id ) return; assert( pReprNew->Id < pObjNew->Id ); // set the representatives Aig_ObjSetRepr( pAigNew, pObjNew, pReprNew ); // skip used nodes if ( pObjNew->nRefs > 0 ) return; assert( pObjNew->nRefs == 0 ); // skip choices that can lead to combo loops if ( Dch_ObjCheckTfi( pAigNew, pObjNew, pReprNew ) ) return; // don't add choice if structural support of pObjNew and pReprNew differ if ( fSkipRedSupps && Dch_ObjCheckSuppRed(pAigNew, pObjNew, pReprNew) ) return; // add choice to the end of the list while ( pAigNew->pEquivs[pReprNew->Id] != NULL ) pReprNew = pAigNew->pEquivs[pReprNew->Id]; assert( pAigNew->pEquivs[pReprNew->Id] == NULL ); pAigNew->pEquivs[pReprNew->Id] = pObjNew; } Aig_Man_t * Dch_DeriveChoiceAigInt( Aig_Man_t * pAig, int fSkipRedSupps ) { Aig_Man_t * pChoices; Aig_Obj_t * pObj; int i; // start recording equivalences pChoices = Aig_ManStart( Aig_ManObjNumMax(pAig) ); pChoices->pEquivs = ABC_CALLOC( Aig_Obj_t *, Aig_ManObjNumMax(pAig) ); pChoices->pReprs = ABC_CALLOC( Aig_Obj_t *, Aig_ManObjNumMax(pAig) ); // map constants and PIs Aig_ManCleanData( pAig ); Aig_ManConst1(pAig)->pData = Aig_ManConst1(pChoices); Aig_ManForEachCi( pAig, pObj, i ) pObj->pData = Aig_ObjCreateCi( pChoices ); // construct choices for the internal nodes assert( pAig->pReprs != NULL ); Aig_ManForEachNode( pAig, pObj, i ) Dch_DeriveChoiceAigNode( pChoices, pAig, pObj, fSkipRedSupps ); Aig_ManForEachCo( pAig, pObj, i ) Aig_ObjCreateCo( pChoices, Aig_ObjChild0CopyRepr(pChoices, pObj) ); Aig_ManSetRegNum( pChoices, Aig_ManRegNum(pAig) ); return pChoices; } Aig_Man_t * Dch_DeriveChoiceAig( Aig_Man_t * pAig, int fSkipRedSupps ) { int fCheck = 0; Aig_Man_t * pChoices, * pTemp; // verify if ( fCheck ) Aig_ManCheckReprs( pAig ); // compute choices pChoices = Dch_DeriveChoiceAigInt( pAig, fSkipRedSupps ); ABC_FREE( pChoices->pReprs ); // verify if ( fCheck ) Dch_CheckChoices( pChoices, fSkipRedSupps ); // find correct topo order with choices pChoices = Aig_ManDupDfs( pTemp = pChoices ); Aig_ManStop( pTemp ); // verify if ( fCheck ) Dch_CheckChoices( pChoices, fSkipRedSupps ); return pChoices; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END