svn commit: r253866 - head/sys/dev/iwn

hiren panchasara hiren at FreeBSD.org
Thu Aug 1 21:51:36 UTC 2013


On Thu, Aug 1, 2013 at 2:45 PM, Adrian Chadd <adrian at freebsd.org> wrote:
> Author: adrian
> Date: Thu Aug  1 21:45:30 2013
> New Revision: 253866
> URL: http://svnweb.freebsd.org/changeset/base/253866
>
> Log:
>   iwn(4) debugging improvements.
>
>   * Add in some new register debugging under IWN_DEBUG_REGISTER
>   * Make IWN_DEBUG an option now for building.  I'll chase this up
>     with a commit to 'options' soon.
>
>   Submitted by: Cedric GROSS <cg at cgross.info>
>
> Modified:
>   head/sys/dev/iwn/if_iwn.c
>   head/sys/dev/iwn/if_iwnreg.h
>
> Modified: head/sys/dev/iwn/if_iwn.c
> ==============================================================================
> --- head/sys/dev/iwn/if_iwn.c   Thu Aug  1 20:10:16 2013        (r253865)
> +++ head/sys/dev/iwn/if_iwn.c   Thu Aug  1 21:45:30 2013        (r253866)
> @@ -160,7 +160,9 @@ static void iwn5000_ict_reset(struct iwn
>  static int     iwn_read_eeprom(struct iwn_softc *,
>                     uint8_t macaddr[IEEE80211_ADDR_LEN]);
>  static void    iwn4965_read_eeprom(struct iwn_softc *);
> +#ifdef IWN_DEBUG
>  static void    iwn4965_print_power_group(struct iwn_softc *, int);
> +#endif
>  static void    iwn5000_read_eeprom(struct iwn_softc *);
>  static uint32_t        iwn_eeprom_channel_flags(struct iwn_eeprom_chan *);
>  static void    iwn_read_eeprom_band(struct iwn_softc *, int);
> @@ -320,9 +322,12 @@ static void        iwn_set_channel(struct ieee8
>  static void    iwn_scan_curchan(struct ieee80211_scan_state *, unsigned long);
>  static void    iwn_scan_mindwell(struct ieee80211_scan_state *);
>  static void    iwn_hw_reset(void *, int);
> +#ifdef IWN_DEBUG
> +static char    *iwn_get_csr_string(int);
> +static void    iwn_debug_register(struct iwn_softc *);
> +#endif
>
> -#define IWN_DEBUG
> -#ifdef IWN_DEBUG
> +#ifdef IWN_DEBUG
>  enum {
>         IWN_DEBUG_XMIT          = 0x00000001,   /* basic xmit operation */
>         IWN_DEBUG_RECV          = 0x00000002,   /* basic recv operation */
> @@ -339,6 +344,7 @@ enum {
>         IWN_DEBUG_CMD           = 0x00001000,   /* cmd submission */
>         IWN_DEBUG_TXRATE        = 0x00002000,   /* TX rate debugging */
>         IWN_DEBUG_PWRSAVE       = 0x00004000,   /* Power save operations */
> +       IWN_DEBUG_REGISTER      = 0x20000000,   /* print chipset register */
>         IWN_DEBUG_TRACE         = 0x40000000,   /* Print begin and start driver function */
>         IWN_DEBUG_FATAL         = 0x80000000,   /* fatal errors */
>         IWN_DEBUG_ANY           = 0xffffffff
> @@ -924,6 +930,8 @@ iwn_detach(device_t dev)
>         struct ieee80211com *ic;
>         int qid;
>
> +       DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
> +
>         if (ifp != NULL) {
>                 ic = ifp->if_l2com;
>
> @@ -961,7 +969,7 @@ iwn_detach(device_t dev)
>         if (ifp != NULL)
>                 if_free(ifp);
>
> -       DPRINTF(sc, IWN_DEBUG_TRACE, "->%s done\n", __func__);
> +       DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n", __func__);
>         IWN_LOCK_DESTROY(sc);
>         return 0;
>  }
> @@ -3202,8 +3210,6 @@ iwn_notif_intr(struct iwn_softc *sc)
>                 }
>                 case IWN_STATE_CHANGED:
>                 {
> -                       uint32_t *status = (uint32_t *)(desc + 1);
> -
>                         /*
>                          * State change allows hardware switch change to be
>                          * noted. However, we handle this in iwn_intr as we
> @@ -3211,32 +3217,37 @@ iwn_notif_intr(struct iwn_softc *sc)
>                          */
>                         bus_dmamap_sync(sc->rxq.data_dmat, data->map,
>                             BUS_DMASYNC_POSTREAD);
> +#ifdef IWN_DEBUG
> +                       uint32_t *status = (uint32_t *)(desc + 1);
>                         DPRINTF(sc, IWN_DEBUG_INTR, "state changed to %x\n",
>                             le32toh(*status));
> +#endif
>                         break;
>                 }
>                 case IWN_START_SCAN:
>                 {
> -                       struct iwn_start_scan *scan =
> -                           (struct iwn_start_scan *)(desc + 1);
> -
>                         bus_dmamap_sync(sc->rxq.data_dmat, data->map,
>                             BUS_DMASYNC_POSTREAD);
> +#ifdef IWN_DEBUG
> +                       struct iwn_start_scan *scan =
> +                           (struct iwn_start_scan *)(desc + 1);
>                         DPRINTF(sc, IWN_DEBUG_ANY,
>                             "%s: scanning channel %d status %x\n",
>                             __func__, scan->chan, le32toh(scan->status));
> +#endif
>                         break;
>                 }
>                 case IWN_STOP_SCAN:
>                 {
> -                       struct iwn_stop_scan *scan =
> -                           (struct iwn_stop_scan *)(desc + 1);
> -
>                         bus_dmamap_sync(sc->rxq.data_dmat, data->map,
>                             BUS_DMASYNC_POSTREAD);
> +#ifdef IWN_DEBUG
> +                       struct iwn_stop_scan *scan =
> +                           (struct iwn_stop_scan *)(desc + 1);
>                         DPRINTF(sc, IWN_DEBUG_STATE,
>                             "scan finished nchan=%d status=%d chan=%d\n",
>                             scan->nchan, scan->status, scan->chan);
> +#endif
>
>                         IWN_UNLOCK(sc);
>                         ieee80211_scan_next(vap);
> @@ -3416,6 +3427,9 @@ iwn_intr(void *arg)
>         if (r1 & (IWN_INT_SW_ERR | IWN_INT_HW_ERR)) {
>                 device_printf(sc->sc_dev, "%s: fatal firmware error\n",
>                     __func__);
> +#ifdef IWN_DEBUG
> +               iwn_debug_register(sc);
> +#endif
>                 /* Dump firmware error log and stop. */
>                 iwn_fatal_intr(sc);
>                 ifp->if_flags &= ~IFF_UP;
> @@ -7467,3 +7481,85 @@ iwn_hw_reset(void *arg0, int pending)
>         iwn_init(sc);
>         ieee80211_notify_radio(ic, 1);
>  }
> +#ifdef IWN_DEBUG
> +#define        IWN_DESC(x) case x:     return #x
> +#define        COUNTOF(array) (sizeof(array) / sizeof(array[0]))
> +
> +/*
> + * Transate CSR code to string
Minor typo you can fix in next commit:
s/Transate/Translate/

cheers,
Hiren
> + */
> +static char *iwn_get_csr_string(int csr)
> +{
> +       switch (csr) {
> +               IWN_DESC(IWN_HW_IF_CONFIG);
> +               IWN_DESC(IWN_INT_COALESCING);
> +               IWN_DESC(IWN_INT);
> +               IWN_DESC(IWN_INT_MASK);
> +               IWN_DESC(IWN_FH_INT);
> +               IWN_DESC(IWN_GPIO_IN);
> +               IWN_DESC(IWN_RESET);
> +               IWN_DESC(IWN_GP_CNTRL);
> +               IWN_DESC(IWN_HW_REV);
> +               IWN_DESC(IWN_EEPROM);
> +               IWN_DESC(IWN_EEPROM_GP);
> +               IWN_DESC(IWN_OTP_GP);
> +               IWN_DESC(IWN_GIO);
> +               IWN_DESC(IWN_GP_UCODE);
> +               IWN_DESC(IWN_GP_DRIVER);
> +               IWN_DESC(IWN_UCODE_GP1);
> +               IWN_DESC(IWN_UCODE_GP2);
> +               IWN_DESC(IWN_LED);
> +               IWN_DESC(IWN_DRAM_INT_TBL);
> +               IWN_DESC(IWN_GIO_CHICKEN);
> +               IWN_DESC(IWN_ANA_PLL);
> +               IWN_DESC(IWN_HW_REV_WA);
> +               IWN_DESC(IWN_DBG_HPET_MEM);
> +       default:
> +               return "UNKNOWN CSR";
> +       }
> +}
> +
> +/*
> + * This function print firmware register
> + */
> +static void
> +iwn_debug_register(struct iwn_softc *sc)
> +{
> +       int i;
> +       static const uint32_t csr_tbl[] = {
> +               IWN_HW_IF_CONFIG,
> +               IWN_INT_COALESCING,
> +               IWN_INT,
> +               IWN_INT_MASK,
> +               IWN_FH_INT,
> +               IWN_GPIO_IN,
> +               IWN_RESET,
> +               IWN_GP_CNTRL,
> +               IWN_HW_REV,
> +               IWN_EEPROM,
> +               IWN_EEPROM_GP,
> +               IWN_OTP_GP,
> +               IWN_GIO,
> +               IWN_GP_UCODE,
> +               IWN_GP_DRIVER,
> +               IWN_UCODE_GP1,
> +               IWN_UCODE_GP2,
> +               IWN_LED,
> +               IWN_DRAM_INT_TBL,
> +               IWN_GIO_CHICKEN,
> +               IWN_ANA_PLL,
> +               IWN_HW_REV_WA,
> +               IWN_DBG_HPET_MEM,
> +       };
> +       DPRINTF(sc, IWN_DEBUG_REGISTER,
> +           "CSR values: (2nd byte of IWN_INT_COALESCING is IWN_INT_PERIODIC)%s",
> +           "\n");
> +       for (i = 0; i <  COUNTOF(csr_tbl); i++){
> +               DPRINTF(sc, IWN_DEBUG_REGISTER,"  %10s: 0x%08x ",
> +                       iwn_get_csr_string(csr_tbl[i]), IWN_READ(sc, csr_tbl[i]));
> +               if ((i+1) % 3 == 0)
> +                       DPRINTF(sc, IWN_DEBUG_REGISTER,"%s","\n");
> +       }
> +       DPRINTF(sc, IWN_DEBUG_REGISTER,"%s","\n");
> +}
> +#endif
>
> Modified: head/sys/dev/iwn/if_iwnreg.h
> ==============================================================================
> --- head/sys/dev/iwn/if_iwnreg.h        Thu Aug  1 20:10:16 2013        (r253865)
> +++ head/sys/dev/iwn/if_iwnreg.h        Thu Aug  1 21:45:30 2013        (r253866)
> @@ -62,6 +62,7 @@
>  #define IWN_INT                        0x008
>  #define IWN_INT_MASK           0x00c
>  #define IWN_FH_INT             0x010
> +#define IWN_GPIO_IN            0x018   /* read external chip pins */
>  #define IWN_RESET              0x020
>  #define IWN_GP_CNTRL           0x024
>  #define IWN_HW_REV             0x028
> @@ -69,8 +70,12 @@
>  #define IWN_EEPROM_GP          0x030
>  #define IWN_OTP_GP             0x034
>  #define IWN_GIO                        0x03c
> +#define IWN_GP_UCODE           0x048
>  #define IWN_GP_DRIVER          0x050
> +#define IWN_UCODE_GP1          0x054
> +#define IWN_UCODE_GP1_SET      0x058
>  #define IWN_UCODE_GP1_CLR      0x05c
> +#define IWN_UCODE_GP2          0x060
>  #define IWN_LED                        0x094
>  #define IWN_DRAM_INT_TBL       0x0a0
>  #define IWN_SHADOW_REG_CTRL    0x0a8
> @@ -79,6 +84,7 @@
>  #define IWN_HW_REV_WA          0x22c
>  #define IWN_DBG_HPET_MEM       0x240
>  #define IWN_DBG_LINK_PWR_MGMT  0x250
> +/* Need nic_lock for use above */
>  #define IWN_MEM_RADDR          0x40c
>  #define IWN_MEM_WADDR          0x410
>  #define IWN_MEM_WDATA          0x418


More information about the svn-src-all mailing list