#127: madwifi-ng: 2.6.15 kernel panic: fatal exception in irq handler
----------------------------------+-----------------------------------------
      Reporter:  schorpp          |       Owner:  mrenzmann                     
      
          Type:  defect           |      Status:  new                           
      
      Priority:  critical         |   Milestone:  version 0.9.0 - move to new 
codebase
     Component:  madwifi: driver  |     Version:  trunk                         
      
    Resolution:                   |    Keywords:  panic                         
      
Patch_attached:  0                |  
----------------------------------+-----------------------------------------
Changes (by mrenzmann):

  * patch_attached:  => 0

Comment:

 The code that was posted above:
 {{{
 static void
  ath_uapsd_processtriggers(struct ath_softc *sc)
  {
          struct ath_hal *ah = sc->sc_ah;
          struct ath_buf *bf;
          struct ath_desc *ds;
          struct sk_buff *skb;
          struct ieee80211_node *ni;
          struct ath_node *an;
          struct ieee80211_qosframe *qwh;
          struct ath_txq *uapsd_xmit_q = sc->sc_uapsdq;
          struct ieee80211com *ic = &sc->sc_ic;
          int ac, retval;
          u_int8_t tid;
          u_int16_t frame_seq;
          u_int64_t tsf;
  #define PA2DESC(_sc, _pa) \
          ((struct ath_desc *)((caddr_t)(_sc)->sc_rxdma.dd_desc + \
                  ((_pa) - (_sc)->sc_rxdma.dd_desc_paddr)))

          /* XXXAPSD: build in check against max triggers we could see
           *          based on ic->ic_uapsdmaxtriggers.
           */
                          DPRINTF(sc, ATH_DEBUG_UAPSD, "%s: A\n",
 __func__);

          tsf = ath_hal_gettsf64(ah);
          ATH_RXBUF_LOCK(sc);
          if (sc->sc_rxbufcur == NULL)
                  sc->sc_rxbufcur = STAILQ_FIRST(&sc->sc_rxbuf);
          for (bf = sc->sc_rxbufcur; bf; bf = STAILQ_NEXT(bf, bf_list)) {
                  ds = bf->bf_desc;
                  if (ds->ds_link == bf->bf_daddr) {
                          /* NB: never process the self-linked entry at the
 end */
                          break;
                  }
                  if (bf->bf_status & ATH_BUFSTATUS_DONE) {
                          /*
                           * already processed this buffer (shouldn't occur
 if
                           * we change code to always process descriptors
 in
                           * rx intr handler - as opposed to sometimes
 processing
                           * in the rx tasklet).
                           */
                          continue;
                  }
                  skb = bf->bf_skb;
                  if (skb == NULL) {              /* XXX ??? can this
 happen */
                          printk("%s: no skbuff\n", __func__);
                          continue;
                  }

                  /*
                   * XXXAPSD: consider new hal call that does only the
 subset
                   *          of ath_hal_rxprocdesc we require for trigger
 search.
                   */

                  /*
                   * NB: descriptor memory doesn't need to be sync'd
                   *     due to the way it was allocated.
                   */

                  /*
                   * Must provide the virtual address of the current
                   * descriptor, the physical address, and the virtual
                   * address of the next descriptor in the h/w chain.
                   * This allows the HAL to look ahead to see if the
                   * hardware is done with a descriptor by checking the
                   * done bit in the following descriptor and the address
                   * of the current descriptor the DMA engine is working
                   * on.  All this is necessary because of our use of
                   * a self-linked list to avoid rx overruns.
                   */
                          DPRINTF(sc, ATH_DEBUG_UAPSD, "%s: B\n",
 __func__);
                  retval = ath_hal_rxprocdesc(ah, ds, bf->bf_daddr,
 PA2DESC(sc, ds->ds_link),tsf);
                  if (HAL_EINPROGRESS == retval)
                          break;
 }}}

-- 
Ticket URL: <http://madwifi.org/ticket/127>
MadWifi <http://madwifi.org/>
Multiband Atheros Driver for Wireless Fidelity

Reply via email to